cairo: vendor as full-fork recipe (path=source, patches baked)

This commit is contained in:
2026-08-01 04:45:04 +03:00
parent ad41dde1fd
commit 934550f921
4929 changed files with 358502 additions and 3 deletions
+8 -3
View File
@@ -3,9 +3,14 @@ name = "cairo"
version = "1.18.4"
[source]
tar = "https://www.cairographics.org/releases/cairo-1.18.4.tar.xz"
blake3 = "b9fa14e02f85ec4e72396c62236c98502d04dbbdf8daf01ab9557a1c7aa7106e"
patches = ["redox.patch"]
# Vendored local fork (full-fork model): builds from the committed source/
# tree (offline, reproducible). source/ = pristine upstream + the patches below
# BAKED IN. .patch files kept tracked so a version bump can re-apply them via
# sync-recipe-source.sh.
# upstream: https://www.cairographics.org/releases/cairo-1.18.4.tar.xz
# blake3: b9fa14e02f85ec4e72396c62236c98502d04dbbdf8daf01ab9557a1c7aa7106e
# patch (baked): redox.patch
path = "source"
[build]
dependencies = [
Binary file not shown.
@@ -0,0 +1,41 @@
.deps
.libs
.perf
.idea
cairo-*.*.*
manual-*.*.*
ChangeLog*
Makefile
Makefile.in
aclocal.m4
autom4te.cache
confdefs.h
config.cache
config.h
config.h.in
config.status
configure
configure.scan
conftest.c
conftest.err
conftest.i
doltcompile
doltlibtool
gtk-doc.make
libtool
releases
stamp-h
stamp-h1
stamp-h.in
compile_commands.json
*~
.*.sw?
*.la
*.lo
*.log
*.orig
*.rej
*-uninstalled.pc
.vimrc
gtk-doc.m4
/builddir
@@ -0,0 +1,537 @@
# -*- indent-tabs-mode: nil -*-
include:
- template: 'Workflows/Branch-Pipelines.gitlab-ci.yml'
- project: 'freedesktop/ci-templates'
ref: '98b1218f146a1ec96d65e3ce0041f9a6ec5cb5e6'
file: '/templates/fedora.yml'
# From https://gitlab.freedesktop.org/freedesktop/ci-templates/-/blob/master/src/gitlab-ci.tmpl
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
when: never
- if: $CI_COMMIT_BRANCH
variables:
FDO_UPSTREAM_REPO: 'cairo/cairo'
FDO_DISTRIBUTION_VERSION: '40'
FDO_DISTRIBUTION_TAG: '2024-07-26-coverage.0'
# TODO: should probably get its own image at some point instead of reusing the GStreamer one
# See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/.gitlab-image-tags.yml for latest
# (This one is from the lastest stable branch since it's likely to stay around unchanged for longer)
WINDOWS_IMAGE: "registry.freedesktop.org/gstreamer/gstreamer/amd64/windows:2024-03-05.0-1.24"
DEFAULT_MESON_ARGS: >
--default-library=both
RUST_STABLE: "1.80.0"
RUSTUP_VERSION: "1.27.1"
stages:
- prep
- build
- test
- analysis
- deploy
# Global CI policy: This can be used to configure global behaviour our our jobs
default:
retry:
max: 2
when:
- 'runner_system_failure'
- 'stuck_or_timeout_failure'
- 'scheduler_failure'
- 'api_failure'
interruptible: true
.ccache_setup:
variables:
CCACHE_BASEDIR: "$CI_PROJECT_DIR"
CCACHE_DIR: "$CI_PROJECT_DIR/ccache"
CC: "ccache gcc"
CXX: "ccache g++"
before_script:
- mkdir -p ccache
- ccache --show-stats
cache:
# Each job will have it's own cache
key: "$CI_JOB_NAME"
paths:
- ccache/
fedora image:
extends:
- '.fdo.container-build@fedora'
stage: 'prep'
variables:
FDO_DISTRIBUTION_PACKAGES: >
meson
ninja-build
ccache
gcc
g++
zlib-devel
expat-devel
libpng-devel
fontconfig-devel
freetype-devel
libX11-devel
libXrender-devel
glib2-devel
librsvg2-devel
gtk2-devel
poppler-glib-devel
libspectre-devel
ghostscript
pixman-devel
systemd-devel
systemd-udev
expat-devel
which
diffutils
xorg-x11-server-Xvfb
dejavu-sans-fonts
dejavu-sans-mono-fonts
dejavu-serif-fonts
google-noto-emoji-color-fonts
google-noto-sans-vf-fonts
fonttools
util-linux
poppler-utils
clang
clang-analyzer
clang-tools-extra
compiler-rt
libasan
libubsan
llvm
wget
FDO_DISTRIBUTION_EXEC: >-
bash .gitlab-ci/install-rust.sh --rustup-version ${RUSTUP_VERSION} \
--stable ${RUST_STABLE} \
--arch x86_64-unknown-linux-gnu &&
bash .gitlab-ci/install-rust-tools.sh &&
bash .gitlab-ci/install-grcov.sh &&
rm -rf /root/.cargo /root/.cache # cleanup compilation dirs; binaries are installed now
.build fedora:
extends:
- '.fdo.distribution-image@fedora'
- '.ccache_setup'
stage: 'build'
variables:
MESON_ARGS: >
${DEFAULT_MESON_ARGS}
${EXTRA_MESON_ARGS}
--werror
CFLAGS: '-Wno-error=deprecated-declarations'
script:
- meson setup ${MESON_ARGS} builddir
- meson compile -C builddir
# Run test scripts
- mkdir builddir/src/.libs
- touch builddir/src/.libs/libfoo.so
# Run all the tests, except for the big test executable which
# gets run separately
- meson test -C builddir --no-suite=slow --print-errorlogs
- meson install -C builddir
artifacts:
expire_in: "7 days"
when: "always"
paths:
- "*"
fedora build shared:
extends:
- '.build fedora'
variables:
EXTRA_MESON_ARGS: '--default-library=shared'
fedora build static:
extends:
- '.build fedora'
variables:
EXTRA_MESON_ARGS: '--default-library=static'
fedora build clang:
extends:
- '.build fedora'
variables:
EXTRA_MESON_ARGS: '--default-library=shared'
script:
- export CC=clang
- meson setup ${MESON_ARGS} builddir
- meson compile -C builddir
.test fedora:
dependencies:
- 'fedora build shared'
needs:
- 'fedora build shared'
extends:
- '.fdo.distribution-image@fedora'
- '.ccache_setup'
stage: 'test'
artifacts:
when: 'always'
expire_in: "7 days"
paths:
- builddir/meson-logs/*
- builddir/test/*.log
- builddir/test/pdiff/*.log
- builddir/test/output
exclude:
- "builddir/test/**/*.cs"
- "builddir/test/**/*.trace"
fedora build check-refs.sh:
extends: '.test fedora'
script:
# Check for duplicate reference images
- ./test/check-refs.sh "$(pwd)/builddir/test/pdiff/perceptualdiff"
test fedora pdf:
extends: '.test fedora'
script:
- export CAIRO_TEST_IGNORE_pdf_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-pdf-argb32.txt)
- export CAIRO_TEST_IGNORE_pdf_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-pdf-rgb24.txt)
- export CAIRO_TEST_TARGET=pdf
- export srcdir=../../test
- (cd builddir/test && xvfb-run ./cairo-test-suite)
test fedora ps2:
extends: '.test fedora'
script:
- export CAIRO_TEST_IGNORE_ps2_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-ps2-argb32.txt)
- export CAIRO_TEST_IGNORE_ps2_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-ps2-rgb24.txt)
- export CAIRO_TEST_TARGET=ps2
- export CAIRO_TEST_UGLY_HACK_TO_IGNORE_PS_FAILURES=1
- export srcdir=../../test
- (cd builddir/test && xvfb-run ./cairo-test-suite)
test fedora ps3:
extends: '.test fedora'
script:
- export CAIRO_TEST_IGNORE_ps3_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-ps3-argb32.txt)
- export CAIRO_TEST_IGNORE_ps3_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-ps3-rgb24.txt)
- export CAIRO_TEST_TARGET=ps3
- export CAIRO_TEST_UGLY_HACK_TO_IGNORE_PS_FAILURES=1
- export srcdir=../../test
- (cd builddir/test && xvfb-run ./cairo-test-suite)
test fedora script:
extends: '.test fedora'
script:
- export CAIRO_TEST_UGLY_HACK_TO_SOMETIMES_IGNORE_SCRIPT_XCB_HUGE_IMAGE_SHM=1
- export CAIRO_TEST_IGNORE_script_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-script-argb32.txt)
- export CAIRO_TEST_TARGET=script
- export srcdir=../../test
- (cd builddir/test && xvfb-run ./cairo-test-suite)
test fedora image:
extends: '.test fedora'
script:
- export CAIRO_TEST_IGNORE_image_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-image-argb32.txt)
- export CAIRO_TEST_IGNORE_image_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-image-rgb24.txt)
- export CAIRO_TEST_IGNORE_image16_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-image16-rgb24.txt)
- export CAIRO_TEST_TARGET=image,image16
- export srcdir=../../test
- (cd builddir/test && xvfb-run ./cairo-test-suite)
test fedora recording:
extends: '.test fedora'
script:
- export CAIRO_TEST_IGNORE_recording_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-recording-argb32.txt)
- export CAIRO_TEST_IGNORE_recording_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-recording-rgb24.txt)
- export CAIRO_TEST_TARGET=recording
- export srcdir=../../test
- (cd builddir/test && xvfb-run ./cairo-test-suite)
test fedora svg:
extends: '.test fedora'
script:
- export CAIRO_TEST_IGNORE_svg11_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-svg11-argb32.txt)
- export CAIRO_TEST_IGNORE_svg11_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-svg11-rgb24.txt)
- export CAIRO_TEST_TARGET=svg11
- export CAIRO_BOILERPLATE_OPEN_NO_DAEMON=1
- export CAIRO_BOILERPLATE_DO_NOT_CRASH_ON_ANY2PPM_ERROR=1
- export ANY2PPM="timeout 3m ./any2ppm"
- ulimit -S -s 131072
- export srcdir=../../test
- (cd builddir/test && xvfb-run ./cairo-test-suite)
test fedora xcb:
extends: '.test fedora'
script:
- export CAIRO_TEST_IGNORE_xcb_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-xcb-argb32.txt)
- export CAIRO_TEST_IGNORE_xcb_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-xcb-rgb24.txt)
- export CAIRO_TEST_IGNORE_xcb_window_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-xcb-window-rgb24.txt)
- export CAIRO_TEST_IGNORE_xcb_window__rgb24=$(tr '\n' ',' < '.gitlab-ci/ignore-xcb-window&-rgb24.txt')
- export CAIRO_TEST_IGNORE_xcb_render_0_0_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-xcb-render-0-0-argb32.txt)
- export CAIRO_TEST_IGNORE_xcb_render_0_0_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-xcb-render-0-0-rgb24.txt)
- export CAIRO_TEST_IGNORE_xcb_fallback_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-xcb-fallback-rgb24.txt)
- export CAIRO_TEST_TARGET="xcb,xcb-window,xcb-window&,xcb-render-0_0,xcb-fallback"
- export srcdir=../../test
- (cd builddir/test && xvfb-run ./cairo-test-suite)
test fedora xlib:
extends: '.test fedora'
script:
- export CAIRO_TEST_IGNORE_xlib_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-xlib-argb32.txt)
- export CAIRO_TEST_IGNORE_xlib_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-xlib-rgb24.txt)
- export CAIRO_TEST_IGNORE_xlib_window_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-xlib-window-rgb24.txt)
- export CAIRO_TEST_IGNORE_xlib_render_0_0_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-xlib-render-0-0-rgb24.txt)
- export CAIRO_TEST_IGNORE_xlib_fallback_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-xlib-fallback-rgb24.txt)
- export CAIRO_TEST_TARGET="xlib,xlib-window,xlib-render-0_0,xlib-fallback"
- export srcdir=../../test
- (cd builddir/test && xvfb-run ./cairo-test-suite)
mingw-32 build:
extends:
- '.fdo.distribution-image@fedora'
stage: 'build'
before_script:
- dnf install -y 'dnf-command(builddep)'
- dnf builddep -y mingw32-cairo
- dnf install -y mingw32-gcc-c++
script:
- mkdir builddir
- cd builddir
# Test building with FreeType enabled and Fontconfig disabled
- mingw32-meson --default-library=both -Dfontconfig=disabled
- ninja install
artifacts:
expire_in: "7 days"
when: "always"
paths:
- 'builddir/meson-logs/'
mingw-64 build:
extends:
- '.fdo.distribution-image@fedora'
stage: 'build'
before_script:
- dnf install -y 'dnf-command(builddep)'
- dnf builddep -y mingw64-cairo
- dnf install -y mingw64-gcc-c++
script:
- mkdir builddir
- cd builddir
- mingw64-meson --default-library=both
- ninja install
artifacts:
expire_in: "7 days"
when: "always"
paths:
- 'builddir/meson-logs/'
# Based on https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/.gitlab-ci.yml (.build windows)
.build windows:
image: $WINDOWS_IMAGE
stage: 'build'
tags:
- 'docker'
- 'windows'
- '2022'
timeout: '30min'
variables:
MESON_ARGS: >
${DEFAULT_MESON_ARGS}
-Dfontconfig=enabled
-Dfreetype=enabled
-Dglib=enabled
-Dzlib=enabled
${EXTRA_MESON_ARGS}
before_script:
# Make sure meson is up to date, latest fontconfig requires a newer Meson than what's on the image
- pip3 install -U meson
script:
# Make sure powershell exists on errors
# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-6
- $ErrorActionPreference = "Stop"
# Copy GLib from existing subproject cache to avoid downloading it
# FIXME: no longer cached in GStreamer image, using tarball for now
#- cd $env:CI_PROJECT_DIR
#- cp -r C:/subprojects/glib subprojects/
# For some reason, options are separated by newline instead of space, so we
# have to replace them first.
- $env:MESON_ARGS = $env:MESON_ARGS.replace("`n"," ")
# Gitlab executes PowerShell in docker, but VsDevCmd.bat is a batch script.
# Environment variables substitutions is done by PowerShell before calling
# cmd.exe, that's why we use $env:FOO instead of %FOO%
- cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH &&
meson subprojects update --reset &&
meson build $env:MESON_ARGS &&
ninja -C build"
artifacts:
expire_in: "7 days"
when: "always"
paths:
- 'build/meson-logs/'
vs2019 shared amd64:
extends: '.build windows'
variables:
ARCH: 'amd64'
EXTRA_MESON_ARGS: '--default-library=shared'
vs2019 static amd64:
extends: '.build windows'
variables:
ARCH: 'amd64'
EXTRA_MESON_ARGS: '--default-library=static'
vs2019 shared x86:
extends: '.build windows'
variables:
ARCH: 'x86'
EXTRA_MESON_ARGS: '--default-library=shared'
android arm64 fedora:
# TODO: should probably build our own image here some day
# See https://gitlab.freedesktop.org/gstreamer/gstreamer/container_registry/7689 for current images
image: 'registry.freedesktop.org/gstreamer/gstreamer/amd64/android-fedora:2020-10-22.0-master'
stage: 'build'
artifacts:
name: "${CI_JOB_NAME}_${CI_COMMIT_SHA}"
expire_in: '5 days'
when: 'always'
paths:
- "build/meson-logs/*.txt"
before_script:
- dnf install -y python3-pip gcc ninja-build gperf
- pip3 install --user meson
script:
- export PATH="$HOME/.local/bin:$PATH"
- |
cat > android-cross-file.txt <<EOF
[constants]
ndk_path = '/android/ndk'
toolchain = ndk_path + '/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android'
api = '28'
[host_machine]
system = 'android'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'
[properties]
sys_root = ndk_path + '/sysroot'
c_link_args = ['-fuse-ld=gold']
cpp_link_args = ['-fuse-ld=gold']
[binaries]
c = toolchain + api + '-clang'
cpp = toolchain + api + '-clang++'
ar = toolchain + '-ar'
strip = toolchain + '-strip'
EOF
- meson setup --cross-file android-cross-file.txt -Dpixman:a64-neon=disabled build
- meson compile --verbose -C build
macOS x86 host:
tags:
- gst-macos-12.3
stage: 'build'
artifacts:
when: 'always'
expire_in: "7 days"
paths:
- build/meson-logs/*.txt
- build/meson-private/*.pc
- build/test/*.log
- build/test/pdiff/*.log
- build/test/output
exclude:
- "build/test/**/*.cs"
- "build/test/**/*.trace"
before_script:
# Install the DejaVu fonts
- curl -LO https://downloads.sourceforge.net/dejavu/dejavu-fonts-ttf-2.37.zip
- unzip dejavu-fonts-ttf-2.37.zip
- cp dejavu-fonts-ttf-2.37/ttf/*.ttf /Library/Fonts
# Update pip
- pip3 install --upgrade pip
# Make sure meson is up to date
- pip3 install -U meson
# Need to install certificates for Python
- pip3 install --upgrade certifi
# Anther way to install certificates
- open /Applications/Python\ 3.8/Install\ Certificates.command
# Get ninja
- pip3 install -U ninja
script:
- CERT_PATH=$(python3 -m certifi) && export SSL_CERT_FILE=${CERT_PATH} && export REQUESTS_CA_BUNDLE=${CERT_PATH}
# pixman region-test fails to link on macOS
- meson setup -Dpixman:tests=disabled build
- meson compile --verbose -C build
# Test cairo-quartz. Other backends should be covered by other jobs
- export CAIRO_TEST_IGNORE_quartz_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-quartz-argb32.txt)
- export CAIRO_TEST_IGNORE_quartz_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-quartz-rgb24.txt)
- export CAIRO_TEST_TARGET=quartz
- (cd build/test && srcdir=../../test ./cairo-test-suite)
# Run static analysis.
static-scan:
stage: 'analysis'
extends:
- '.fdo.distribution-image@fedora'
variables:
MESON_ARGS: >
--buildtype=debug
script:
- meson setup ${MESON_ARGS} _scan_build .
- ninja -C _scan_build scan-build
artifacts:
name: "cairo-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
when: always
paths:
- "_scan_build/meson-logs/scanbuild"
coverage:
stage: 'analysis'
extends:
- '.fdo.distribution-image@fedora'
needs:
- job: 'fedora image'
artifacts: false
script:
- source ./.gitlab-ci/env.sh
- bash -x ./.gitlab-ci/build-with-coverage.sh
- bash -x ./.gitlab-ci/gen-coverage.sh
coverage: '/Coverage: \d+\.\d+/'
artifacts:
name: "cairo-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
expire_in: 2 days
when: always
reports:
coverage_report:
coverage_format: cobertura
path: public/coverage.xml
paths:
- "_build/meson-logs"
- public
pages:
stage: 'deploy'
needs:
- job: coverage
script:
- mkdir -p public
- cp .gitlab-ci/pages-index.html public/index.html
artifacts:
paths:
- public
expire_in: 1 day
rules:
# Restrict to the main branch so not every branch tries to deploy the web site
- if: ($CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH)
@@ -0,0 +1,17 @@
#!/bin/sh
set -eux -o pipefail
export CFLAGS="-coverage -ftest-coverage -fprofile-arcs"
export CAIRO_TEST_IGNORE_image_argb32=$(tr '\n' ',' < .gitlab-ci/ignore-image-argb32.txt)
export CAIRO_TEST_IGNORE_image_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-image-rgb24.txt)
export CAIRO_TEST_IGNORE_image16_rgb24=$(tr '\n' ',' < .gitlab-ci/ignore-image16-rgb24.txt)
export CAIRO_TEST_TARGET=image,image16
meson setup --buildtype=debug _build .
meson compile -C _build
export srcdir=../../test
cd _build/test
xvfb-run ./cairo-test-suite
@@ -0,0 +1,2 @@
export RUSTUP_HOME='/usr/local/rustup'
export PATH=$PATH:/usr/local/cargo/bin
@@ -0,0 +1,14 @@
#!/bin/sh
set -eux -o pipefail
mkdir -p public
grcov _build --source-dir ./ --prefix-dir ../ --output-type cobertura --branch --ignore-not-existing -o public/coverage.xml
grcov _build --source-dir ./ --prefix-dir ../ --output-type html --branch --ignore-not-existing -o public/coverage
# Print "Coverage: 42.42" so .gitlab-ci.yml will pick it up with a regex
#
# We scrape this from the HTML report, not the JSON summary, because coverage.json
# uses no decimal places, just something like "42%".
grep -Eo 'abbr title.* %' public/coverage/index.html | head -n 1 | grep -Eo '[0-9.]+ %' | grep -Eo '[0-9.]+' | awk '{ print "Coverage:", $1 }'
@@ -0,0 +1,21 @@
clip-text
culled-glyphs
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
halo-transform
overlapping-glyphs
record1414x-select-font-face
record1414x-text-transform
show-glyphs-advance
subsurface
subsurface-scale
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
user-font-mask
@@ -0,0 +1,73 @@
a1-clip-fill-rule
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-361
bug-431
bug-source-cu
clip-device-offset
clip-fill-rule-pixel-aligned
clip-text
culled-glyphs
dash-zero-length
degenerate-path
device-offset
device-offset-positive
extended-blend-alpha-mask
fill-and-stroke
fill-empty
fill-missed-stop
finer-grained-fallbacks
ft-color-font
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo-transform
image-surface-source
linear-gradient-one-stop
mask-ctm
mask-surface-ctm
new-sub-path
nil-surface
overlapping-boxes
overlapping-glyphs
pass-through
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
radial-gradient-source
record1414x-select-font-face
record1414x-text-transform
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
rel-path
scale-source-surface-paint
set-source
shifted-operator
show-glyphs-advance
source-surface-scale-paint
subsurface
subsurface-outside-target
subsurface-scale
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
user-font-mask
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,283 @@
a1-bug
a1-clip-fill-rule
a1-tiger
aliasing
arc-direction
arc-looping-dash
big-empty-box
big-empty-triangle
big-line
big-little-box
bitmap-font
bug-84115
bug-bo-ricotz
bug-extents
bug-image-compositor
bug-seams
bug-source-cu
bug-spline
caps
caps-05
caps-2
caps-joins-2
caps-joins-alpha
caps-joins-curve
caps-tails-curve
clear-source
clip-device-offset
clip-disjoint
clip-disjoint-quad
clip-fill
clip-fill-eo-unbounded
clip-fill-nz-unbounded
clip-fill-rule-pixel-aligned
clip-image
clip-intersect
clip-operator
clip-push-group
clip-shape
clip-stroke
clip-stroke-unbounded
clip-text
clip-twice
close-path-current-point
copy-path
coverage-abutting
coverage-column-triangles
coverage-intersecting-quads
coverage-intersecting-triangles
coverage-rectangles
coverage-rhombus
coverage-row-triangles
coverage-triangles
culled-glyphs
dash-caps-joins
dash-curve
dash-scale
dash-state
dash-zero-length
degenerate-arc
degenerate-curve-to
degenerate-path
degenerate-pen
degenerate-rel-curve-to
device-offset
device-offset-positive
drunkard-tails
extended-blend
extended-blend-alpha
extended-blend-alpha-mask
extended-blend-mask
extended-blend-solid
extended-blend-solid-alpha
extend-pad-border
fallback
fill-alpha
fill-alpha-pattern
fill-and-stroke
fill-and-stroke-alpha
fill-and-stroke-alpha-add
fill-degenerate-sort-order
fill-empty
fill-image
fill-missed-stop
fill-rule
filter-bilinear-extents
finer-grained-fallbacks
font-matrix-translation
ft-show-glyphs-positioning
ft-show-glyphs-table
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
glyph-cache-pressure
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
group-unaligned
halo
halo-transform
hatchings
huge-linear
huge-radial
inverse-text
joins
joins-loop
joins-retrace
joins-star
large-font
large-twin-antialias-mixed
leaky-dashed-stroke
linear-gradient
linear-gradient-one-stop
linear-gradient-reflect
linear-gradient-subset
line-width-overlap-offset
line-width-scale
long-dashed-lines
mask
mask-alpha
mask-ctm
mask-surface-ctm
mask-transformed-image
mask-transformed-similar
mesh-pattern
mesh-pattern-conical
mesh-pattern-control-points
mesh-pattern-fold
mesh-pattern-overlap
mesh-pattern-transformed
new-sub-path
nil-surface
operator-source
over-around-source
overlapping-boxes
overlapping-dash-caps
overlapping-glyphs
paint-source-alpha
paint-with-alpha
paint-with-alpha-clip
paint-with-alpha-clip-mask
partial-coverage-reference
partial-coverage-three-quarter-reference
pass-through
path-append
path-stroke-twice
pdf-isolated-group
pixman-downscale-best-24
pixman-downscale-best-96
pixman-downscale-bilinear-96
pixman-downscale-fast-96
pixman-downscale-good-96
pixman-downscale-nearest-96
pixman-rotate
pthread-same-source
pthread-show-text
push-group
push-group-color
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
random-clip
random-intersections-curves-eo
random-intersections-curves-nz
random-intersections-eo
random-intersections-nonzero
raster-source
record1414x-fill-alpha
record1414x-paint-alpha
record1414x-paint-alpha-clip
record1414x-paint-alpha-clip-mask
record1414x-select-font-face
record1414x-text-transform
record2x-fill-alpha
record2x-paint-alpha
record2x-paint-alpha-clip
record2x-paint-alpha-clip-mask
record2x-select-font-face
record2x-text-transform
record90-fill-alpha
record90-paint-alpha
record90-paint-alpha-clip
record90-paint-alpha-clip-mask
record90-select-font-face
record90-text-transform
record-fill-alpha
recordflip-fill-alpha
recordflip-paint-alpha
recordflip-paint-alpha-clip
recordflip-paint-alpha-clip-mask
recordflip-select-font-face
recordflip-text-transform
recordflip-whole-fill-alpha
recordflip-whole-paint-alpha
recordflip-whole-paint-alpha-clip
recordflip-whole-paint-alpha-clip-mask
recordflip-whole-select-font-face
recordflip-whole-text-transform
recording-surface-extend-none
recording-surface-extend-reflect
recording-surface-extend-repeat
recording-surface-over
recording-surface-source
record-mesh
record-neg-extents-bounded
record-neg-extents-unbounded
record-paint-alpha
record-paint-alpha-clip
record-paint-alpha-clip-mask
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-text-transform
rectilinear-dash-scale-unaligned
reflected-stroke
rel-path
rotate-clip-image-surface-paint
rotated-clip
rounded-rectangle-fill
rounded-rectangle-stroke
scale-offset-image
scale-offset-similar
scale-source-surface-paint
select-font-face
set-source
shape-general-convex
shape-sierpinski
shifted-operator
show-glyphs-advance
show-text-current-point
simple-edge
smask
smask-fill
smask-mask
smask-paint
smask-stroke
smask-text
source-surface-scale-paint
spline-decomposition
stroke-ctm-caps
stroke-image
stroke-pattern
subsurface
subsurface-outside-target
subsurface-scale
surface-pattern
surface-pattern-operator
surface-pattern-scale-down
surface-pattern-scale-up
text-antialias-gray
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-glyph-range
text-pattern
text-rotate
text-transform
text-unhinted-metrics
thin-lines
tiger
tighten-bounds
transforms
trap-clip
twin
twin-antialias-gray
twin-antialias-mixed
twin-antialias-subpixel
unbounded-operator
unclosed-strokes
user-font
user-font-mask
user-font-proxy
user-font-rescale
world-map
world-map-fill
world-map-stroke
xcb-huge-image-shm
xcb-huge-subimage
xcomposite-projection
@@ -0,0 +1,49 @@
bug-image-compositor
clear-source
clip-operator
clip-text
culled-glyphs
extended-blend
extended-blend-solid
fallback
filter-bilinear-extents
filter-nearest-offset
filter-nearest-transformed
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
halo-transform
huge-linear
huge-radial
linear-gradient-reflect
mask
overlapping-glyphs
pixman-downscale-best-95
pixman-downscale-fast-95
pixman-downscale-nearest-95
pthread-same-source
pthread-show-text
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-one-stop
radial-gradient-source
record1414x-select-font-face
record1414x-text-transform
record2x-text-transform
record-replay-extend-reflect
rectilinear-dash
rectilinear-stroke
rotate-clip-image-surface-paint
rotate-image-surface-paint
show-glyphs-advance
smask-text
surface-pattern
surface-pattern-operator
surface-pattern-scale-down
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
twin
user-font-rescale
@@ -0,0 +1,88 @@
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-361
bug-image-compositor
clear-source
clip-device-offset
clip-fill-rule-pixel-aligned
clip-text
culled-glyphs
device-offset
device-offset-positive
extended-blend-alpha-mask
fill-empty
filter-bilinear-extents
filter-nearest-offset
filter-nearest-transformed
ft-color-font
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-zero-stops
gradient-zero-stops-mask
halo-transform
huge-linear
huge-radial
image-surface-source
linear-gradient-one-stop
linear-gradient-reflect
mask
mask-ctm
mask-surface-ctm
nil-surface
overlapping-boxes
overlapping-glyphs
pass-through
pdf-surface-source
pixman-downscale-best-95
pixman-downscale-fast-95
pixman-downscale-nearest-95
pixman-rotate
ps-surface-source
pthread-same-source
pthread-show-text
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-one-stop
radial-gradient-source
random-intersections-curves-eo
random-intersections-curves-nz
record1414x-paint-alpha
record1414x-paint-alpha-clip
record1414x-paint-alpha-clip-mask
record1414x-select-font-face
record1414x-text-transform
record2x-paint-alpha-clip-mask
record2x-select-font-face
record2x-text-transform
record90-paint-alpha-clip
record90-select-font-face
recordflip-select-font-face
recordflip-whole-select-font-face
recordflip-whole-self-intersecting
recordflip-whole-text-transform
record-paint-alpha-clip
record-replay-extend-pad
record-select-font-face
rectilinear-dash
rectilinear-stroke
rel-path
rotate-clip-image-surface-paint
rotate-image-surface-paint
set-source
show-glyphs-advance
smask-text
source-surface-scale-paint
surface-pattern
surface-pattern-scale-down
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
twin
user-font-rescale
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,207 @@
arc-direction
arc-looping-dash
bug-448
bug-51910
bug-bo-ricotz
bug-extents
bug-spline
caps
caps-05
caps-1
caps-2
caps-joins
caps-joins-05
caps-joins-1
caps-joins-2
caps-joins-curve
caps-sub-paths
caps-tails-curve
clear-source
clip-complex-bug61592
clip-disjoint
clip-fill
clip-fill-rule
clip-group-shapes-circles
clip-image
clip-nesting
clip-push-group
clip-rotate-image-surface-paint
clip-shape
clip-stroke
clip-text
clip-twice
clip-unbounded
close-path
close-path-current-point
copy-path
culled-glyphs
curve-to-as-line-to
dash-caps-joins
dash-curve
dash-infinite-loop
dash-no-dash
dash-offset
dash-offset-negative
dash-scale
dash-state
dash-zero-length
degenerate-arc
degenerate-curve-to
degenerate-dash
degenerate-path
degenerate-pen
degenerate-rel-curve-to
degenerate-solid-dash
drunkard-tails
extend-reflect
extend-reflect-similar
extended-blend
extended-blend-alpha-mask
extended-blend-solid
fallback
fill-and-stroke
fill-degenerate-sort-order
fill-image
fill-rule
filter-nearest-offset
finer-grained-fallbacks
font-matrix-translation
ft-color-font
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
group-unaligned
hairline
hairline-anisotropic
hairline-anisotropic-incorrect
hairline-big
hairline-scaled
halo
halo-transform
horizontal-clip
inverse-text
joins
joins-loop
joins-retrace
joins-star
large-font
leaky-dash
leaky-dashed-rectangle
leaky-dashed-stroke
leaky-polygon
line-width
line-width-large-overlap-dashed
line-width-overlap
line-width-overlap-dashed
line-width-overlap-flipped
line-width-overlap-flopped
line-width-overlap-offset
line-width-scale
line-width-tolerance
long-dashed-lines
miter-precision
new-sub-path
operator-www
over-above-source
over-around-source
over-below-source
over-between-source
overlapping-glyphs
path-append
path-stroke-twice
pixman-downscale-fast-95
pixman-downscale-nearest-95
pixman-rotate
pthread-same-source
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
random-clip
random-intersections-curves-eo
random-intersections-curves-nz
random-intersections-eo
random-intersections-nonzero
record-extend-reflect
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-self-intersecting
record-text-transform
record1414x-fill-alpha
record1414x-select-font-face
record1414x-self-intersecting
record1414x-text-transform
record2x-select-font-face
record2x-self-intersecting
record2x-text-transform
record90-select-font-face
record90-self-intersecting
record90-text-transform
recordflip-select-font-face
recordflip-self-intersecting
recordflip-text-transform
recordflip-whole-select-font-face
recordflip-whole-self-intersecting
recordflip-whole-text-transform
rectilinear-dash
rectilinear-dash-scale
rectilinear-dash-scale-unaligned
rectilinear-grid
rectilinear-miter-limit
rectilinear-stroke
reflected-stroke
rotate-clip-image-surface-paint
rotate-image-surface-paint
rotate-stroke-box
rotated-clip
round-join-bug-520-bevel
round-join-bug-520-round
rounded-rectangle-fill
rounded-rectangle-stroke
scale-offset-image
scale-offset-similar
self-copy-overlap
stroke-ctm-caps
stroke-clipped
stroke-image
stroke-open-box
select-font-face
self-copy-overlap
self-intersecting
shape-general-convex
shape-sierpinski
show-glyphs-advance
show-text-current-point
smask
smask-text
smp-glyph
spline-decomposition
stroke-clipped
stroke-ctm-caps
stroke-image
stroke-open-box
surface-pattern
surface-pattern-scale-down
surface-pattern-scale-down-extend-reflect
surface-pattern-scale-up
text-glyph-range
text-pattern
text-rotate
text-transform
text-unhinted-metrics
thin-lines
tiger
transforms
trap-clip
twin
unclosed-strokes
user-font
user-font-color
user-font-mask
user-font-proxy
user-font-rescale
user-font-subpixel
world-map
world-map-fill
world-map-stroke
@@ -0,0 +1,197 @@
arc-direction
arc-looping-dash
bug-361
bug-431
bug-448
bug-51910
bug-bo-ricotz
bug-extents
bug-spline
caps
caps-05
caps-1
caps-2
caps-joins
caps-joins-05
caps-joins-1
caps-joins-2
caps-joins-curve
caps-sub-paths
caps-tails-curve
clear-source
clip-complex-bug61592
clip-fill
clip-fill-rule
clip-group-shapes-circles
clip-image
clip-nesting
clip-push-group
clip-rotate-image-surface-paint
clip-shape
clip-stroke
clip-text
clip-twice
close-path
close-path-current-point
copy-path
culled-glyphs
curve-to-as-line-to
dash-caps-joins
dash-curve
dash-infinite-loop
dash-no-dash
dash-offset
dash-offset-negative
dash-scale
dash-state
dash-zero-length
degenerate-arc
degenerate-curve-to
degenerate-dash
degenerate-path
degenerate-pen
degenerate-rel-curve-to
degenerate-solid-dash
drunkard-tails
extend-reflect
extend-reflect-similar
extended-blend-alpha-mask
fill-and-stroke
fill-degenerate-sort-order
fill-image
fill-rule
filter-nearest-offset
font-matrix-translation
ft-color-font
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-constant-alpha
gradient-zero-stops
group-unaligned
hairline
hairline-anisotropic
hairline-anisotropic-incorrect
hairline-big
hairline-scaled
halo
halo-transform
horizontal-clip
image-surface-source
inverse-text
joins
joins-loop
joins-retrace
joins-star
large-font
leaky-dash
leaky-dashed-rectangle
leaky-dashed-stroke
leaky-polygon
line-width
line-width-large-overlap-dashed
line-width-overlap
line-width-overlap-dashed
line-width-overlap-flipped
line-width-overlap-flopped
line-width-overlap-offset
line-width-scale
line-width-tolerance
long-dashed-lines
miter-precision
new-sub-path
overlapping-glyphs
path-append
path-stroke-twice
pdf-surface-source
pixman-downscale-fast-95
pixman-downscale-nearest-95
pixman-rotate
ps-surface-source
pthread-same-source
radial-gradient-source
random-intersections-curves-eo
random-intersections-curves-nz
random-intersections-eo
random-intersections-nonzero
record-extend-reflect
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-self-intersecting
record-text-transform
record1414x-fill-alpha
record1414x-select-font-face
record1414x-self-intersecting
record1414x-text-transform
record2x-select-font-face
record2x-self-intersecting
record2x-text-transform
record90-select-font-face
record90-self-intersecting
record90-text-transform
recordflip-select-font-face
recordflip-self-intersecting
recordflip-text-transform
recordflip-whole-select-font-face
recordflip-whole-self-intersecting
recordflip-whole-text-transform
rectilinear-dash
rectilinear-dash-scale
rectilinear-dash-scale-unaligned
rectilinear-grid
rectilinear-miter-limit
rectilinear-stroke
reflected-stroke
rel-path
rotate-clip-image-surface-paint
rotate-image-surface-paint
rotate-stroke-box
round-join-bug-520-bevel
round-join-bug-520-round
rounded-rectangle-fill
rounded-rectangle-stroke
scale-offset-image
scale-offset-similar
scale-source-surface-paint
select-font-face
self-intersecting
set-source
shape-general-convex
shape-sierpinski
show-glyphs-advance
show-text-current-point
smask
smask-text
smp-glyph
source-surface-scale-paint
spline-decomposition
stroke-clipped
stroke-ctm-caps
stroke-image
stroke-open-box
surface-pattern
surface-pattern-scale-down
surface-pattern-scale-down-extend-reflect
surface-pattern-scale-up
text-glyph-range
text-pattern
text-rotate
text-transform
text-unhinted-metrics
thin-lines
tiger
transforms
twin
unclosed-strokes
user-font
user-font-mask
user-font-proxy
user-font-rescale
user-font-subpixel
world-map
world-map-fill
world-map-stroke
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,216 @@
arc-direction
arc-looping-dash
bug-448
bug-51910
bug-bo-ricotz
bug-extents
bug-image-compositor
bug-spline
caps
caps-05
caps-1
caps-2
caps-joins
caps-joins-05
caps-joins-1
caps-joins-2
caps-joins-curve
caps-sub-paths
caps-tails-curve
clear-source
clip-complex-bug61592
clip-disjoint
clip-fill
clip-fill-rule
clip-group-shapes-circles
clip-image
clip-nesting
clip-push-group
clip-rotate-image-surface-paint
clip-shape
clip-stroke
clip-text
clip-twice
clip-unbounded
close-path
close-path-current-point
copy-path
culled-glyphs
curve-to-as-line-to
dash-caps-joins
dash-curve
dash-infinite-loop
dash-no-dash
dash-offset
dash-offset-negative
dash-scale
dash-state
dash-zero-length
degenerate-arc
degenerate-curve-to
degenerate-dash
degenerate-path
degenerate-pen
degenerate-rel-curve-to
degenerate-solid-dash
drunkard-tails
extend-reflect
extend-reflect-similar
extended-blend
extended-blend-alpha-mask
extended-blend-solid
fallback
fill-and-stroke
fill-degenerate-sort-order
fill-image
fill-rule
filter-nearest-offset
filter-nearest-transformed
finer-grained-fallbacks
font-matrix-translation
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-constant-alpha
group-unaligned
hairline
hairline-anisotropic
hairline-anisotropic-incorrect
hairline-big
hairline-scaled
halo
halo-transform
horizontal-clip
inverse-text
joins
joins-loop
joins-retrace
joins-star
large-font
leaky-dash
leaky-dashed-rectangle
leaky-dashed-stroke
leaky-polygon
line-width
line-width-large-overlap-dashed
line-width-overlap
line-width-overlap-dashed
line-width-overlap-flipped
line-width-overlap-flopped
line-width-overlap-offset
line-width-scale
line-width-tolerance
linear-gradient
linear-gradient-reflect
linear-gradient-subset
long-dashed-lines
mask-transformed-image
mesh-pattern-conical
mesh-pattern-control-points
mesh-pattern-fold
mesh-pattern-overlap
miter-precision
new-sub-path
operator-www
over-around-source
over-below-source
overlapping-glyphs
path-append
path-stroke-twice
pixman-downscale-fast-95
pixman-downscale-nearest-95
pixman-rotate
pthread-same-source
push-group-color
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-one-stop
random-clip
random-intersections-curves-eo
random-intersections-curves-nz
random-intersections-eo
random-intersections-nonzero
record-extend-reflect
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-self-intersecting
record-text-transform
record1414x-fill-alpha
record1414x-select-font-face
record1414x-self-intersecting
record1414x-text-transform
record2x-select-font-face
record2x-self-intersecting
record2x-text-transform
record90-select-font-face
record90-self-intersecting
record90-text-transform
recordflip-select-font-face
recordflip-self-intersecting
recordflip-text-transform
recordflip-whole-select-font-face
recordflip-whole-self-intersecting
recordflip-whole-text-transform
rectilinear-dash
rectilinear-dash-scale
rectilinear-dash-scale-unaligned
rectilinear-grid
rectilinear-miter-limit
rectilinear-stroke
reflected-stroke
rotate-clip-image-surface-paint
rotate-image-surface-paint
rotate-stroke-box
rotated-clip
round-join-bug-520-bevel
round-join-bug-520-round
rounded-rectangle-fill
rounded-rectangle-stroke
scale-offset-image
scale-offset-similar
self-copy-overlap
stroke-ctm-caps
stroke-clipped
stroke-image
stroke-open-box
select-font-face
self-copy-overlap
self-intersecting
shape-general-convex
shape-sierpinski
show-glyphs-advance
show-text-current-point
smask
smask-text
smp-glyph
spline-decomposition
stroke-clipped
stroke-ctm-caps
stroke-image
stroke-open-box
surface-pattern
surface-pattern-scale-down
surface-pattern-scale-down-extend-reflect
surface-pattern-scale-up
text-glyph-range
text-pattern
text-rotate
text-transform
text-unhinted-metrics
thin-lines
tiger
transforms
trap-clip
twin
unclosed-strokes
user-font
user-font-mask
user-font-proxy
user-font-rescale
user-font-subpixel
world-map
world-map-fill
world-map-stroke
@@ -0,0 +1,208 @@
arc-direction
arc-looping-dash
bug-361
bug-431
bug-448
bug-51910
bug-bo-ricotz
bug-extents
bug-image-compositor
bug-spline
caps
caps-05
caps-1
caps-2
caps-joins
caps-joins-05
caps-joins-1
caps-joins-2
caps-joins-curve
caps-sub-paths
caps-tails-curve
clear-source
clip-complex-bug61592
clip-fill
clip-fill-rule
clip-group-shapes-circles
clip-image
clip-nesting
clip-push-group
clip-rotate-image-surface-paint
clip-shape
clip-stroke
clip-text
clip-twice
close-path
close-path-current-point
copy-path
culled-glyphs
curve-to-as-line-to
dash-caps-joins
dash-curve
dash-infinite-loop
dash-no-dash
dash-offset
dash-offset-negative
dash-scale
dash-state
dash-zero-length
degenerate-arc
degenerate-curve-to
degenerate-dash
degenerate-path
degenerate-pen
degenerate-rel-curve-to
degenerate-solid-dash
drunkard-tails
extend-reflect
extend-reflect-similar
extended-blend-alpha-mask
fill-and-stroke
fill-degenerate-sort-order
fill-image
fill-rule
filter-nearest-offset
filter-nearest-transformed
font-matrix-translation
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-zero-stops
group-unaligned
hairline
hairline-anisotropic
hairline-anisotropic-incorrect
hairline-big
hairline-scaled
halo
halo-transform
horizontal-clip
image-surface-source
inverse-text
joins
joins-loop
joins-retrace
joins-star
large-font
leaky-dash
leaky-dashed-rectangle
leaky-dashed-stroke
leaky-polygon
line-width
line-width-large-overlap-dashed
line-width-overlap
line-width-overlap-dashed
line-width-overlap-flipped
line-width-overlap-flopped
line-width-overlap-offset
line-width-scale
line-width-tolerance
linear-gradient
linear-gradient-reflect
linear-gradient-subset
long-dashed-lines
mask-transformed-image
mesh-pattern-conical
mesh-pattern-control-points
mesh-pattern-fold
mesh-pattern-overlap
miter-precision
new-sub-path
overlapping-glyphs
path-append
path-stroke-twice
pdf-surface-source
pixman-downscale-fast-95
pixman-downscale-nearest-95
pixman-rotate
ps-surface-source
pthread-same-source
push-group-color
radial-gradient-one-stop
radial-gradient-source
random-intersections-curves-eo
random-intersections-curves-nz
random-intersections-eo
random-intersections-nonzero
record-extend-reflect
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-self-intersecting
record-text-transform
record1414x-fill-alpha
record1414x-select-font-face
record1414x-self-intersecting
record1414x-text-transform
record2x-select-font-face
record2x-self-intersecting
record2x-text-transform
record90-select-font-face
record90-self-intersecting
record90-text-transform
recordflip-select-font-face
recordflip-self-intersecting
recordflip-text-transform
recordflip-whole-select-font-face
recordflip-whole-self-intersecting
recordflip-whole-text-transform
rectilinear-dash
rectilinear-dash-scale
rectilinear-dash-scale-unaligned
rectilinear-grid
rectilinear-miter-limit
rectilinear-stroke
reflected-stroke
rel-path
rotate-clip-image-surface-paint
rotate-image-surface-paint
rotate-stroke-box
round-join-bug-520-bevel
round-join-bug-520-round
rounded-rectangle-fill
rounded-rectangle-stroke
scale-offset-image
scale-offset-similar
scale-source-surface-paint
select-font-face
self-intersecting
set-source
shape-general-convex
shape-sierpinski
show-glyphs-advance
show-text-current-point
smask
smask-text
smp-glyph
source-surface-scale-paint
spline-decomposition
stroke-clipped
stroke-ctm-caps
stroke-image
stroke-open-box
surface-pattern
surface-pattern-scale-down
surface-pattern-scale-down-extend-reflect
surface-pattern-scale-up
text-glyph-range
text-pattern
text-rotate
text-transform
text-unhinted-metrics
thin-lines
tiger
transforms
trap-clip
twin
unclosed-strokes
user-font
user-font-mask
user-font-proxy
user-font-rescale
user-font-subpixel
world-map
world-map-fill
world-map-stroke
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,52 @@
bug-361
bug-431
bug-image-compositor
clip-operator
coverage-rhombus
culled-glyphs
extended-blend-alpha
extended-blend-alpha-mask
extended-blend-mask
extended-blend-solid-alpha
fallback
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
operator-www
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
record1414x-select-font-face
record1414x-text-transform
record2x-paint-alpha-clip-mask
record2x-select-font-face
record2x-text-transform
record90-fill-alpha
record90-select-font-face
record90-text-transform
record-fill-alpha
recordflip-select-font-face
recordflip-text-transform
recordflip-whole-select-font-face
recordflip-whole-text-transform
record-mesh
record-neg-extents-bounded
record-paint-alpha-clip-mask
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-text-transform
simple-edge
subsurface
subsurface-outside-target
subsurface-scale
surface-pattern
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-unhinted-metrics
user-font-proxy
@@ -0,0 +1,83 @@
a1-clip-fill-rule
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-361
bug-431
bug-448
bug-image-compositor
bug-source-cu
clip-device-offset
clip-fill-rule-pixel-aligned
coverage-rhombus
culled-glyphs
device-offset
device-offset-positive
extended-blend-alpha-mask
extended-blend-mask
fill-and-stroke
fill-empty
fill-missed-stop
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
hatchings
image-surface-source
linear-gradient-one-stop
mask-ctm
mask-surface-ctm
nil-surface
operator-www
overlapping-boxes
pass-through
pdf-surface-source
ps-surface-source
quartz-surface-source
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
record1414x-select-font-face
record1414x-text-transform
record2x-paint-alpha-clip-mask
record2x-select-font-face
record2x-text-transform
record90-fill-alpha
record90-select-font-face
record90-text-transform
record-fill-alpha
recordflip-select-font-face
recordflip-text-transform
recordflip-whole-select-font-face
recordflip-whole-text-transform
record-mesh
record-neg-extents-bounded
record-neg-extents-unbounded
record-paint-alpha-clip-mask
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-text-transform
rel-path
scale-source-surface-paint
set-source
shifted-operator
simple-edge
source-surface-scale-paint
subsurface
subsurface-scale
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-unhinted-metrics
thin-lines
user-font-proxy
@@ -0,0 +1,35 @@
bug-source-cu
clear-source
clip-text
coverage-rectangles
culled-glyphs
finer-grained-fallbacks
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
halo-transform
overlapping-glyphs
pthread-same-source
record1414x-fill-alpha
record1414x-select-font-face
record1414x-text-transform
record2x-fill-alpha
record2x-paint-alpha-clip-mask
record2x-text-transform
recording-surface-extend-none
recording-surface-extend-reflect
recording-surface-extend-repeat
recording-surface-over
recording-surface-source
scale-offset-similar
show-glyphs-advance
subsurface
subsurface-scale
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
@@ -0,0 +1,85 @@
a1-clip-fill-rule
alpha-similar
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-361
bug-431
bug-source-cu
clear-source
clip-device-offset
clip-fill-rule-pixel-aligned
clip-text
coverage-rectangles
culled-glyphs
dash-zero-length
degenerate-path
device-offset
device-offset-positive
extended-blend-alpha-mask
fill-and-stroke
fill-empty
fill-missed-stop
finer-grained-fallbacks
ft-color-font
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo-transform
image-surface-source
linear-gradient-one-stop
mask-ctm
mask-surface-ctm
new-sub-path
nil-surface
overlapping-boxes
overlapping-glyphs
pass-through
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
pthread-same-source
radial-gradient-source
record1414x-fill-alpha
record1414x-select-font-face
record1414x-text-transform
record2x-fill-alpha
record2x-paint-alpha-clip-mask
record2x-text-transform
recording-surface-extend-none
recording-surface-extend-reflect
recording-surface-extend-repeat
recording-surface-over
recording-surface-source
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
rel-path
scale-offset-similar
scale-source-surface-paint
set-source
show-glyphs-advance
source-surface-scale-paint
subsurface
subsurface-outside-target
subsurface-scale
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,85 @@
a1-fill
bilevel-image
bitmap-font
clear-source
clip-device-offset
clip-text
composite-integer-translate-over-repeat
coverage-abutting
coverage-intersecting-triangles
coverage-rectangles
culled-glyphs
device-offset-scale
ft-show-glyphs-positioning
ft-text-antialias-none
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
halo-transform
image-surface-source
large-source
large-twin-antialias-mixed
leaky-dashed-rectangle
linear-gradient-reflect
map-all-to-image
map-bit-to-image
map-to-image-fill
negative-stride-image
overlapping-glyphs
paint-source-alpha
pdf-surface-source
ps-surface-source
pthread-show-text
push-group-color
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
record1414x-select-font-face
record1414x-text-transform
record2x-select-font-face
record2x-text-transform
record90-select-font-face
record90-text-transform
recordflip-select-font-face
recordflip-text-transform
recordflip-whole-select-font-face
recordflip-whole-text-transform
recording-surface-extend-none
recording-surface-extend-reflect
recording-surface-extend-repeat
recording-surface-over
recording-surface-source
record-neg-extents-bounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-text-transform
scale-offset-image
scale-offset-similar
show-glyphs-advance
smask
smask-text
stride-12-image
subsurface
subsurface-scale
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
twin
twin-antialias-gray
twin-antialias-mixed
twin-antialias-none
twin-antialias-subpixel
user-font
user-font-proxy
user-font-rescale
xcb-stress-cache
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,52 @@
alpha-similar
clear-source
clip-operator
clip-text
culled-glyphs
extended-blend-solid
extended-blend-solid-alpha
filter-bilinear-extents
filter-nearest-offset
filter-nearest-transformed
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
halo-transform
linear-gradient-reflect
operator-alpha-alpha
overlapping-glyphs
paint-source-alpha
paint-with-alpha
paint-with-alpha-clip
paint-with-alpha-clip-mask
record1414x-paint-alpha
record1414x-paint-alpha-clip
record1414x-paint-alpha-clip-mask
record1414x-select-font-face
record1414x-text-transform
record2x-paint-alpha
record2x-paint-alpha-clip
record2x-paint-alpha-clip-mask
record90-paint-alpha-clip
record90-paint-alpha-clip-mask
recordflip-paint-alpha
recordflip-paint-alpha-clip
recordflip-paint-alpha-clip-mask
recordflip-whole-paint-alpha
recordflip-whole-paint-alpha-clip
recordflip-whole-paint-alpha-clip-mask
record-paint-alpha
record-paint-alpha-clip
record-paint-alpha-clip-mask
scale-offset-image
scale-source-surface-paint
show-glyphs-advance
surface-pattern
surface-pattern-operator
surface-pattern-scale-up
text-pattern
text-rotate
text-unhinted-metrics
tighten-bounds
unbounded-operator
user-font-color
@@ -0,0 +1,109 @@
alpha-similar
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-361
bug-source-cu
clear-source
clip-device-offset
clip-fill-eo-unbounded
clip-fill-nz-unbounded
clip-fill-rule-pixel-aligned
clip-operator
clip-stroke-unbounded
clip-text
culled-glyphs
dash-zero-length
degenerate-path
device-offset
device-offset-positive
extended-blend-alpha-mask
extended-blend-solid
extended-blend-solid-alpha
fill-and-stroke
fill-empty
fill-missed-stop
filter-bilinear-extents
filter-nearest-offset
filter-nearest-transformed
finer-grained-fallbacks
ft-color-font
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo-transform
image-surface-source
linear-gradient-one-stop
linear-gradient-reflect
mask-ctm
mask-surface-ctm
new-sub-path
nil-surface
operator-alpha-alpha
operator-source
overlapping-boxes
overlapping-glyphs
paint-source-alpha
paint-with-alpha
paint-with-alpha-clip
paint-with-alpha-clip-mask
pass-through
pdf-surface-source
pixman-rotate
ps-surface-source
radial-gradient-mask-source
radial-gradient-source
record1414x-paint
record1414x-paint-alpha
record1414x-paint-alpha-clip
record1414x-paint-alpha-clip-mask
record1414x-paint-alpha-solid-clip
record1414x-select-font-face
record1414x-self-intersecting
record1414x-text-transform
record2x-paint-alpha
record2x-paint-alpha-clip
record2x-paint-alpha-clip-mask
record90-paint-alpha-clip
record90-paint-alpha-clip-mask
recordflip-paint-alpha
recordflip-paint-alpha-clip
recordflip-paint-alpha-clip-mask
recordflip-whole-paint-alpha
recordflip-whole-paint-alpha-clip
recordflip-whole-paint-alpha-clip-mask
recording-surface-extend-none
recording-surface-extend-reflect
recording-surface-over
recording-surface-source
record-neg-extents-bounded
record-neg-extents-unbounded
record-paint-alpha
record-paint-alpha-clip
record-paint-alpha-clip-mask
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
rel-path
scale-offset-image
scale-source-surface-paint
set-source
show-glyphs-advance
source-surface-scale-paint
surface-pattern
surface-pattern-operator
surface-pattern-scale-up
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
tighten-bounds
unbounded-operator
xcb-surface-source
xlib-surface-source
user-font-color
@@ -0,0 +1,56 @@
a1-tiger
bug-spline
clip-operator
coverage-column-triangles
coverage-intersecting-quads
coverage-intersecting-triangles
coverage-rectangles
coverage-rhombus
coverage-row-triangles
coverage-triangles
culled-glyphs
fill-image
ft-text-vertical-layout-type1
halo
halo-transform
hatchings
operator-source
overlapping-boxes
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
radial-outer-focus
random-clip
record1414x-fill-alpha
record1414x-self-intersecting
record2x-fill-alpha
record2x-paint-alpha-clip-mask
record90-paint-alpha-clip
record90-paint-alpha-solid-clip
record90-self-intersecting
recordflip-paint-alpha-clip-mask
recordflip-self-intersecting
recordflip-whole-fill-alpha
recordflip-whole-paint-alpha-clip-mask
recordflip-whole-self-intersecting
recording-surface-extend-pad
recording-surface-extend-repeat
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-self-intersecting
rotated-clip
simple-edge
stroke-clipped
stroke-image
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-rotate
tighten-bounds
twin-antialias-none
unantialiased-shapes
user-font
user-font-proxy
@@ -0,0 +1,71 @@
a1-clip-fill-rule
alpha-similar
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-361
bug-431
clip-device-offset
clip-fill-rule-pixel-aligned
clip-text
coverage-intersecting-triangles
culled-glyphs
dash-zero-length
degenerate-path
device-offset
device-offset-positive
extended-blend-alpha-mask
fill-and-stroke
fill-empty
fill-missed-stop
finer-grained-fallbacks
ft-color-font
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo-transform
image-surface-source
linear-gradient-one-stop
mask-ctm
mask-surface-ctm
new-sub-path
nil-surface
overlapping-boxes
overlapping-glyphs
pass-through
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
record1414x-select-font-face
record1414x-text-transform
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
rel-path
scale-source-surface-paint
set-source
show-glyphs-advance
source-surface-scale-paint
subsurface
subsurface-outside-target
subsurface-scale
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,30 @@
clip-disjoint-hatching
clip-fill-eo-unbounded
clip-fill-nz-unbounded
clip-operator
clip-polygons
clip-shape
clip-stroke-unbounded
clip-twice
coverage-intersecting-triangles
culled-glyphs
ft-text-vertical-layout-type1
hatchings
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
random-clip
record1414x-select-font-face
record1414x-text-transform
record-neg-extents-bounded
record-paint-alpha-solid-clip
record-replay-extend-reflect
record-replay-extend-repeat
rotated-clip
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
trap-clip
@@ -0,0 +1,78 @@
a1-clip-fill-rule
alpha-similar
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-361
bug-431
bug-source-cu
clip-device-offset
clip-disjoint-hatching
clip-fill-eo-unbounded
clip-fill-nz-unbounded
clip-fill-rule-pixel-aligned
clip-operator
clip-polygons
clip-shape
clip-stroke-unbounded
coverage-intersecting-triangles
culled-glyphs
dash-zero-length
degenerate-path
device-offset
device-offset-positive
extended-blend-alpha-mask
fill-and-stroke
fill-empty
fill-missed-stop
finer-grained-fallbacks
ft-color-font
ft-text-vertical-layout-type1
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
hatchings
image-surface-source
linear-gradient-one-stop
mask-ctm
mask-surface-ctm
new-sub-path
nil-surface
overlapping-boxes
overlapping-glyphs
pass-through
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
random-clip
record1414x-select-font-face
record1414x-text-transform
record-neg-extents-bounded
record-neg-extents-unbounded
record-paint-alpha-solid-clip
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
rel-path
rotated-clip
scale-source-surface-paint
set-source
source-surface-scale-paint
subsurface-outside-target
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
thin-lines
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,95 @@
a1-clip-fill-rule
a1-tiger
alpha-similar
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-431
bug-spline
clip-device-offset
clip-fill-rule-pixel-aligned
clip-operator
coverage-column-triangles
coverage-intersecting-quads
coverage-intersecting-triangles
coverage-rectangles
coverage-rhombus
coverage-row-triangles
coverage-triangles
culled-glyphs
device-offset
device-offset-positive
extended-blend-alpha-mask
fill-empty
fill-image
ft-color-font
ft-text-vertical-layout-type1
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo
halo-transform
hatchings
image-surface-source
linear-gradient-one-stop
mask-ctm
mask-surface-ctm
nil-surface
operator-source
overlapping-boxes
pass-through
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
radial-outer-focus
random-clip
record1414x-fill-alpha
record1414x-self-intersecting
record2x-fill-alpha
record2x-paint-alpha-clip-mask
record90-paint-alpha-clip
record90-paint-alpha-solid-clip
record90-self-intersecting
recordflip-paint-alpha-clip-mask
recordflip-self-intersecting
recordflip-whole-fill-alpha
recordflip-whole-paint-alpha-clip-mask
recordflip-whole-self-intersecting
recording-surface-extend-pad
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-self-intersecting
rotated-clip
scale-source-surface-paint
set-source
simple-edge
source-surface-scale-paint
stroke-clipped
stroke-image
subsurface-outside-target
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
thin-lines
tighten-bounds
twin-antialias-none
unantialiased-shapes
user-font
user-font-proxy
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,85 @@
a1-clip-fill-rule
alpha-similar
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-431
bug-spline
clip-device-offset
clip-fill-rule-pixel-aligned
clip-operator
coverage-column-triangles
coverage-intersecting-quads
coverage-intersecting-triangles
coverage-rectangles
coverage-row-triangles
coverage-triangles
culled-glyphs
device-offset
device-offset-positive
extended-blend-alpha-mask
fill-empty
fill-image
ft-color-font
ft-text-vertical-layout-type1
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo
halo-transform
image-surface-source
linear-gradient-one-stop
mask-ctm
mask-surface-ctm
nil-surface
operator-source
overlapping-boxes
pass-through
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
radial-outer-focus
record1414x-fill-alpha
record1414x-self-intersecting
record2x-fill-alpha
record2x-paint-alpha-clip-mask
record90-paint-alpha-clip
record90-paint-alpha-solid-clip
record90-self-intersecting
recordflip-paint-alpha-clip-mask
recordflip-self-intersecting
recordflip-whole-fill-alpha
recordflip-whole-paint-alpha-clip-mask
recordflip-whole-self-intersecting
recording-surface-extend-pad
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-self-intersecting
rotated-clip
scale-source-surface-paint
set-source
simple-edge
source-surface-scale-paint
stroke-clipped
stroke-image
subsurface-outside-target
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
thin-lines
tighten-bounds
twin-antialias-none
unantialiased-shapes
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,87 @@
a1-clip-fill-rule
alpha-similar
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-431
bug-spline
clip-device-offset
clip-fill-rule-pixel-aligned
clip-operator
coverage-column-triangles
coverage-intersecting-quads
coverage-intersecting-triangles
coverage-rectangles
coverage-row-triangles
coverage-triangles
culled-glyphs
device-offset
device-offset-positive
extended-blend-alpha-mask
fill-empty
fill-image
ft-color-font
ft-text-vertical-layout-type1
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo
halo-transform
image-surface-source
linear-gradient-one-stop
mask-ctm
mask-surface-ctm
nil-surface
operator-source
overlapping-boxes
pass-through
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
push-group
push-group-color
radial-outer-focus
record1414x-fill-alpha
record1414x-self-intersecting
record2x-fill-alpha
record2x-paint-alpha-clip-mask
record90-paint-alpha-clip
record90-paint-alpha-solid-clip
record90-self-intersecting
recordflip-paint-alpha-clip-mask
recordflip-self-intersecting
recordflip-whole-fill-alpha
recordflip-whole-paint-alpha-clip-mask
recordflip-whole-self-intersecting
recording-surface-extend-pad
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-self-intersecting
rotated-clip
scale-source-surface-paint
set-source
simple-edge
source-surface-scale-paint
stroke-clipped
stroke-image
subsurface-outside-target
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
thin-lines
tighten-bounds
twin-antialias-none
unantialiased-shapes
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,127 @@
aliasing
arc-looping-dash
bug-84115
bug-extents
bug-image-compositor
bug-spline
caps-joins-curve
clip-disjoint
clip-operator
clip-shape
clip-stroke
clip-stroke-unbounded
clip-text
close-path-current-point
coverage-column-triangles
coverage-rhombus
culled-glyphs
dash-caps-joins
dash-curve
dash-scale
degenerate-curve-to
degenerate-pen
degenerate-rel-curve-to
drunkard-tails
extended-blend-alpha-mask
fill-and-stroke
fill-and-stroke-alpha
fill-and-stroke-alpha-add
fill-image
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
halo
halo-transform
hatchings
joins
joins-loop
joins-retrace
large-twin-antialias-mixed
leaky-dashed-stroke
line-width-scale
line-width-tolerance
long-dashed-lines
new-sub-path
operator-source
overlapping-boxes
overlapping-dash-caps
overlapping-glyphs
path-stroke-twice
pthread-show-text
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
radial-outer-focus
random-clip
random-intersections-curves-eo
random-intersections-curves-nz
random-intersections-eo
random-intersections-nonzero
record1414x-fill-alpha
record1414x-select-font-face
record1414x-self-intersecting
record1414x-text-transform
record2x-fill-alpha
record2x-paint-alpha-clip-mask
record2x-select-font-face
record2x-text-transform
record90-paint-alpha-clip
record90-paint-alpha-solid-clip
record90-select-font-face
record90-self-intersecting
record90-text-transform
recordflip-paint-alpha-clip-mask
recordflip-select-font-face
recordflip-self-intersecting
recordflip-text-transform
recordflip-whole-fill-alpha
recordflip-whole-paint-alpha-clip-mask
recordflip-whole-select-font-face
recordflip-whole-self-intersecting
recordflip-whole-text-transform
recording-surface-extend-pad
recording-surface-extend-repeat
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-self-intersecting
record-text-transform
reflected-stroke
rel-path
rounded-rectangle-stroke
scale-offset-image
scale-offset-similar
shape-general-convex
shape-sierpinski
show-glyphs-advance
simple-edge
smask
smask-stroke
smask-text
spline-decomposition
stroke-clipped
stroke-image
stroke-pattern
subsurface
subsurface-scale
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
tighten-bounds
twin
twin-antialias-gray
twin-antialias-mixed
twin-antialias-none
twin-antialias-subpixel
unclosed-strokes
user-font
user-font-proxy
world-map
world-map-stroke
@@ -0,0 +1,87 @@
a1-clip-fill-rule
alpha-similar
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-361
bug-431
bug-seams
clip-device-offset
clip-fill-rule-pixel-aligned
clip-text
culled-glyphs
dash-zero-length
degenerate-path
device-offset
device-offset-positive
extended-blend-alpha-mask
fallback
fill-and-stroke
fill-empty
fill-missed-stop
finer-grained-fallbacks
ft-color-font
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo-transform
image-surface-source
large-twin-antialias-mixed
linear-gradient-one-stop
mask-ctm
mask-surface-ctm
new-sub-path
nil-surface
over-above-source
over-around-source
over-between-source
overlapping-boxes
overlapping-glyphs
pass-through
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
pthread-show-text
pthread-similar
push-group-color
record1414x-select-font-face
record1414x-text-transform
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
rel-path
scale-source-surface-paint
set-source
shifted-operator
show-glyphs-advance
smask
smask-text
source-surface-scale-paint
subsurface
subsurface-outside-target
subsurface-scale
surface-pattern-scale-down-extend-none
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
twin-antialias-gray
twin-antialias-mixed
twin-antialias-none
twin-antialias-subpixel
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,94 @@
a1-clip-fill-rule
alpha-similar
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-361
bug-431
bug-source-cu
clip-device-offset
clip-fill-rule-pixel-aligned
clip-operator
clipped-group
clip-text
coverage-intersecting-triangles
culled-glyphs
curve-to-as-line-to
degenerate-path
device-offset
device-offset-positive
extended-blend-alpha-mask
fill-and-stroke
fill-and-stroke-alpha
fill-and-stroke-alpha-add
fill-empty
fill-missed-stop
finer-grained-fallbacks
ft-color-font
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo-transform
horizontal-clip
image-surface-source
large-twin-antialias-mixed
leaky-polygon
linear-gradient-one-stop
mask
mask-ctm
mask-surface-ctm
new-sub-path
nil-surface
operator-clear
operator-source
overlapping-boxes
overlapping-glyphs
pass-through
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
pthread-show-text
radial-gradient-source
radial-outer-focus
record1414x-select-font-face
record1414x-text-transform
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
rectilinear-stroke
rel-path
scale-source-surface-paint
set-source
show-glyphs-advance
smask
smask-text
source-surface-scale-paint
subsurface
subsurface-outside-target
subsurface-scale
surface-pattern-operator
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
twin-antialias-gray
twin-antialias-mixed
twin-antialias-none
twin-antialias-subpixel
unbounded-operator
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,163 @@
a1-clip-fill-rule
aliasing
alpha-similar
arc-looping-dash
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-84115
bug-extents
bug-image-compositor
bug-spline
caps-joins-curve
clip-device-offset
clip-disjoint
clip-fill-rule-pixel-aligned
clip-operator
clip-shape
clip-stroke
clip-stroke-unbounded
clip-text
close-path-current-point
coverage-column-triangles
coverage-rhombus
culled-glyphs
dash-caps-joins
dash-curve
dash-scale
degenerate-curve-to
degenerate-pen
degenerate-rel-curve-to
device-offset
device-offset-positive
drunkard-tails
extended-blend-alpha-mask
fill-and-stroke
fill-and-stroke-alpha
fill-and-stroke-alpha-add
fill-empty
fill-image
ft-color-font
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo
halo-transform
hatchings
image-surface-source
joins
joins-loop
joins-retrace
large-twin-antialias-mixed
leaky-dashed-stroke
linear-gradient-one-stop
line-width-scale
line-width-tolerance
long-dashed-lines
mask-ctm
mask-surface-ctm
new-sub-path
nil-surface
operator-source
overlapping-boxes
overlapping-dash-caps
overlapping-glyphs
pass-through
path-stroke-twice
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
pthread-show-text
radial-gradient
radial-gradient-mask
radial-gradient-mask-source
radial-gradient-source
radial-outer-focus
random-clip
random-intersections-curves-eo
random-intersections-curves-nz
random-intersections-eo
random-intersections-nonzero
record1414x-fill-alpha
record1414x-select-font-face
record1414x-self-intersecting
record1414x-text-transform
record2x-fill-alpha
record2x-paint-alpha-clip-mask
record2x-select-font-face
record2x-text-transform
record90-paint-alpha-clip
record90-paint-alpha-solid-clip
record90-select-font-face
record90-self-intersecting
record90-text-transform
recordflip-paint-alpha-clip-mask
recordflip-select-font-face
recordflip-self-intersecting
recordflip-text-transform
recordflip-whole-fill-alpha
recordflip-whole-paint-alpha-clip-mask
recordflip-whole-select-font-face
recordflip-whole-self-intersecting
recordflip-whole-text-transform
recording-surface-extend-pad
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-self-intersecting
record-text-transform
reflected-stroke
rel-path
rounded-rectangle-stroke
scale-offset-image
scale-offset-similar
scale-source-surface-paint
set-source
shape-general-convex
shape-sierpinski
shifted-operator
show-glyphs-advance
simple-edge
smask
smask-stroke
smask-text
source-surface-scale-paint
spline-decomposition
stroke-clipped
stroke-image
stroke-pattern
subsurface
subsurface-outside-target
subsurface-scale
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
tighten-bounds
twin
twin-antialias-gray
twin-antialias-mixed
twin-antialias-none
twin-antialias-subpixel
unclosed-strokes
user-font
user-font-proxy
world-map
world-map-stroke
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,149 @@
a1-clip-fill-rule
aliasing
alpha-similar
arc-looping-dash
big-empty-box
big-empty-triangle
big-little-box
bitmap-font
bug-extents
bug-spline
caps-joins-curve
clip-device-offset
clip-disjoint
clip-fill-rule-pixel-aligned
clip-operator
clip-shape
clip-stroke
clip-stroke-unbounded
clip-text
close-path-current-point
coverage-column-triangles
coverage-intersecting-quads
coverage-intersecting-triangles
coverage-rectangles
coverage-row-triangles
coverage-triangles
culled-glyphs
dash-caps-joins
dash-scale
degenerate-curve-to
degenerate-pen
degenerate-rel-curve-to
device-offset
device-offset-positive
drunkard-tails
extended-blend-alpha-mask
fill-and-stroke
fill-and-stroke-alpha
fill-and-stroke-alpha-add
fill-empty
fill-image
ft-color-font
ft-show-glyphs-positioning
ft-text-vertical-layout-type1
ft-text-vertical-layout-type3
gradient-alpha
gradient-constant-alpha
gradient-zero-stops
gradient-zero-stops-mask
halo
halo-transform
image-surface-source
joins
joins-loop
joins-retrace
large-twin-antialias-mixed
leaky-dashed-stroke
linear-gradient-one-stop
line-width-scale
line-width-tolerance
long-dashed-lines
mask-ctm
mask-surface-ctm
new-sub-path
nil-surface
operator-source
overlapping-boxes
overlapping-dash-caps
overlapping-glyphs
pass-through
path-stroke-twice
pdf-surface-source
pixman-downscale-best-24
pixman-rotate
ps-surface-source
pthread-show-text
radial-outer-focus
record1414x-fill-alpha
record1414x-select-font-face
record1414x-self-intersecting
record1414x-text-transform
record2x-fill-alpha
record2x-paint-alpha-clip-mask
record2x-select-font-face
record2x-text-transform
record90-paint-alpha-clip
record90-paint-alpha-solid-clip
record90-select-font-face
record90-self-intersecting
record90-text-transform
recordflip-paint-alpha-clip-mask
recordflip-select-font-face
recordflip-self-intersecting
recordflip-text-transform
recordflip-whole-fill-alpha
recordflip-whole-paint-alpha-clip-mask
recordflip-whole-select-font-face
recordflip-whole-self-intersecting
recordflip-whole-text-transform
recording-surface-extend-pad
record-neg-extents-bounded
record-neg-extents-unbounded
record-replay-extend-none
record-replay-extend-pad
record-replay-extend-reflect
record-replay-extend-repeat
record-select-font-face
record-self-intersecting
record-text-transform
reflected-stroke
rel-path
rounded-rectangle-stroke
scale-offset-image
scale-offset-similar
scale-source-surface-paint
set-source
shape-general-convex
shifted-operator
show-glyphs-advance
simple-edge
smask
smask-stroke
smask-text
source-surface-scale-paint
spline-decomposition
stroke-clipped
stroke-image
stroke-pattern
subsurface
subsurface-outside-target
subsurface-scale
text-antialias-subpixel
text-antialias-subpixel-bgr
text-antialias-subpixel-rgb
text-antialias-subpixel-vbgr
text-antialias-subpixel-vrgb
text-pattern
text-rotate
text-unhinted-metrics
thin-lines
tighten-bounds
twin
twin-antialias-gray
twin-antialias-mixed
twin-antialias-none
twin-antialias-subpixel
unclosed-strokes
xcb-surface-source
xlib-surface-source
@@ -0,0 +1,8 @@
source ./.gitlab-ci/env.sh
set -eu
export CARGO_HOME='/usr/local/cargo'
# Coverage tools
cargo install grcov
rustup component add llvm-tools-preview
@@ -0,0 +1,11 @@
source ./.gitlab-ci/env.sh
set -eu
export CARGO_HOME='/usr/local/cargo'
rustup component add clippy
rustup component add rustfmt
# cargo install --force cargo-c
cargo install --version ^1.0 gitlab_clippy
cargo install --force cargo-deny
# cargo install --force cargo-outdated
@@ -0,0 +1,92 @@
#!/bin/bash
set -o errexit -o pipefail -o noclobber -o nounset
source ./.gitlab-ci/env.sh
export CARGO_HOME='/usr/local/cargo'
PARSED=$(getopt --options '' --longoptions 'rustup-version:,stable:,minimum:,nightly,arch:' --name "$0" -- "$@")
if [ $? -ne 0 ]; then
echo 'Terminating...' >&2
exit 1
fi
eval set -- "$PARSED"
unset PARSED
RUSTUP_VERSION=
STABLE=
MINIMUM=
NIGHTLY=
ARCH=
while true; do
case "$1" in
'--rustup-version')
RUSTUP_VERSION=$2
shift 2
;;
'--stable')
STABLE=$2
shift 2
;;
'--minimum')
MINIMUM=$2
shift 2
;;
'--nightly')
NIGHTLY=1
shift 1
;;
'--arch')
ARCH=$2
shift 2
;;
'--')
shift
break
;;
*)
echo "Programming error"
exit 3
;;
esac
done
if [ -z "$RUSTUP_VERSION" ]; then
echo "missing --rustup-version argument"
exit 1
fi
if [ -z "$STABLE" ]; then
echo "missing --stable argument, please pass the stable version of rustc you want"
exit 1
fi
if [ -z "$ARCH" ]; then
echo "missing --arch argument, please pass an architecture triple like x86_64-unknown-linux-gnu"
exit 1
fi
RUSTUP_URL=https://static.rust-lang.org/rustup/archive/$RUSTUP_VERSION/$ARCH/rustup-init
wget $RUSTUP_URL
chmod +x rustup-init
./rustup-init -y --no-modify-path --profile minimal --default-toolchain $STABLE
rm rustup-init
chmod -R a+w $RUSTUP_HOME $CARGO_HOME
if [ -n "$MINIMUM" ]; then
rustup toolchain install $MINIMUM
fi
if [ -n "$NIGHTLY" ]; then
rustup toolchain install nightly
fi
@@ -0,0 +1,13 @@
<html>
<head>
<title>Cairo's development pages</title>
</head>
<body>
<h1>Cairo's development pages</h1>
<ul>
<li><a href="coverage/">Test coverage report</a></li>
</ul>
</body>
</html>
@@ -0,0 +1 @@
cairo-1.18.4.tar.xz
+115
View File
@@ -0,0 +1,115 @@
Josh Aas <joshmoz@gmail.com> Memory leak fix for quartz backend
Daniel Amelang <dan@amelang.net> Many (magic) floating-point optimizations
Shawn T. Amundson <amundson@gtk.org> Build fix
Olivier Andrieu <oliv__a@users.sourceforge.net> PNG backend
Peter Dennis Bartok <peter@novonyx.com> Bug fix for clipping
Dave Beckett <dajobe@debian.org> Build fixes, Debian packaging
Kai-Uwe Behrmann <ku.b@gmx.de> SVG bug fixes
Christian Biesinger <cbiesinger@web.de> BeOS backend
Billy Biggs <vektor@dumbterm.net> Pixman code merge. Optimization. Fixes for subtle rendering bugs.
Hans Breuer <hans@breuer.org> win32 bug fixes, build fixes, and improvements
Brian Cameron <brian.cameron@sun.com> Flag bug in Sun's X server
Carlos Garcia Campos <carlosgc@gnome.org> libspectre integration into the test-suite
Andrea Canciani <ranma42@gmail.com> Bugs, quartz backend improvements and type 6/7 patterns.
Damien Carbery <damien.carbery@sun.com> Build fixes
Andrew Chant <andrew.chant@utoronto.ca> Adding const where needed
Steve Chaplin <stevech1097@yahoo.com.au> Bug fixes for PNG reading
Tomasz Cholewo <cholewo@ieee-cis.org> Bug fixes
Manu Cornet <manu@manucornet.net> SVG build fix
Frederic Crozat <fcrozat@mandriva.com> Fix test suite for OPD platforms (IA64 or PPC64)
Julien Danjou <julien@danjou.info> XCB fixes
Radek Doulík <rodo@novell.com> Bug report and test case
John Ehresman <jpe@wingide.com> Build fixes for win32
John Ellson <ellson@research.att.com> First font/glyph extents functions
Michael Emmel <mike.emmel@gmail.com> DirectFB backend
Miklós Erdélyi <erdelyim@gmail.com> Fix typo leading to a crash
Behdad Esfahbod <behdad@behdad.org> Huge piles of bug fixes, improvements, and general maintenance
Gilles Espinasse <g.esp@free.fr> Font related fixes
Larry Ewing <lewing@novell.com> Test case for group-clip
Brian Ewins <Brian.Ewins@gmail.com> ATSUI maintenance (first success at making it really work)
Bertram Felgenhauer <int-e@gmx.de> Fixes for subtle arithmetic errors
Damian Frank <damian.frank@gmail.com> Build system improvements for win32
Bdale Garbee <bdale@gag.com> Provided essential support for cairo architecture sessions
Jens Granseuer <jensgr@gmx.net> Fixes to generate proper compiler flags
Laxmi Harikumar <laxmi.harikumar@digital.com> Build fix
J. Ali Harlow <ali@avrc.city.ac.uk> win32 backend updates
Bryce Harrington <bryce@osg.samsung.com> Test cases, bug/typo fixes
Mathias Hasselmann <mathias.hasselmann@gmx.de> Significant reduction of calls to malloc
Richard Henderson <rth@twiddle.net> "slim" macros for better shared libraries
James Henstridge <james@daa.com.au> Build fixes related to freetype
Graydon Hoare <graydon@redhat.com> Support for non-render X server, first real text support
Thomas Hunger <info@teh-web.de> Initial version of cairo_in_stroke/fill
Thomas Jaeger <ThJaeger@gmail.com> Extended repeat modes for X
Björn Lindqvist <bjourne@gmail.com> Performance test cases
Kristian Høgsberg <krh@redhat.com> PDF backend, PS backend with meta-surfaces
Amaury Jacquot <sxpert@esitcom.org> Documentation review, application testing
Adrian Johnson <ajohnson@redneon.com> PDF backend improvement
Michael Johnson <ahze@ahze.net> Bug fix for pre-C99 compilers
Jonathon Jongsma <jonathon.jongsma@gmail.com> Fix documentation typos
Øyvind Kolås <pippin@freedesktop.org> OpenVG backend, Bug fixes. Better default values.
Martin Kretzschmar <martink@gnome.org> Arithmetic fix for 64-bit architectures
Mathieu Lacage <Mathieu.Lacage@sophia.inria.fr> several bug/typo fixes
Dominic Lachowicz <domlachowicz@gmail.com> PDF conformance fix, fix image surface to zero out contents
Alexander Larsson <alexl@redhat.com> Profiling and performance fixes.
Sylvestre Ledru <sylvestre@mozilla.com> Static analysis fixes.
Tor Lillqvist <tml@novell.com> win32 build fixes, build scripts
Jinghua Luo <sunmoon1997@gmail.com> Add bitmap glyph transformation, many freetype and glitz fixes
Luke-Jr <luke-jr@utopios.org> Build fix for cross-compiling
Kjartan Maraas <kmaraas@gnome.org> Several fixes for sparse, lots of debug help for multi-thread bugs
Nis Martensen <nis.martensen@web.de> Bug fix for sub paths
Jordi Mas <jordi@ximian.com> Bug fix for cairo_show_text
Nicholas Miell <nmiell@gmail.com> Fixes for linking bugs on AMD64
Eugeniy Meshcheryakov <eugen@debian.org> PS/PDF font subsetting improvements
Zakharov Mikhail <zmey20000@yahoo.com> Build fix for HP-UX
Christopher (Monty) Montgomery <xiphmont@gmail.com> Performance fix (subimage_copy), multi-thread testing
Tim Mooney <enchanter@users.sourceforge.net> Fix test suite to compile with Solaris compiler
Jeff Muizelaar <jeff@infidigm.net> Patient, painful, pixman code merge. Many fixes for intricacies of dashing.
Yevgen Muntyan <muntyan@tamu.edu> win32 build fix
Ravi Nanjundappa <nravi.n@samsung.com> Static analysis fixes, test cases, skia backend update/fixes
Declan Naughton <piratepenguin@gmail.com> Fix documentation typos
Peter Nilsson <c99pnn@cs.umu.se> Glitz backend
Henning Noren <henning.noren.402@student.lu.se> Fix memory leak
Geoff Norton <gnorton@customerdna.com> Build fixes
Robert O'Callahan <rocallahan@novell.com> Const-correctness fixes, several new API functions for completeness (and to help mozilla)
Ian Osgood <iano@quirkster.com> XCB backend maintenance
Benjamin Otte <otte@gnome.org> Refinements to cairo/perf timing, OpenGL backend fixups, random fixes
Mike Owens <etc@filespanker.com> Bug fixes
Emmanuel Pacaud <emmanuel.pacaud@lapp.in2p3.fr> SVG backend
Keith Packard <keithp@keithp.com> Original concept, polygon tessellation, dashing, font metrics rewrite
Stuart Parmenter <pavlov@pavlov.net> Original GDI+ backend, win32 fixes
Alfred Peng <alfred.peng@sun.com> Fixes for Sun compilers and for a memory leak
Christof Petig <christof@petig-baender.de> Build fixes related to freetype
Joonas Pihlaja <jpihlaja@cc.helsinki.fi> Huge improvements to the tessellator performance
Mart Raudsepp <leio@dustbite.net> Build fixes
David Reveman <davidr@novell.com> New pattern API, glitz backend
Calum Robinson <calumr@mac.com> Quartz backend
Pavel Roskin <proski@gnu.org> Several cleanups to eliminate warnings
Tim Rowley <tim.rowley@gmail.com> Quartz/ATSUI fixes, X server workarounds, win32 glyph path support, test case to expose gradient regression
Soeren Sandmann <sandmann@daimi.au.dk> Lots of MMX love for pixman compositing
Uli Schlachter <psychon@znc.in> Some more XCB fixes
Torsten Schönfeld <kaffeetisch@gmx.de> Build fixes
Jamey Sharp <jamey@minilop.net> Surface/font backend virtualization, XCB backend
Jason Dorje Short <jdorje@users.sf.net> Build fixes and bug fixes
Jeff Smith <whydoubt@yahoo.com> Fixes for intricacies of stroking code
Travis Spencer <tspencer@cs.pdx.edu> XCB backend fix
Bill Spitzak <spitzak@d2.com> Build fix to find Xrender.h without xrender.pc, downscaling support
Zhe Su <james.su@gmail.com> Add support for fontconfig's embeddedbitmap option
Owen Taylor <otaylor@redhat.com> Font rewrite, documentation, win32 backend
Pierre Tardy <tardyp@gmail.com> EGL support and testing, OpenVG backend
Karl Tomlinson <karlt+@karlt.net> Optimisation and obscure bug fixes (mozilla)
Alp Toker <alp@atoker.com> Fix several code/comment typos
Malcolm Tredinnick <malcolm@commsecure.com.au> Documentation fixes
David Turner <david@freetype.org> Optimize gradient calculations
Kalle Vahlman <kalle.vahlman@gmail.com> Allow perf reports to be compared across different platforms
Sasha Vasko <sasha@aftercode.net> Build fix to compile without xlib backend
Vladimir Vukicevic <vladimir@pobox.com> Quartz backend rewrite, win32/quartz maintenance
Jonathan Watt <jwatt@jwatt.org> win32 fixes
Peter Weilbacher <pmw@avila.aip.de> OS/2 backend
Dan Williams <dcbw@redhat.com> Implement MMX function to help OLPC
Chris Wilson <chris@chris-wilson.co.uk> Large-scale robustness improvements, (warn_unsed_result and malloc failure injection)
Carl Worth <cworth@isi.edu> Original library, support for paths, images
Richard D. Worth <richard@theworths.org> Build fixes for cygwin
Kent Worsnop <kworsnop@accesswave.ca> Fix PDF dashing bug
Dave Yeo <daveryeo@telus.net> Build fix for win32
(please let us know if we have missed anyone)
+84
View File
@@ -0,0 +1,84 @@
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) Gitlab 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:
https://gitlab.freedesktop.org/cairo/cairo/-/issues
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 gitlab. 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 gitlab 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:
https://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 gitlab. Others greatly prefer the
ability to check back on a specific bug entry in gitlab 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 gitlab
database. Another place to look for known bugs is the cairo ROADMAP:
https://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
@@ -0,0 +1,292 @@
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,_,.,-,>
* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*-
*/
TODO
----
Write rules for common editors to use this style. Also cleanup/unify
the modelines in the source files.
+33
View File
@@ -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.
@@ -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.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
@@ -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.]
+185
View File
@@ -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:
https://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:
https://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 gitlab bug tracking system available at:
https://gitlab.freedesktop.org/cairo/cairo/-/issues
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:
https://cairographics.org/download/
For more information on using git, see:
https://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:
https://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.
+47
View File
@@ -0,0 +1,47 @@
Installation Instructions
=========================
Requirements
------------
As well as the requirements listed in README, the meson build also requires:
meson (http://mesonbuild.com)
ninja (http://ninja-build.org)
Basic Installation
------------------
meson setup $builddir
ninja -C $builddir
ninja -C $builddir install
where $builddir is the name of the directory where the build artifacts
will be written to.
Some of the common options that can be used with "meson setup" include:
Set the install prefix.
--prefix=<path>
Set the build type. Some common build types include "debug" and "release"
--buildtype=<buildtype>
Compiler and linker flags can be set with the CFLAGS and LDFLAGS
environment variables.
Configuring cairo backends
--------------------------
After running "meson build", "meson configure" can be used to display
or modify the build configuration.
eg
Display configuration:
meson configure $builddir
Enable pdf and disable ps:
meson configure $builddir -Dpdf=enabled -Dps=disabled
The "-D" options can also be used with "meson setup"
Tests
-----
Refer to test/README
File diff suppressed because it is too large Load Diff
+176
View File
@@ -0,0 +1,176 @@
# Cairo: Multi-platform 2D graphics library
<https://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.
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 its website:
- <https://cairographics.org>
The latest versions of cairo can always be found at:
- <https://cairographics.org/download>
Documentation on using cairo and frequently-asked questions:
- <https://cairographics.org/documentation>
- <https://cairographics.org/FAQ>
Mailing lists for contacting cairo users and developers:
- <https://cairographics.org/lists>
Roadmap and unscheduled things to do, (please feel free to help out):
- https://cairographics.org/roadmap
- https://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):
- `dnf builddep cairo`
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](https://cairographics.org/releases) >= 0.30.0
#### PNG support (preferred)
- [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](https://freedesktop.org/Software/xlibs)
#### xlib-xrender backend
- [Xrender](https://freedesktop.org/Software/xlibs) >= 0.6
#### Quartz backend
- macOS >= 10.4 with Xcode >= 2.5
#### Windows backend
- Microsoft Windows Vista or newer.
#### XCB backend
- [XCB](https://xcb.freedesktop.org)
### Font backends (required)
#### freetype font backend
- [freetype](https://freetype.org) >= 2.1.9
- [fontconfig](https://www.freedesktop.org/wiki/Software/fontconfig/)
#### Quartz-font backend
- MacOS X >= 10.4 with Xcode >= 2.5
#### Windows GDI font backend
- Microsoft Windows 2000 or newer
#### Windows DirectWrite font backend
- Microsoft Windows 7 or newer
Compiling
---------
See the [`INSTALL`](./INSTALL) document for build instructions.
Licensing
---------
Cairo is released under the terms of either the GNU Lesser General Public
License version 2.1, or the terms of the Mozilla Public License version 1.1.
See the [`COPYING`](./COPYING) document for more information.
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`](./AUTHORS) document for as complete a list as we've been
able to compile so far.
@@ -0,0 +1,25 @@
TAGS
tags
Makefile
Makefile.in
Makefile.am.features
#Makefile.win32.features
*.lo
*.la
*.exe
*.manifest
*.o
*.gcda
*.gcno
*.obj
*.ilk
*.suo
*.lib
*.pdb
*.trs
*~
.*.sw?
check-link
cairo-boilerplate-constructors.c
cairo-boilerplate-constructors
make-cairo-boilerplate-constructors
@@ -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).
@@ -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
*/
@@ -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
*/
@@ -0,0 +1,288 @@
/* -*- 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_pdf_surface_set_metadata (surface, CAIRO_PDF_METADATA_CREATE_DATE, 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,
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;
if (ptc->target) {
/* 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 and scale 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. */
double x_offset, y_offset;
double x_scale, y_scale;
cairo_surface_get_device_offset (surface, &x_offset, &y_offset);
cairo_surface_get_device_scale (surface, &x_scale, &y_scale);
cairo_surface_set_device_offset (surface, 0, 0);
cairo_surface_set_device_scale (surface, 1, 1);
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);
cairo_surface_set_device_offset (surface, x_offset, y_offset);
cairo_surface_set_device_scale (surface, x_scale, y_scale);
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;
double x_offset, y_offset;
double x_scale, y_scale;
image = _cairo_boilerplate_pdf_convert_to_image (surface, page);
cairo_surface_get_device_offset (surface, &x_offset, &y_offset);
cairo_surface_get_device_scale (surface, &x_scale, &y_scale);
cairo_surface_set_device_offset (image, x_offset, y_offset);
cairo_surface_set_device_scale (image, x_scale, y_scale);
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
@@ -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_ */
@@ -0,0 +1,388 @@
/* -*- 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;
if (ptc->target) {
/* 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 and scale 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. */
double x_offset, y_offset;
double x_scale, y_scale;
cairo_surface_get_device_offset (surface, &x_offset, &y_offset);
cairo_surface_get_device_scale (surface, &x_scale, &y_scale);
cairo_surface_set_device_offset (surface, 0, 0);
cairo_surface_set_device_scale (surface, 1, 1);
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);
cairo_surface_set_device_offset (surface, x_offset, y_offset);
cairo_surface_set_device_scale (surface, x_scale, y_scale);
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",
ptc->width, ptc->height, filename,
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);
double x_offset, y_offset;
double x_scale, y_scale;
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);
}
cairo_surface_t *converted = cairo_boilerplate_get_image_surface_from_png (filename,
ptc->width,
ptc->height,
ptc->target == NULL);
remove (filename);
free (filename);
cairo_surface_t *image = cairo_image_surface_create(ptc->target ? CAIRO_FORMAT_RGB24 : CAIRO_FORMAT_ARGB32,
width,
height);
cairo_surface_get_device_offset (surface, &x_offset, &y_offset);
cairo_surface_get_device_scale (surface, &x_scale, &y_scale);
cairo_surface_set_device_offset (converted, x_offset, y_offset);
cairo_surface_set_device_scale (converted, x_scale, y_scale);
cairo_t *cr = cairo_create (image);
cairo_set_source_surface (cr, converted, 0, 0);
cairo_paint (cr);
cairo_destroy (cr);
cairo_surface_destroy (converted);
return image;
}
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
@@ -0,0 +1,152 @@
/* -*- 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-private.h>
#include <dlfcn.h>
#ifndef RTLD_DEFAULT
#define RTLD_DEFAULT ((void *) 0)
#endif
/*
* macOS Private functions
*/
typedef enum {
kCGContextTypeUnknown,
kCGContextTypePDF,
kCGContextTypePostScript,
kCGContextTypeWindow,
kCGContextTypeBitmap,
kCGContextTypeGL,
kCGContextTypeDisplayList,
kCGContextTypeKSeparation,
kCGContextTypeIOSurface,
kCGContextTypeCount
} CGContextType;
static unsigned int (*CGContextGetTypePtr) (CGContextRef) = NULL;
static void
quartz_ensure_symbols (void)
{
static cairo_bool_t symbol_lookup_done = FALSE;
if (!symbol_lookup_done) {
CGContextGetTypePtr = dlsym (RTLD_DEFAULT, "CGContextGetType");
symbol_lookup_done = TRUE;
}
}
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 bool
cg_context_is_bitmap (CGContextRef context)
{
quartz_ensure_symbols ();
if (likely (CGContextGetTypePtr)) {
return CGContextGetTypePtr (context) == kCGContextTypeBitmap;
}
return CGBitmapContextGetBitsPerPixel (context) != 0;
}
static cairo_status_t
_cairo_boilerplate_quartz_surface_to_png (cairo_surface_t *surface,
const char *dest)
{
CGContextRef context = cairo_quartz_surface_get_cg_context (surface);
if (!context || !cg_context_is_bitmap (context)) {
return CAIRO_STATUS_SURFACE_TYPE_MISMATCH;
}
CGImageRef image = CGBitmapContextCreateImage (context);
CFStringRef png_utti = CFSTR("public.png");
CFStringRef path;
CFURLRef url;
CGImageDestinationRef image_dest;
path = CFStringCreateWithCString (NULL, dest, kCFStringEncodingUTF8);
url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, FALSE);
image_dest = CGImageDestinationCreateWithURL (url, png_utti, 1, NULL);
CGImageDestinationAddImage (image_dest, image, NULL);
CGImageDestinationFinalize (image_dest);
CFRelease (url);
CFRelease (path);
CGImageRelease (image);
return CAIRO_STATUS_SUCCESS;
}
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_boilerplate_quartz_surface_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_boilerplate_quartz_surface_to_png,
NULL, NULL, NULL,
FALSE, FALSE, FALSE
},
};
CAIRO_BOILERPLATE (quartz, targets)
@@ -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
@@ -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)
@@ -0,0 +1,305 @@
/* -*- 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_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;
if (ptc->target) {
/* 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 and scale 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. */
double x_offset, y_offset;
double x_scale, y_scale;
cairo_surface_get_device_offset (surface, &x_offset, &y_offset);
cairo_surface_get_device_scale (surface, &x_scale, &y_scale);
cairo_surface_set_device_offset (surface, 0, 0);
cairo_surface_set_device_scale (surface, 1, 1);
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);
cairo_surface_set_device_offset (surface, x_offset, y_offset);
cairo_surface_set_device_scale (surface, x_scale, y_scale);
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;
double x_offset, y_offset;
double x_scale, y_scale;
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_get_device_offset (surface, &x_offset, &y_offset);
cairo_surface_get_device_scale (surface, &x_scale, &y_scale);
cairo_surface_set_device_offset (image, x_offset, y_offset);
cairo_surface_set_device_scale (image, x_scale, y_scale);
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);
if (ptc->target)
abstract_surface = ptc->target;
cairo_paginated_surface_t *paginated = (cairo_paginated_surface_t*) abstract_surface;
_cairo_svg_surface_set_force_fallbacks (paginated->target, 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
},
};
CAIRO_BOILERPLATE (svg, targets)
#else
CAIRO_NO_BOILERPLATE (svg)
#endif
@@ -0,0 +1,164 @@
/*
* 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>
*/
#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;
}
@@ -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
@@ -0,0 +1,460 @@
/* -*- 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-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)
@@ -0,0 +1,361 @@
/* -*- 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>
*/
#include "cairo-boilerplate-private.h"
#include "cairo-malloc-private.h"
#if CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE
#include <cairo-win32.h>
#include <cairo-paginated-surface-private.h>
#include <windows.h>
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 = _cairo_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
* coordinate 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)) {
fprintf (stderr, "%s:%s\n", "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;
if (ptc->target) {
/* 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 and scale 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. */
double x_offset, y_offset;
double x_scale, y_scale;
cairo_surface_get_device_offset (surface, &x_offset, &y_offset);
cairo_surface_get_device_scale (surface, &x_scale, &y_scale);
cairo_surface_set_device_offset (surface, 0, 0);
cairo_surface_set_device_scale (surface, 1, 1);
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_set_device_offset (surface, x_offset, y_offset);
cairo_surface_set_device_scale (surface, x_scale, y_scale);
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
@@ -0,0 +1,294 @@
/* -*- 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>
#include <errno.h>
#include <limits.h>
static const cairo_user_data_key_t win32_closure_key;
typedef struct _win32_target_closure {
HWND wnd;
HDC dc;
ATOM bpl_atom;
cairo_surface_t *surface;
} win32_target_closure_t;
static void
_cairo_boilerplate_win32_cleanup_window_surface (void *closure)
{
win32_target_closure_t *win32tc = closure;
if (win32tc != NULL)
{
if (win32tc->wnd != NULL &&
ReleaseDC (win32tc->wnd, win32tc->dc) != 1)
fprintf (stderr,
"Failed to release DC of a test window when cleaning up.\n");
if (win32tc->wnd != NULL &&
DestroyWindow (win32tc->wnd) == 0)
fprintf (stderr,
"Failed to destroy a test window when cleaning up, GLE is %lu.\n",
GetLastError ());
if (win32tc->bpl_atom != 0 &&
UnregisterClassA ((LPCSTR) MAKELPARAM (win32tc->bpl_atom, 0), GetModuleHandle (NULL)) == 0 &&
GetLastError () != ERROR_CLASS_DOES_NOT_EXIST)
fprintf (stderr,
"Failed to unregister boilerplate window class, GLE is %lu.\n",
GetLastError ());
free (win32tc);
}
}
static win32_target_closure_t *
_cairo_boilerplate_win32_create_window (int width,
int height)
{
WNDCLASSEXA wincl;
win32_target_closure_t *win32tc;
LPCSTR window_class_name;
ZeroMemory (&wincl, sizeof (WNDCLASSEXA));
wincl.cbSize = sizeof (WNDCLASSEXA);
wincl.hInstance = GetModuleHandle (0);
wincl.lpszClassName = "cairo_boilerplate_win32_dummy";
wincl.lpfnWndProc = DefWindowProcA;
wincl.style = CS_OWNDC;
win32tc = calloc (1, sizeof (win32_target_closure_t));
if (win32tc == NULL)
{
int error = errno;
fprintf (stderr, "Ran out of memory: %d.\n", error);
return NULL;
}
ZeroMemory (win32tc, sizeof (win32_target_closure_t));
win32tc->bpl_atom = RegisterClassExA (&wincl);
if (win32tc->bpl_atom == 0 && GetLastError () != ERROR_CLASS_ALREADY_EXISTS)
{
fprintf (stderr,
"Failed to register a boilerplate window class, GLE is %lu.\n",
GetLastError ());
_cairo_boilerplate_win32_cleanup_window_surface (win32tc);
return NULL;
}
if (win32tc->bpl_atom == 0)
window_class_name = wincl.lpszClassName;
else
window_class_name = (LPCSTR) MAKELPARAM (win32tc->bpl_atom, 0);
win32tc->wnd = CreateWindowExA (WS_EX_TOOLWINDOW,
window_class_name,
0,
WS_POPUP,
0,
0,
width,
height,
0,
0,
0,
0);
if (win32tc->wnd == NULL)
{
fprintf (stderr,
"Failed to create a test window, GLE is %lu.\n",
GetLastError ());
_cairo_boilerplate_win32_cleanup_window_surface (win32tc);
return NULL;
}
win32tc->dc = GetDC (win32tc->wnd);
if (win32tc->dc == NULL)
{
fprintf (stderr, "Failed to get test window DC.\n");
_cairo_boilerplate_win32_cleanup_window_surface (win32tc);
return NULL;
}
SetWindowPos (win32tc->wnd,
HWND_BOTTOM,
INT_MIN,
INT_MIN,
width,
height,
SWP_NOACTIVATE | SWP_SHOWWINDOW);
return win32tc;
}
static cairo_surface_t *
_cairo_boilerplate_win32_create_window_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 *win32tc;
cairo_surface_t *surface;
cairo_format_t format;
cairo_status_t status;
win32tc = _cairo_boilerplate_win32_create_window (width, height);
if (win32tc == NULL)
return NULL;
format = cairo_boilerplate_format_from_content (content);
surface = cairo_win32_surface_create_with_format (win32tc->dc, format);
win32tc->surface = surface;
status = cairo_surface_status (surface);
if (status != CAIRO_STATUS_SUCCESS)
{
fprintf (stderr,
"Failed to create the test surface: %s [%d].\n",
cairo_status_to_string (status), status);
_cairo_boilerplate_win32_cleanup_window_surface (win32tc);
return NULL;
}
status = cairo_surface_set_user_data (surface, &win32_closure_key, win32tc, NULL);
if (status != CAIRO_STATUS_SUCCESS)
{
fprintf (stderr,
"Failed to set surface userdata: %s [%d].\n",
cairo_status_to_string (status), status);
cairo_surface_destroy (surface);
_cairo_boilerplate_win32_cleanup_window_surface (win32tc);
return NULL;
}
*closure = win32tc;
return surface;
}
static cairo_surface_t *
_cairo_boilerplate_win32_create_dib_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_dib_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_dib_surface,
cairo_surface_create_similar,
NULL,
NULL,
_cairo_boilerplate_get_image_surface,
cairo_surface_write_to_png,
NULL,
NULL,
NULL,
FALSE, FALSE, FALSE
},
{
"win32-window-color", "win32", NULL, NULL,
CAIRO_SURFACE_TYPE_WIN32, CAIRO_CONTENT_COLOR, 1,
"cairo_win32_surface_create",
_cairo_boilerplate_win32_create_window_surface,
cairo_surface_create_similar,
NULL,
NULL,
_cairo_boilerplate_get_image_surface,
cairo_surface_write_to_png,
_cairo_boilerplate_win32_cleanup_window_surface,
NULL,
NULL,
FALSE, FALSE, FALSE
},
{
"win32-window-coloralpha", "win32", NULL, NULL,
CAIRO_SURFACE_TYPE_WIN32, CAIRO_CONTENT_COLOR_ALPHA, 1,
"cairo_win32_surface_create_with_format",
_cairo_boilerplate_win32_create_window_surface,
cairo_surface_create_similar,
NULL,
NULL,
_cairo_boilerplate_get_image_surface,
cairo_surface_write_to_png,
_cairo_boilerplate_win32_cleanup_window_surface,
NULL,
NULL,
FALSE, FALSE, FALSE
},
};
CAIRO_BOILERPLATE (win32, targets)
@@ -0,0 +1,885 @@
/* -*- 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-malloc-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;
static const cairo_user_data_key_t key2;
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 = _cairo_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);
free (info);
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);
free (info);
return NULL;
}
info->formats = xcb_render_query_pict_formats_reply (c, formats_cookie, 0);
if (info->formats == NULL) {
xcb_disconnect (c);
free (xtc);
free (info);
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);
cairo_device_set_user_data (cairo_surface_get_device (surface), &key2, info->formats, 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);
free (formats);
if (cairo_surface_status (surface)) {
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)
@@ -0,0 +1,639 @@
/* -*- 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-malloc-private.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 = _cairo_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)
@@ -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
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,255 @@
/*
* 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_
#include "config.h"
#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)
#ifdef __MINGW32__
#define CAIRO_BOILERPLATE_PRINTF_FORMAT(fmt_index, va_index) \
__attribute__((__format__(__MINGW_PRINTF_FORMAT, fmt_index, va_index)))
#else
#define CAIRO_BOILERPLATE_PRINTF_FORMAT(fmt_index, va_index) \
__attribute__((__format__(__printf__, fmt_index, va_index)))
#endif
#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
@@ -0,0 +1,38 @@
# IMPORTANT: Keep in sync with make-cairo-boilerplate-constructors.sh
# and test/make-cairo-test-constructors.py!
import argparse
import sys
import re
if __name__=='__main__':
parser = argparse.ArgumentParser()
parser.add_argument('output')
parser.add_argument('input', nargs='+')
args = parser.parse_args()
boilerplate_names = []
match_boilerplate_line = re.compile(r'^CAIRO_BOILERPLATE.*')
match_boilerplate_name = re.compile(r'^CAIRO_BOILERPLATE.*\((.*),.*')
for fname in args.input:
with open(fname, 'r', encoding='utf-8') as f:
for l in f.readlines():
if match_boilerplate_line.match(l):
boilerplate_names.append(match_boilerplate_name.match(l).group(1))
with open(args.output, 'w', encoding='utf-8') as f:
f.write('/* WARNING: Autogenerated file - see %s! */\n\n' % sys.argv[0])
f.write('#include "cairo-boilerplate-private.h"\n\n')
f.write('void _cairo_boilerplate_register_all (void);\n\n')
for boilerplate_name in boilerplate_names:
f.write('extern void _register_%s (void);\n' % boilerplate_name)
f.write('\nvoid\n')
f.write('_cairo_boilerplate_register_all (void)\n')
f.write('{\n')
for boilerplate_name in boilerplate_names:
f.write(' _register_%s ();\n' % boilerplate_name)
f.write('}\n')
@@ -0,0 +1,31 @@
#! /bin/sh
#
# IMPORTANT: Keep in sync with make-cairo-boilerplate-constructors.py!
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 "}"
@@ -0,0 +1,39 @@
cairo_boilerplate_sources = [
'cairo-boilerplate-getopt.c',
'cairo-boilerplate-system.c',
'cairo-boilerplate.c',
]
cairo_boilerplate_feature_sources = {
'cairo-xlib': ['cairo-boilerplate-xlib.c'],
'cairo-quartz': ['cairo-boilerplate-quartz.c'],
'cairo-xcb': ['cairo-boilerplate-xcb.c'],
'cairo-win32': ['cairo-boilerplate-win32.c', 'cairo-boilerplate-win32-printing.c'],
'cairo-pdf': ['cairo-boilerplate-pdf.c'],
'cairo-ps': ['cairo-boilerplate-ps.c'],
'cairo-svg': ['cairo-boilerplate-svg.c'],
'cairo-script': ['cairo-boilerplate-script.c'],
}
foreach feature: built_features
source_key = feature.get('source-key', feature.get('name'))
cairo_boilerplate_sources += cairo_boilerplate_feature_sources.get(source_key, [])
endforeach
cairo_boilerplate_constructors = custom_target('cairo-boilerplate-constructors.c',
input: files(cairo_boilerplate_sources),
output: 'cairo-boilerplate-constructors.c',
command: [python3, files('make-cairo-boilerplate-constructors.py')[0], '@OUTPUT@', '@INPUT@'])
libcairoboilerplate = static_library('cairoboilerplate', cairo_boilerplate_sources + [cairo_boilerplate_constructors],
include_directories: [incbase],
dependencies: deps + [libcairo_dep],
c_args: ['-DCAIRO_COMPILATION'],
install: false,
build_by_default: false,
)
cairoboilerplate_dep = declare_dependency(
link_with: [libcairoboilerplate],
include_directories: include_directories('.'),
)
@@ -0,0 +1,3 @@
Makefile
Makefile.in
*~
@@ -0,0 +1,103 @@
# Bibliography
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
Note: 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>
@@ -0,0 +1,21 @@
*.stamp
Makefile
Makefile.in
cairo-decl-list.txt
cairo-decl.txt
cairo-docs.sgml
cairo-undeclared.txt
cairo-undocumented.txt
cairo-unused.txt
cairo.hierarchy
cairo.interfaces
cairo.prerequisites
cairo.args
cairo.signals
html
xml
tmpl
version.xml
*~
*.bak
*.trs
@@ -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
@@ -0,0 +1,109 @@
<?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</title>
<bookinfo>
<title>Cairo: A Vector Graphics Library</title>
<releaseinfo>for Cairo &version;</releaseinfo>
</bookinfo>
<chapter id="cairo-drawing">
<title>Drawing</title>
<xi:include href="xml/cairo.xml"/>
<xi:include href="xml/cairo-paths.xml"/>
<xi:include href="xml/cairo-pattern.xml"/>
<xi:include href="xml/cairo-region.xml"/>
<xi:include href="xml/cairo-transforms.xml"/>
<xi:include href="xml/cairo-text.xml"/>
<xi:include href="xml/cairo-raster-source.xml"/>
<xi:include href="xml/cairo-tag.xml"/>
</chapter>
<chapter id="cairo-fonts">
<title>Fonts</title>
<xi:include href="xml/cairo-font-face.xml"/>
<xi:include href="xml/cairo-scaled-font.xml"/>
<xi:include href="xml/cairo-font-options.xml"/>
<xi:include href="xml/cairo-ft.xml"/>
<xi:include href="xml/cairo-win32-fonts.xml"/>
<xi:include href="xml/cairo-dwrite-fonts.xml"/>
<xi:include href="xml/cairo-quartz-fonts.xml"/>
<xi:include href="xml/cairo-user-fonts.xml"/>
</chapter>
<chapter id="cairo-surfaces">
<title>Surfaces</title>
<xi:include href="xml/cairo-device.xml"/>
<xi:include href="xml/cairo-surface.xml"/>
<xi:include href="xml/cairo-image.xml"/>
<xi:include href="xml/cairo-pdf.xml"/>
<xi:include href="xml/cairo-png.xml"/>
<xi:include href="xml/cairo-ps.xml"/>
<xi:include href="xml/cairo-recording.xml"/>
<xi:include href="xml/cairo-win32.xml"/>
<xi:include href="xml/cairo-svg.xml"/>
<xi:include href="xml/cairo-quartz.xml" />
<xi:include href="xml/cairo-xcb.xml"/>
<xi:include href="xml/cairo-xlib.xml"/>
<xi:include href="xml/cairo-xlib-xrender.xml"/>
<xi:include href="xml/cairo-script.xml"/>
<xi:include href="xml/cairo-surface-observer.xml"/>
<xi:include href="xml/cairo-tee.xml"/>
</chapter>
<chapter id="cairo-support">
<title>Utilities</title>
<xi:include href="xml/cairo-matrix.xml"/>
<xi:include href="xml/cairo-status.xml"/>
<xi:include href="xml/cairo-version.xml"/>
<xi:include href="xml/cairo-types.xml"/>
</chapter>
<chapter id="api-index-all">
<title>Index</title>
<xi:include href="xml/api-index-full.xml"/>
</chapter>
<!--index id="deprecated-api-index">
<title>Index of deprecated symbols</title>
<xi:include href="xml/api-index-deprecated.xml"/>
</index-->
<chapter id="api-index-1-0">
<title>Index of new symbols in 1.0</title>
<xi:include href="xml/api-index-1.0.xml"/>
</chapter>
<chapter id="api-index-1-2">
<title>Index of new symbols in 1.2</title>
<xi:include href="xml/api-index-1.2.xml"/>
</chapter>
<chapter id="api-index-1-4">
<title>Index of new symbols in 1.4</title>
<xi:include href="xml/api-index-1.4.xml"/>
</chapter>
<chapter id="api-index-1-6">
<title>Index of new symbols in 1.6</title>
<xi:include href="xml/api-index-1.6.xml"/>
</chapter>
<chapter id="api-index-1-8">
<title>Index of new symbols in 1.8</title>
<xi:include href="xml/api-index-1.8.xml"/>
</chapter>
<chapter id="api-index-1-10">
<title>Index of new symbols in 1.10</title>
<xi:include href="xml/api-index-1.10.xml"/>
</chapter>
<chapter id="api-index-1-12">
<title>Index of new symbols in 1.12</title>
<xi:include href="xml/api-index-1.12.xml"/>
</chapter>
<chapter id="api-index-1-14">
<title>Index of new symbols in 1.14</title>
<xi:include href="xml/api-index-1.14.xml"/>
</chapter>
<chapter id="api-index-1-16">
<title>Index of new symbols in 1.16</title>
<xi:include href="xml/api-index-1.16.xml"/>
</chapter>
<chapter id="api-index-1-18">
<title>Index of new symbols in 1.18</title>
<xi:include href="xml/api-index-1.18.xml"/>
</chapter>
<xi:include href="xml/language-bindings.xml"/>
</book>
@@ -0,0 +1,124 @@
<MACRO>
<NAME>CAIRO_HAS_FT_FONT</NAME>
#define CAIRO_HAS_FT_FONT
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_FC_FONT</NAME>
#define CAIRO_HAS_FC_FONT
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_PNG_FUNCTIONS</NAME>
#define CAIRO_HAS_PNG_FUNCTIONS
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_SVG_SURFACE</NAME>
#define CAIRO_HAS_SVG_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_PDF_SURFACE</NAME>
#define CAIRO_HAS_PDF_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_PS_SURFACE</NAME>
#define CAIRO_HAS_PS_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_SCRIPT_SURFACE</NAME>
#define CAIRO_HAS_SCRIPT_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_XLIB_SURFACE</NAME>
#define CAIRO_HAS_XLIB_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_XLIB_XRENDER_SURFACE</NAME>
#define CAIRO_HAS_XLIB_XRENDER_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_XCB_SURFACE</NAME>
#define CAIRO_HAS_XCB_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_XLIB_XCB_FUNCTIONS</NAME>
#define CAIRO_HAS_XLIB_XCB_FUNCTIONS
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_XCB_SHM_FUNCTIONS</NAME>
#define CAIRO_HAS_XCB_SHM_FUNCTIONS
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_QUARTZ_SURFACE</NAME>
#define CAIRO_HAS_QUARTZ_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_QUARTZ_IMAGE_SURFACE</NAME>
#define CAIRO_HAS_QUARTZ_IMAGE_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_QUARTZ_FONT</NAME>
#define CAIRO_HAS_QUARTZ_FONT
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_WIN32_SURFACE</NAME>
#define CAIRO_HAS_WIN32_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_WIN32_FONT</NAME>
#define CAIRO_HAS_WIN32_FONT
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_DWRITE_FONT</NAME>
#define CAIRO_HAS_DWRITE_FONT
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_GOBJECT_FUNCTIONS</NAME>
#define CAIRO_HAS_GOBJECT_FUNCTIONS
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_IMAGE_SURFACE</NAME>
#define CAIRO_HAS_IMAGE_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_USER_FONT</NAME>
#define CAIRO_HAS_USER_FONT
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_MIME_SURFACE</NAME>
#define CAIRO_HAS_MIME_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_RECORDING_SURFACE</NAME>
#define CAIRO_HAS_RECORDING_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_OBSERVER_SURFACE</NAME>
#define CAIRO_HAS_OBSERVER_SURFACE
</MACRO>
<MACRO>
<NAME>CAIRO_HAS_TEE_SURFACE</NAME>
#define CAIRO_HAS_TEE_SURFACE
</MACRO>
@@ -0,0 +1,791 @@
<SECTION>
<FILE>cairo-ft</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-win32-fonts</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-dwrite-fonts</FILE>
CAIRO_HAS_DWRITE_FONT
cairo_dwrite_font_face_create_for_dwrite_fontface
cairo_dwrite_font_face_get_rendering_params
cairo_dwrite_font_face_set_rendering_params
cairo_dwrite_font_face_get_measuring_mode
cairo_dwrite_font_face_set_measuring_mode
</SECTION>
<SECTION>
<FILE>cairo-quartz-fonts</FILE>
CAIRO_HAS_QUARTZ_FONT
cairo_quartz_font_face_create_for_cgfont
cairo_quartz_font_face_create_for_atsu_font_id
</SECTION>
<SECTION>
<FILE>cairo-user-fonts</FILE>
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_render_color_glyph_func
cairo_user_font_face_get_render_color_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_user_scaled_font_get_foreground_marker
cairo_user_scaled_font_get_foreground_source
</SECTION>
<SECTION>
<FILE>cairo-image</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-pdf</FILE>
CAIRO_HAS_PDF_SURFACE
CAIRO_PDF_OUTLINE_ROOT
cairo_pdf_outline_flags_t
cairo_pdf_metadata_t
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_pdf_surface_add_outline
cairo_pdf_surface_set_metadata
cairo_pdf_surface_set_custom_metadata
cairo_pdf_surface_set_page_label
cairo_pdf_surface_set_thumbnail_size
</SECTION>
<SECTION>
<FILE>cairo-png</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-ps</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-recording</FILE>
CAIRO_HAS_RECORDING_SURFACE
cairo_recording_surface_create
cairo_recording_surface_ink_extents
cairo_recording_surface_get_extents
</SECTION>
<SECTION>
<FILE>cairo-win32</FILE>
CAIRO_HAS_WIN32_SURFACE
cairo_win32_surface_create
cairo_win32_surface_create_with_dib
cairo_win32_surface_create_with_ddb
cairo_win32_surface_create_with_format
cairo_win32_printing_surface_create
cairo_win32_surface_get_dc
cairo_win32_surface_get_image
<SUBSECTION Private>
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
</SECTION>
<SECTION>
<FILE>cairo-quartz</FILE>
CAIRO_HAS_QUARTZ_SURFACE
CAIRO_HAS_QUARTZ_IMAGE_SURFACE
cairo_quartz_surface_create
cairo_quartz_surface_create_for_cg_context
cairo_quartz_surface_get_cg_context
cairo_quartz_image_surface_create
cairo_quartz_image_surface_get_image
</SECTION>
<SECTION>
<FILE>cairo-xlib</FILE>
CAIRO_HAS_XLIB_SURFACE
CAIRO_HAS_XLIB_XCB_FUNCTIONS
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
</SECTION>
<SECTION>
<FILE>cairo-xlib-xrender</FILE>
CAIRO_HAS_XLIB_XRENDER_SURFACE
cairo_xlib_surface_create_with_xrender_format
cairo_xlib_surface_get_xrender_format
</SECTION>
<SECTION>
<FILE>cairo-xcb</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-svg</FILE>
CAIRO_HAS_SVG_SURFACE
cairo_svg_surface_create
cairo_svg_surface_create_for_stream
cairo_svg_surface_get_document_unit
cairo_svg_surface_set_document_unit
cairo_svg_surface_restrict_to_version
cairo_svg_version_t
cairo_svg_get_versions
cairo_svg_version_to_string
cairo_svg_unit_t
</SECTION>
<SECTION>
<FILE>cairo-device</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-surface</FILE>
CAIRO_HAS_MIME_SURFACE
CAIRO_MIME_TYPE_CCITT_FAX
CAIRO_MIME_TYPE_CCITT_FAX_PARAMS
CAIRO_MIME_TYPE_EPS
CAIRO_MIME_TYPE_EPS_PARAMS
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
</SECTION>
<SECTION>
<FILE>cairo-surface-observer</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-version</FILE>
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
<SUBSECTION Private>
CAIRO_VERSION_STRINGIZE_
</SECTION>
<SECTION>
<FILE>cairo-region</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-pattern</FILE>
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_dither_t
cairo_pattern_set_dither
cairo_pattern_get_dither
</SECTION>
<SECTION>
<FILE>cairo-raster-source</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-tag</FILE>
CAIRO_TAG_DEST
CAIRO_TAG_LINK
CAIRO_TAG_CONTENT
CAIRO_TAG_CONTENT_REF
cairo_tag_begin
cairo_tag_end
</SECTION>
<SECTION>
<FILE>cairo-matrix</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-status</FILE>
cairo_status_t
cairo_status_to_string
cairo_debug_reset_static_data
</SECTION>
<SECTION>
<FILE>cairo-font-face</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-scaled-font</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-font-options</FILE>
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_font_options_get_variations
cairo_font_options_set_variations
cairo_color_mode_t
cairo_font_options_set_color_mode
cairo_font_options_get_color_mode
CAIRO_COLOR_PALETTE_DEFAULT
cairo_font_options_set_color_palette
cairo_font_options_get_color_palette
cairo_font_options_set_custom_palette_color
cairo_font_options_get_custom_palette_color
</SECTION>
<SECTION>
<FILE>cairo-types</FILE>
cairo_bool_t
cairo_user_data_key_t
cairo_destroy_func_t
cairo_rectangle_int_t
</SECTION>
<SECTION>
<FILE>cairo-transforms</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-paths</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-text</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo</FILE>
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_set_hairline
cairo_get_hairline
<SUBSECTION Private>
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_HAS_GOBJECT_FUNCTIONS
</SECTION>
<SECTION>
<FILE>cairo-script</FILE>
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
</SECTION>
<SECTION>
<FILE>cairo-tee</FILE>
CAIRO_HAS_TEE_SURFACE
cairo_tee_surface_create
cairo_tee_surface_add
cairo_tee_surface_index
cairo_tee_surface_remove
</SECTION>
@@ -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
@@ -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"
@@ -0,0 +1,734 @@
<appendix id="language-bindings">
<title>Creating a language binding for cairo</title>
<para>
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 <firstterm>language
binding</firstterm>. 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.
</para>
<sect1 id="bindings-general">
<title>General considerations</title>
<para>
The naming of the central <link
linkend="cairo-t"><type>cairo_t</type></link> type is a
special exception. The object is “a cairo context” not “a
cairo”, and names such as <type>cairo_t</type> rather than
<type>cairo_context_t</type> and
<function>cairo_set_source()</function> rather than
<function>cairo_context_set_source()</function> 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 <type>cairo_context_t</type>.
</para>
<para>
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
<literal>cairo_set_source(cr,source)</literal>,
<literal>cr.setSource(source)</literal>.
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().
</para>
</sect1>
<sect1 id="bindings-memory">
<title>Memory management</title>
<para>
The objects in cairo can roughly be divided into two types:
reference-counted, opaque types like
<link
linkend="cairo-surface-t"><type>cairo_surface_t</type></link>
and plain structures like
<link
linkend="cairo-glyph-t"><type>cairo_glyph_t</type></link>.
<link
linkend="cairo-path-t"><type>cairo_path_t</type></link>
and
<link
linkend="cairo-path-data-t"><type>cairo_path_data_t</type></link>
are special cases and are treated separately in this appendix.
</para>
<para>
Refcounted opaque types all have a
<function>..._reference()</function>
function to increase the refcount by one and a
<function>..._destroy()</function> 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:
</para>
<itemizedlist>
<listitem>
<para>
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 <firstterm>pin table</firstterm> (a hash
table that goes from cairo object to language object).
For <type>cairo_surface_t</type> you can use also
<link
linkend="cairo-surface-set-user-data"><function>cairo_surface_set_user_data()</function></link>
instead of a separate pin table.
</para>
</listitem>
<listitem>
<para>
Derivation from the language object doesn't work because
you can lose the language object while keeping the Cairo
object. Code like:
</para>
<programlisting>
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();
</programlisting>
<para>
Can result in <varname>surface</varname> containing an
<classname>ImageSurface</classname> not a <classname>MySurface</classname>.
This is not easily fixable without creating memory leaks,
and it's probably best to simply forbid deriving from the
language objects.
</para>
</listitem>
</itemizedlist>
<para>
When a plain structure is used as a return value from cairo,
this is done by passing it as a “out parameter”.
</para>
<programlisting>
cairo_font_extents_t extents;
cairo_font_extents (cr, &amp;extents);</programlisting>
<para>
In a language binding, this should typically be treated
as a return value:
</para>
<programlisting>
FontExtents extents = cr.fontExtents ();</programlisting>
<para>
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.
</para>
</sect1>
<sect1 id="bindings-return-values">
<title>Multiple return values</title>
<para>
There are a number of functions in the cairo API that have
multiple <firstterm>out parameters</firstterm> or
<firstterm>in-out parameters</firstterm>. In some languages
these can be translated into multiple return values. In Python,
what is:
</para>
<programlisting>
cairo_user_to_device (cr, &amp;x, &amp;y);</programlisting>
<para>
can by mapped to:
</para>
<programlisting>
(x, y) = cr.user_to_device (cr, x, y);</programlisting>
<para>
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
</para>
<programlisting>
typedef struct _cairo_point cairo_point_t;
struct _cairo_point {
double x;
double y;
}</programlisting>
<para>
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.
</para>
<programlisting>
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);
</programlisting>
<para>
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:
</para>
<programlisting>
typedef struct _cairo_rectangle cairo_rectangle_t;
struct _cairo_rectangle {
double x;
double y;
double width;
double height;
}</programlisting>
<para>
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.
</para>
<remark>
Q: Would it make sense here to define a standard
<function>cairo_rectangle_round()</function> method
that language bindings should map?
</remark>
<programlisting>
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);
</programlisting>
</sect1>
<sect1 id="bindings-overloading">
<title>Overloading and optional arguments</title>
<para>
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.
</para>
<para>
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
<link
linkend="cairo-set-source-rgb"><function>cairo_set_source_rgb()</function></link>
an overload of <function>cairo_set_source()</function>, but future plans to add
<function>cairo_set_source_rgb_premultiplied()</function>,
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
</para>
<programlisting>
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);
</programlisting>
<para>
Note that there are cases where all constructors for a type
aren't overloaded together. For example
<link
linkend="cairo-image-surface-create-from-png"><function>cairo_image_surface_create_from_png()</function></link>
should <emphasis>not</emphasis> be overloaded together with
<link
linkend="cairo-image-surface-create"><function>cairo_image_surface_create()</function></link>.
In such cases, the remaining constructors will typically need to
be bound as static methods. In Java, for example, we might have:
</para>
<programlisting>
Surface surface1 = ImageSurface(Format.RGB24, 100, 100);
Surface surface2 = ImageSurface.createFromPNG("camera.png");</programlisting>
<para>
Some other overloads that add combinations not found in C may be
convenient for users for language bindings that provide
<type>cairo_point_t</type> and <type>cairo_rectangle_t</type>
types, for example:
</para>
<programlisting>
void
cairo_move_to (cairo_t *cr,
cairo_point_t *point);
void
cairo_rectangle (cairo_t *cr,
cairo_rectangle_t *rectangle);
</programlisting>
</sect1>
<sect1 id="bindings-streams">
<title>Streams and File I/O</title>
<para>
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:
</para>
<programlisting>
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);</programlisting>
<para>
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:
</para>
<programlisting>
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;
</programlisting>
<para>
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
<methodname>createFromPNG()</methodname> 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
<parameter>closure</parameter>, and then rethrow it once
the function returns.
</para>
<remark>
I'm not sure how to handle this for
<link
linkend="cairo-pdf-surface-create-for-stream"><function>cairo_pdf_surface_create_for_stream()</function></link>.
Other than keep a “exception to rethrow” thread-specific
variable
that is checked after <emphasis>every</emphasis> call to a Cairo
function.
</remark>
</sect1>
<sect1 id="bindings-errors">
<title>Error handling</title>
<para>
The error handling approach in C for Cairo has multiple
elements:
</para>
<itemizedlist>
<listitem><para>
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 <link
linkend="cairo-status"><function>status()</function></link>.
</para></listitem>
<listitem><para>
Constructors, rather than
returning <constant>NULL</constant> on out-of-memory failure,
return a special singleton object on which all
operations do nothing. Retrieving the status of the
singleton object returns <constant>CAIRO_STATUS_NO_MEMORY</constant>
</para>
</listitem>
<listitem><para>
Errors propagate from object to object. Setting a pattern
in an out-of-memory state as the source of a
<type>cairo_t</type> puts the type into an error state.
</para></listitem>
</itemizedlist>
<para>
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.
</para>
<para>
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:
</para>
<programlisting>
/* 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
</programlisting>
<para>
If we look at these, the
<constant>CAIRO_STATUS_NO_MEMORY</constant>
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 <constant>CAIRO_STATUS_READ_ERROR</constant>,
and <constant>CAIRO_STATUS_WRITE_ERROR</constant> can occur
only in very specific places. (In fact, as described
in <xref linkend="bindings-streams"/>, 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.
</para>
</sect1>
<sect1 id="bindings-patterns">
<title>Patterns</title>
<para>
The cairo C API allows for creating a number of different types
of patterns. All of these different types of patterns map to
<link
linkend="cairo-pattern-t"><type>cairo_pattern_t</type></link>
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.)
</para>
<programlisting>
cairo_pattern_t
<link linkend="cairo-pattern-set-matrix"><function>cairo_pattern_set_matrix()</function></link>
<link linkend="cairo-pattern-get-matrix"><function>cairo_pattern_get_matrix()</function></link>
cairo_solid_pattern_t (<link linkend="cairo-pattern-create-rgb"><function>cairo_pattern_create_rgb()</function></link> and <link linkend="cairo-pattern-create-rgba"><function>cairo_pattern_create_rgba()</function></link>)
cairo_surface_pattern_t (<link linkend="cairo-pattern-create-for-surface"><function>cairo_pattern_create_for_surface()</function></link>)
<link linkend="cairo-pattern-set-extend"><function>cairo_pattern_set_extend()</function></link>
<link linkend="cairo-pattern-get-extend"><function>cairo_pattern_get_extend()</function></link>
<link linkend="cairo-pattern-set-filter"><function>cairo_pattern_set_filter()</function></link>
<link linkend="cairo-pattern-get-filter"><function>cairo_pattern_get_filter()</function></link>
cairo_gradient_t
<link linkend="cairo-pattern-add-color-stop-rgb"><function>cairo_pattern_add_color_stop_rgb()</function></link>
<link linkend="cairo-pattern-add-color-stop-rgba"><function>cairo_pattern_add_color_stop_rgba()</function></link>
cairo_linear_gradient_t (<link linkend="cairo-pattern-create-linear"><function>cairo_pattern_create_linear()</function></link>)
cairo_radial_gradient_t (<link linkend="cairo-pattern-create-radial"><function>cairo_pattern_create_radial()</function></link>)
cairo_mesh_t (<link linkend="cairo-pattern-create-mesh"><function>cairo_pattern_create_mesh()</function></link>)
<link linkend="cairo-mesh-pattern-begin-patch"><function>cairo_mesh_pattern_begin_patch()</function></link>
<link linkend="cairo-mesh-pattern-end-patch"><function>cairo_mesh_pattern_end_patch()</function></link>
<link linkend="cairo-mesh-pattern-move-to"><function>cairo_mesh_pattern_move_to()</function></link>
<link linkend="cairo-mesh-pattern-line-to"><function>cairo_mesh_pattern_line_to()</function></link>
<link linkend="cairo-mesh-pattern-curve-to"><function>cairo_mesh_pattern_curve_to()</function></link>
<link linkend="cairo-mesh-pattern-set-control-point"><function>cairo_mesh_pattern_set_control_point()</function></link>
<link linkend="cairo-mesh-pattern-set-corner-color-rgb"><function>cairo_mesh_pattern_set_corner_color_rgb()</function></link>
<link linkend="cairo-mesh-pattern-set-corner-color-rgba"><function>cairo_mesh_pattern_set_corner_color_rgba()</function></link>
<link linkend="cairo-mesh-pattern-get-patch-count"><function>cairo_mesh_pattern_get_patch_count()</function></link>
<link linkend="cairo-mesh-pattern-get-path"><function>cairo_mesh_pattern_get_path()</function></link>
<link linkend="cairo-mesh-pattern-get-control-point"><function>cairo_mesh_pattern_get_control_point()</function></link>
<link linkend="cairo-mesh-pattern-get-corner-color-rgba"><function>cairo_mesh_pattern_get_corner_color_rgba()</function></link>
</programlisting>
<para>
</para>
</sect1>
<sect1 id="bindings-surfaces">
<title>Surfaces</title>
<para>
Like patterns, surfaces, which use only the
<link
linkend="cairo-surface-t"><type>cairo_surface_t</type></link>
type in the C API should be broken up into a hierarchy of types
in a language binding.
</para>
<programlisting>
cairo_surface_t
cairo_image_surface_t
cairo_atsui_surface_t
cairo_win32_surface_t
cairo_xlib_surface_t
</programlisting>
<para>
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 <type>Display</type> * in
that language.
</para>
<para>
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 <ulink url="http://www.gtk.org/">GTK+</ulink> widget
toolkit. In such a situation, the higher level toolkit provides
ways to get references to platform specific surfaces.
</para>
<para>
The <link
linkend="cairo-surface-set-user-data"><function>cairo_surface_set_user_data()</function></link>,
and <link
linkend="cairo-surface-get-user-data"><function>cairo_surface_get_user_data()</function></link>
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:
</para>
<programlisting>
cairo_surface_t *
<link linkend="cairo-image-surface-create-for-data"><function>cairo_image_surface_create_for_data</function></link> (unsigned char *data,
cairo_format_t format,
int width,
int height,
int stride);
</programlisting>
<para>
The memory block passed in for <parameter>data</parameter> 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 <parameter>destroy</parameter>
argument to <function>cairo_surface_set_user_data()</function>.
</para>
<remark>
Some languages may not have a suitable “pointer to a block of
data” type to pass in for <parameter>data</parameter>. 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?
</remark>
</sect1>
<sect1 id="bindings-fonts">
<title>Fonts</title>
<para>
Fonts are once more an area where there is a hierarchy of types:
</para>
<programlisting>
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
</programlisting>
<para>
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.
</para>
<para>
The <link
linkend="cairo-font-face-set-user-data"><function>cairo_font_face_set_user_data()</function></link>,
and <link
linkend="cairo-font-face-get-user-data"><function>cairo_font_face_get_user_data()</function></link>
methods are provided for use in language bindings, and should
not be directly exposed to applications.
</para>
</sect1>
<sect1 id="bindings-path">
<title>cairo_path_t</title>
<para>
The <link linkend="cairo-path-t"><type>cairo_path_t</type></link> type is one
area in which most language bindings will differ significantly
from the C API. The C API for <type>cairo_path_t</type> 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 <type>cairo_path_t</type> 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:
</para>
<programlisting>
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);
</programlisting>
<para>
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:
</para>
<programlisting>
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);
}
}</programlisting>
<para>
And then in a hypothetical C++ binding:
</para>
<programlisting>
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);
}
}</programlisting>
<para>
And then finally in a Python binding:
</para>
<programlisting>
for element in cr.copy_path():
if element.getType == cairo.PATH_ELEMENT_MOVE_TO:
(x, y) = element.getPoint(0)
doMoveTo (x, y);</programlisting>
<para>
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.
</para>
<para>
You should not present an API for mutating or for creating new
<type>cairo_path_t</type> objects. In the future, these
guidelines may be extended to present an API for creating a
<type>cairo_path_t</type> from scratch for use with
<link
linkend="cairo-append-path"><function>cairo_append_path()</function></link>
but the current expectation is that <function>cairo_append_path()</function> will
mostly be used with paths from
<link
linkend="cairo-append-path"><function>cairo_copy_path()</function></link>.
</para>
</sect1>
</appendix>
<!--
Local variables:
mode: sgml
sgml-parent-document: ("cairo-docs.xml" "book" "book" "appendix")
End:
-->
@@ -0,0 +1,156 @@
gnome = import('gnome')
ignore_headers = [
# Sub-directories
'win32',
# Internal headers
'cairoint.h',
'cairo-features.h',
'cairo-features-win32.h',
# Inlined API
'cairo-box-inline.h',
'cairo-clip-inline.h',
'cairo-combsort-inline.h',
'cairo-contour-inline.h',
'cairo-error-inline.h',
'cairo-image-surface-inline.h',
'cairo-line-inline.h',
'cairo-list-inline.h',
'cairo-pattern-inline.h',
'cairo-recording-surface-inline.h',
'cairo-surface-inline.h',
'cairo-surface-observer-inline.h',
'cairo-surface-snapshot-inline.h',
'cairo-surface-subsurface-inline.h',
# Private headers
'cairo-analysis-surface-private.h',
'cairo-arc-private.h',
'cairo-array-private.h',
'cairo-atomic-private.h',
'cairo-backend-private.h',
'cairo-boxes-private.h',
'cairo-cache-private.h',
'cairo-clip-private.h',
'cairo-compiler-private.h',
'cairo-composite-rectangles-private.h',
'cairo-compositor-private.h',
'cairo-contour-private.h',
'cairo-damage-private.h',
'cairo-default-context-private.h',
'cairo-deprecated.h',
'cairo-device-private.h',
'cairo-error-private.h',
'cairo-fixed-private.h',
'cairo-fixed-type-private.h',
'cairo-fontconfig-private.h',
'cairo-freed-pool-private.h',
'cairo-freelist-private.h',
'cairo-freelist-type-private.h',
'cairo-ft-private.h',
'cairo-gstate-private.h',
'cairo-hash-private.h',
'cairo-image-info-private.h',
'cairo-image-surface-private.h',
'cairo-line-private.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-private.h',
'cairo-pdf-operators-private.h',
'cairo-pdf-shading-private.h',
'cairo-pdf-surface-private.h',
'cairo-pixman-private.h',
'cairo-private.h',
'cairo-ps-surface-private.h',
'cairo-quartz-private.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-scaled-font-subsets-private.h',
'cairo-script-private.h',
'cairo-slope-private.h',
'cairo-spans-compositor-private.h',
'cairo-spans-private.h',
'cairo-stroke-dash-private.h',
'cairo-surface-backend-private.h',
'cairo-surface-clipper-private.h',
'cairo-surface-fallback-private.h',
'cairo-surface-observer-private.h',
'cairo-surface-offset-private.h',
'cairo-surface-private.h',
'cairo-surface-snapshot-private.h',
'cairo-surface-subsurface-private.h',
'cairo-surface-wrapper-private.h',
'cairo-svg-surface-private.h',
'cairo-tag-attributes-private.h',
'cairo-tag-stack-private.h',
'cairo-time-private.h',
'cairo-traps-private.h',
'cairo-tristrip-private.h',
'cairo-truetype-subset-private.h',
'cairo-type1-private.h',
'cairo-type3-glyph-surface-private.h',
'cairo-types-private.h',
'cairo-user-font-private.h',
'cairo-wideint-private.h',
'cairo-wideint-type-private.h',
'cairo-xcb-private.h',
'cairo-xlib-private.h',
'cairo-xlib-surface-private.h',
'cairo-xlib-xrender-private.h',
'test-compositor-surface-private.h',
]
ignore_decorators = [
'cairo_public',
'cairo_private',
]
docpath = get_option('prefix') / get_option('datadir') / 'gtk-doc/html'
version_conf = configuration_data()
version_conf.set('CAIRO_VERSION', meson.project_version())
configure_file(
input: 'version.xml.in',
output: 'version.xml',
configuration: version_conf
)
gnome.gtkdoc('cairo',
main_xml: 'cairo-docs.xml',
namespace: 'cairo',
mode: 'sgml',
src_dir: doc_srcdir,
dependencies: libcairo_dep,
scan_args: [
'--ignore-decorators=' + '|'.join(ignore_decorators),
'--ignore-headers=' + ' '.join(ignore_headers),
],
mkdb_args: ['--source-suffixes=h,c,cpp'],
content_files: [
'language-bindings.xml',
],
expand_content_files: [
'language-bindings.xml',
],
html_assets: [
],
fixxref_args: [
'--html-dir=' + docpath,
],
install: true,
check: true,
)
@@ -0,0 +1 @@
@CAIRO_VERSION@
@@ -0,0 +1,175 @@
# Releasing Cairo
Here are the steps to follow to create a new cairo release:
## 0. Decide type of release and checkout the appropriate branch
The Cairo project makes three types of releases: Development snapshot
releases, stable minor releases, and stable micro (aka "point") releases.
Micro releases should be only bugfixes and no API additions. If there are
API additions consider making a Minor release. Snapshot releases can be
done of the current development tree between Minor releases, as desired.
For stable releases (both minor and micro), the work should be done on the
given release branch. E.g. for 1.14.12, check out the 1.14 branch via "git
checkout origin/1.14 -b 1.14".
## 1. Ensure that there are no local, uncommitted/unpushed mods
You're probably in a good state if both "git diff HEAD" and "git log
master..origin/master" give no output.
## 2. Verify that the code passes `meson dist`
First, make sure you have 'nm' and 'readelf' commands in `PATH`. this
should be OK with any Linux distro.
Running "meson dist" should result in no warnings or errors and end with a
message of the form:
Created source/cairo/_build/meson-dist/cairo-1.17.8.tar.xz
If the test suite does not pass, you can use:
meson dist --no-tests
But this should only be allowed for development snapshots. Please, always
check the state of the CI pipeline on GitLab.
## 3. Decide what the new version number for the release will be.
Cairo uses even numbers for official releases, and odd numbers for
development snapshots. Thus, for a Minor release it would be:
LAST_RELEASE="X.Y.Z" # e.g. 1.12.0
THIS_RELEASE="X.Y+2.0" # e.g. 1.14.0
While for a Micro release the version numbers should be:
LAST_RELEASE="X.Y.Z" # e.g. 1.14.0
THIS_RELEASE="X.Y.Z+2" # e.g. 1.14.2
Snapshots are similar but have odd minor versions. Also, the first snapshot
release in a new series will be .2 rather than .0, e.g.:
LAST_RELEASE="X.Y.Z" # e.g. 1.14.0
THIS_RELEASE="X.Y+1.0" # e.g. 1.15.2
and subsequent snapshots in that series are just normal micro releases:
LAST_RELEASE="X.Y.Z" # e.g. 1.15.2
THIS_RELEASE="X.Y.Z+2" # e.g. 1.15.4
## 4. 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 ${LAST_RELEASE}..
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 ${LAST_RELEASE}.. --
```
## 5. Increment `CAIRO_VERSION_{MINOR|MICRO}` in `src/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.
## 6. For Minor releases, add an index entry to `doc/public/cairo-docs.xml`
Towards the end of the file, add a new section for the stable release.
It'll look something like:
```xml
<index id="api-index-X-Y">
<title>Index of new symbols in X.Y</title>
<xi:include href="xml/api-index-X.Y.xml"/>
</index>
```
## 7. Commit the changes to `NEWS` and `src/cairo-version.h`
It's especially important to mention the new version number in your commit
log.
## 8. Generate the release archive
The `meson dist` command will:
* Generate the final tar file
* Generate an sha1sum file
Once you have the release archive you will need to:
* Sign the sha1sum using your GPG setup (asks for your GPG password)
* `scp` the three files to appear on https://cairographics.org/releases
* Generate a versioned manual and upload it to appear as both:
- `https://cairographics.org/manual-${THIS_RELEASE}`
- `https://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 `${THIS_RELEASE}` tag, 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).
## 9. Update master (or the stable branch) version number.
For Micro releases (X.Y.Z+2), increment `CAIRO_VERSION_MICRO` to the next
larger (odd) number in `src/cairo-version.h`.
DEVEL_VERSION="X.Y.Z+1" # e.g. 1.15.10 -> 1.15.11
For Minor releases (X.Y.0), increment `CAIRO_VERSION_MINOR` to the next
larger (odd) number, and set `CAIRO_VERSION_MICRO` to 1.
DEVEL_VERSION="X.Y.Z+1" # e.g. 1.16.0 -> 1.17.1
Then, commit:
git commit src/cairo-version.h -m "Bump version for ${DEVEL_VERSION}"
## 9. Push the new tag out
Use:
git push --atomic origin master ${THIS_RELEASE}
to ensure that both the tag and the latest changes in your tree are uploaded
at the same time.
## 10. Send out an announcement message.
Send a message to cairo-announce@cairographics.org and CC
cairo@cairographics.org, and ftp-release@lists.freedesktop.org (pr@lwn.net
as well for major releases) to announce the release, adding the excerpt from
NEWS and the shortlog of all changes since last release, generated by:
git shortlog ${LAST_RELEASE}...
## 11. Add the announcement to the website
Add a new entry in the `news` directory. It will automatically get indexed
onto the homepage when the site refreshes.
@@ -0,0 +1,7 @@
tutorial-???.html
tutorial-???.png
tutorial-???.svg
tutorial-index.xml
tutorial.pdf
index.html
*~
@@ -0,0 +1,477 @@
<?xml version="1.0" ?>
<svg width="1024" height="768"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ss="http://www.svgslides.org/svgslides0.1"
fill="black">
<defs id="cairo-artwork_defs">
<g id="hacker_emblem">
<!-- Note: This is similar though not identical to Keith Packard's SVG version
of the hacker emblem (http://www.catb.org/hacker-emblem/glider.svg) -->
<g id="hacker_emblem_grid" fill="white" stroke="none">
<!-- Outside: Top, Right, Bottom, Left -->
<rect x="-2.95" y="-3.05" width="6" height="0.1" />
<rect x="2.95" y="-2.95" width="0.1" height="6" />
<rect x="-3.05" y="2.95" width="6" height="0.1" />
<rect x="-3.05" y="-3.05" width="0.1" height="6" />
<!-- Vertical: Left, Right -->
<rect x="-1.05" y="-2.95" width="0.1" height="5.9" />
<rect x="0.95" y="-2.95" width="0.1" height="5.9" />
<!-- Horizontal: TopLeft, TopMiddle, TopRight -->
<rect x="-2.95" y="-1.05" width="1.9" height="0.1" />
<rect x="-0.95" y="-1.05" width="1.9" height="0.1" />
<rect x="1.05" y="-1.05" width="1.9" height="0.1" />
<!-- Horizontal: BottomLeft, BottomMiddle, BottomRight -->
<rect x="-2.95" y="0.95" width="1.9" height="0.1" />
<rect x="-0.95" y="0.95" width="1.9" height="0.1" />
<rect x="1.05" y="0.95" width="1.9" height="0.1" />
</g>
<g id="hacker_emblem_dots" fill="white">
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<g id="scarab" fill="#3B80AE">
<g transform="translate(-150, -170)">
<path id="scarab_head" d="M205.599,94.567c0-11.668-24.914-21.129-55.628-21.129
c-30.723,0-55.624,9.46-55.624,21.129c0,10.203,24.901,7.346,55.624,7.346C180.685,101.913,205.599,104.233,205.599,94.567z"/>
<path id="scarab_torso" d="M136.423,161.506c0,0,12.751,12.577,13.547,13.362
c2.262-2.232,13.545-13.362,13.545-13.362c7.135-7.036,87.111-6.399,91.066-6.363c-0.469-6.298-1.254-12.472-2.325-18.519
c-15.183-19.279-42.811-32.225-74.485-32.225h-55.518c-31.745,0-59.439,13.011-74.598,32.37c-1.054,6-1.829,12.128-2.296,18.374
C49.321,155.106,129.288,154.47,136.423,161.506z"/>
<path id="scarab_spine" d="M149.97,301.187c2.005-24.729,8.386-103.483,8.405-103.721
c-0.09-0.219-6.478-15.578-8.405-20.214c-1.936,4.655-8.316,19.995-8.408,20.214C141.582,197.704,147.965,276.458,149.97,301.187z"/>
<path id="scarab_wing_left" d="M140.403,197.149l8.862-21.31l-13.686-13.499
c-5.65-5.573-67.074-6.235-90.259-6.019l-0.006-0.622c-0.154,2.144-0.271,4.302-0.35,6.475
c-0.076,2.207,10.392,4.706,10.392,6.717c0,2.319-10.457,5.084-10.359,7.631c2.993,73.349,48.53,131.631,104.372,132.048
l-9.02-111.29L140.403,197.149z"/>
<path id="scarab_wing_right" d="M244.585,168.891c0-2.011,10.467-4.506,10.391-6.715
c-0.079-2.174-0.195-4.332-0.351-6.479l-0.004,0.624c-23.186-0.216-84.608,0.445-90.26,6.017l-13.688,13.502l8.915,21.438
l-9.017,111.29c55.854-0.417,101.378-58.698,104.373-132.049C255.04,173.976,244.585,171.209,244.585,168.891z"/>
<path id="scarab_leg_front_left" d="M44.506,141.12c-4.135-0.856-4.895-1.54-7.935-2.92
c-9.59-3.364-10.376-5.481-16.08-11.86c-7.426-8.306-12.661-20.142-17.1-29.463c-3.576-7.525-3.984-16.409-2.86-24.273
c0.991-6.935,7.144-12.869,12.074-18.92c5.844-7.191,10.356-14.822,17.924-21.354c7.736-6.682,23.203-9.809,26.168-19.648
C57.86,8.819,54.334,1.766,61.482,0c-0.366,4.703,3.639,8.477,2.397,13.575c-1.129,4.627-4.368,5.811-9.611,9.099
c-7.564,4.746-18.366,8.779-24.748,13.965c-7.175,5.827-4.369,13.771-10.569,20.057c-2.001,2.03-7.901,4.706-9.137,6.83
c-1.861,3.199-0.297,9.572-0.116,13.12c0.425,8.284,5.588,14.244,9.555,22.045c4.152,8.141,6.429,15.409,13.411,22.519
c4.183,4.262,11.429,4.802,16.21,10.647l-3.555,4.186L44.506,141.12z"/>
<path id="scarab_leg_middle_left" d="M43.94,191.922l-0.809-7.346
c-9.506-4.579-10.339-9.772-20.738-12.466c-23.728-6.151-21.361,11.25-15.532,26.373c5.676,14.726,8.237,30.23,14.345,44.795
c2.805,6.688,6.919,13.213,14.298,15.127c0.372-8.435-0.917-10.651-6.113-16.919c-4.395-5.293-3.326-12.548-6.072-18.504
c-3.581-7.804-4.196-15.646-7.279-23.502c-1.363-3.479-8.33-13.966-6.452-17.861c3.183-6.603,9.178-0.083,12.179,2.077
c4.218,3.036,6.467,2.223,11.681,2.898C34.041,186.673,37.005,188.756,43.94,191.922z"/>
<path id="scarab_leg_back_left" d="M65.839,257.063l-2.771-4.837
c-6.68,8.928-6.993,16.228-10.056,23.347c-5.277,12.263-0.157,28.851,9.854,37.676c6.052,5.375,15.907,9.618,23.122,13.136
c10.035,4.892,20.113,11.286,31.336,13.396c2.482,0.466,8.798,1.295,6.693-3.522c-0.975-2.237-8.091-4.591-10.146-5.734
c-8.312-4.623-16.377-10.524-24.142-16.176c-9.498-6.862-20.843-11.186-28.311-20.684c-3.054-3.885-3.544-4.922-2.816-9.39
c0.693-4.263,1.344-9.174,2.241-13.439C61.855,266.029,63.274,261.378,65.839,257.063z"/>
<path id="scarab_leg_front_right" d="M255.487,141.12c4.134-0.856,4.896-1.54,7.936-2.92
c9.583-3.364,10.369-5.481,16.071-11.86c7.428-8.306,12.661-20.142,17.115-29.463c3.574-7.525,3.983-16.409,2.86-24.273
c-0.992-6.935-7.157-12.869-12.087-18.92c-5.843-7.191-10.356-14.822-17.919-21.354c-7.735-6.682-23.202-9.809-26.167-19.648
C242.135,8.819,245.66,1.766,238.511,0c0.366,4.703-3.637,8.477-2.396,13.575c1.131,4.627,4.368,5.811,9.611,9.099
c7.563,4.746,18.367,8.779,24.747,13.965c7.17,5.827,4.362,13.771,10.563,20.057c2.001,2.03,7.901,4.706,9.139,6.83
c1.859,3.199,0.295,9.572,0.113,13.12c-0.424,8.284-5.588,14.244-9.553,22.045c-4.152,8.141-6.431,15.409-13.404,22.519
c-4.184,4.262-11.429,4.802-16.211,10.647l3.556,4.186L255.487,141.12z"/>
<path id="scarab_leg_middle_right" d="M256.053,191.922l0.81-7.346
c9.507-4.579,10.34-9.772,20.73-12.466c23.741-6.151,21.374,11.25,15.534,26.373c-5.676,14.726-8.238,30.23-14.347,44.795
c-2.804,6.688-6.911,13.213-14.291,15.127c-0.371-8.435,0.918-10.651,6.113-16.919c4.39-5.293,3.319-12.548,6.066-18.504
c3.58-7.804,4.197-15.646,7.278-23.502c1.363-3.479,8.33-13.966,6.453-17.861c-3.184-6.603-9.179-0.083-12.181,2.077
c-4.217,3.036-6.458,2.223-11.672,2.898C265.951,186.673,262.986,188.756,256.053,191.922z"/>
<path id="scarab_leg_back_right" d="M234.155,257.063l2.771-4.837
c6.679,8.928,6.991,16.228,10.057,23.347c5.274,12.263,0.154,28.851-9.854,37.676c-6.055,5.375-15.903,9.618-23.117,13.136
c-10.034,4.892-20.127,11.286-31.351,13.396c-2.481,0.466-8.789,1.295-6.691-3.522c0.976-2.237,8.092-4.591,10.146-5.734
c8.312-4.623,16.392-10.524,24.155-16.176c9.498-6.862,20.838-11.186,28.305-20.684c3.055-3.885,3.543-4.922,2.818-9.39
c-0.696-4.263-1.346-9.174-2.244-13.439C238.137,266.029,236.718,261.378,234.155,257.063z"/>
</g>
</g>
<radialGradient id="gradient_radial_dung"
cx="0" cy="0" r="60"
fx="0" fy="0" gradientUnits="userSpaceOnUse"
>
<stop offset="0" stop-color="#9a9a9a" />
<stop offset="0.70" stop-color="#bababa" />
<stop offset="0.95" stop-color="#FFFFFF" />
</radialGradient>
<g id="dung">
<circle cx="0" cy="0" r="60" fill="url(#gradient_radial_dung)" />
<g transform="translate(-61, -61)">
<!-- rough equivalent: <circle cx="0" cy="0" r="60" stroke="#8a8a8a" stroke-width="2" /> -->
<path fill="#8a8a8a" d="M0,61c0,33.636,27.364,61,61,61s61-27.364,61-61S94.636,0,61,0S0,27.364,0,61z
M2,61C2,28.467,28.467,2,61,2c32.532,0,59,26.467,59,59c0,32.533-26.468,59-59,59C28.467,120,2,93.533,2,61z"/>
</g>
<use xlink:href="#hacker_emblem" x="0" y="0" transform="scale(9)" />
</g>
<!-- scarab dimensions: 300x340 -->
<!-- dung dimensions: 120x120 (radius: 60) -->
<!-- scarab and dung dimensions: 300x400 -->
<g id="cairo_logo">
<!-- dimensions: 300x400, centered -->
<!-- The logo (scarab and dung), with the center-point of the bounding box at (0,0) -->
<use xlink:href="#dung" x="0" y="0" transform="translate(0, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 30)" />
</g>
<g id="cairo_logo_dung-centered">
<!-- The logo (scarab and dung), with the dung at (0,0), the scarab below -->
<use xlink:href="#dung" x="0" y="0" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0,170)" />
</g>
<g id="cairo_logo_scarab-centered">
<!-- The logo (scarab and dung), with the scarab's rotational center at (0,0), the dung above -->
<!-- The scarab's rotational center in this case is not the center of its bounding box,
but is calculated to be the intersection-point of the torso, spine and wings -->
<use xlink:href="#dung" x="0" y="0" transform="translate(0, -175.85)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -5.85)" />
</g>
<g id="cairo_logo_top-centered">
<!-- The logo (scarab and dung), with the top-center point of the bounding box at (0,0) -->
<use xlink:href="#dung" x="0" y="0" transform="translate(0, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 230)" /><!-- (0,170+60) -->
</g>
<g id="cairo_logo_bottom-centered">
<!-- The logo (scarab and dung), with the bottom-center point of the bounding box at (0,0) -->
<use xlink:href="#dung" x="0" y="0" transform="translate(0, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -170)" />
</g>
<g id="cairo_logo_right-centered">
<!-- The logo (scarab and dung), with the right-center point of the bounding box at (0,0) -->
<use xlink:href="#dung" x="0" y="0" transform="translate(-150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 30)" />
</g>
<g id="cairo_logo_left-centered">
<!-- The logo (scarab and dung), with the left-center point of the bounding box at (0,0) -->
<use xlink:href="#dung" x="0" y="0" transform="translate(150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 30)" />
</g>
<g id="cairo_logo_topleft-centered">
<!-- The logo (scarab and dung), with the top-left point of the bounding box at (0,0) -->
<use xlink:href="#dung" x="0" y="0" transform="translate(150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 230)" /><!-- (150, 170+60) -->
</g>
<g id="cairo_logo_topright-centered">
<!-- The logo (scarab and dung), with the top-right point of the bounding box at (0,0) -->
<use xlink:href="#dung" x="0" y="0" transform="translate(-150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 230)" /><!-- (-150,170+60) -->
</g>
<g id="cairo_logo_bottomleft-centered">
<!-- The logo (scarab and dung), with the bottom-left point of the bounding box at (0,0) -->
<use xlink:href="#dung" x="0" y="0" transform="translate(150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, -170)" />
</g>
<g id="cairo_logo_bottomright-centered">
<!-- The logo (scarab and dung), with the bottom-right point of the bounding box at (0,0) -->
<use xlink:href="#dung" x="0" y="0" transform="translate(-150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, -170)" />
</g>
<g id="cairo_text" transform="translate(0,-97)">
<g transform="scale(0.1484,0.1484)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(65,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(486.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1234.25,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1610,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small_spaced" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(379.5,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1341.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1826,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(261.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(764.75)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(988.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1355.5,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<g id="cairo_logo_text_small">
<!-- The logo on the left, the text 'cairo' on the right -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(0, 78), scale(0.1944)" />
<use xlink:href="#cairo_text_small" transform="translate(175,82)"/>
</g>
<g id="cairo_logo_with_text">
<!-- The logo (scarab and dung), with the text 'cairo' below, the dot of the 'i' positioned between the hind legs of the scarab -->
<!-- dimensions: 300x490, centered -->
<use xlink:href="#cairo_logo_top-centered" transform="translate(0, -245)" />
<use xlink:href="#cairo_text" transform="translate(0, 245)" />
</g>
<g id="cairo_banner">
<!-- The logo on the left, the text 'cairo' in the center, and a mirror image of the logo on the right -->
<!-- The logos are scaled such that the scarab body nearly matches the height of the text characters (excepting the 'i')
and the dung should nearly aligns with the dot of the 'i'. The bottoms of the logos are aligned with the bottom of the text. -->
<!-- dimensions: 370x88, centered -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(-180, 40), scale(0.1944)" />
<use xlink:href="#cairo_text_small" transform="translate(0, 42)" fill="black" />
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(180, 40), scale(0.1944), scale(-1, 1)" />
</g>
<g id="freedesktop_org_logo" style="fill:#FFFFFF;stroke:#3B80AE;stroke-width:2.4588;">
<g>
<path style="stroke:#BABABA;" d="M85.277,40.796c2.058,7.884-2.667,15.942-10.551,17.999L27.143,71.21c-7.884,2.057-15.943-2.667-18-10.552
l-7.448-28.55c-2.057-7.884,2.667-15.942,10.551-17.999L59.83,1.695c7.884-2.057,15.942,2.667,17.999,10.551
l7.449,28.55z"/>>
<path style="fill:#3B80AE;stroke:none;" d="M80.444,39.778c1.749,7.854-1.816,13.621-9.504,15.447l-42.236,11.02c-7.569,2.396-14.089-1.181
-15.838-8.836L6.53,33.127c-1.749-8.145,0.709-12.889,9.503-15.447L58.27,6.661
c8.144-1.826,14.089,1.363,15.838,8.835l6.336,24.282z"/>>
</g>g>
<path style="opacity:0.5;fill:none;stroke:#FFFFFF;" d="M45.542,51.793L24.104,31.102l38.1-4.393L45.542,51.793z"/>>
<path d="M72.325,28.769c0.405,1.55-0.525,3.136-2.075,3.541l-12.331,3.217c-1.551,0.404-3.137-0.525-3.542-2.076l-2.295-8.801
c-0.405-1.551,0.524-3.137,2.076-3.542l12.33-3.217c1.551-0.405,3.137,0.525,3.542,2.076l2.295,8.801z"/>>
<path d="M36.51,33.625c0.496,1.9-0.645,3.844-2.545,4.34l-15.112,3.943c-1.901,0.496-3.845-0.644-4.34-2.544l-2.814-10.786
c-0.496-1.901,0.644-3.844,2.544-4.34l15.113-3.942c1.901-0.496,3.845,0.643,4.34,2.544l2.814,10.786z"/>>
<path d="M52.493,53.208c0.278,1.065-0.36,2.154-1.425,2.432L42.6,57.848c-1.064,0.277-2.153-0.36-2.431-1.426l-1.577-6.043
c-0.277-1.064,0.36-2.153,1.425-2.432l8.468-2.209c1.064-0.277,2.154,0.361,2.431,1.426l1.577,6.043z"/>>
</g>g>
</defs>
<!-- Blue bar at top of slide -->
<rect x="0" y="0" width="1024" height="170" fill="#162284" />
<g font-family="Frutiger">
<!-- Slide title -->
<g id="slide_title" transform="translate(512, 133)">
<text text-anchor="middle"
fill="white"
font-weight="bold"
x="0"
y="4" font-size="55"
ss:variable="title">Slide Title</text>
</g>
<!-- Slide content -->
<g ss:region="default">
<rect x="112" y="200" width="800" height="480" fill="none" stroke="blue"/>
<text font-size="35" fill="black"
x="112" y="232">Slide content</text>
</g>
<!-- Footer -->
<text ss:variable="URL" x="1016" y="753" text-anchor="end" font-size="20">https://cairographics.org</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1,913 @@
<?xml version="1.0" ?>
<svg width="1024" height="768"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ss="http://www.svgslides.org/svgslides0.1"
fill="black">
<defs id="cairo-artwork_defs">
<g id="hacker_emblem">
<!-- Note: This is similar though not identical to Keith Packard's SVG version
of the hacker emblem (http://www.catb.org/hacker-emblem/glider.svg) -->
<g id="hacker_emblem_grid" fill="white" stroke="none">
<!-- Outside: Top, Right, Bottom, Left -->
<rect x="-2.95" y="-3.05" width="6" height="0.1" />
<rect x="2.95" y="-2.95" width="0.1" height="6" />
<rect x="-3.05" y="2.95" width="6" height="0.1" />
<rect x="-3.05" y="-3.05" width="0.1" height="6" />
<!-- Vertical: Left, Right -->
<rect x="-1.05" y="-2.95" width="0.1" height="5.9" />
<rect x="0.95" y="-2.95" width="0.1" height="5.9" />
<!-- Horizontal: TopLeft, TopMiddle, TopRight -->
<rect x="-2.95" y="-1.05" width="1.9" height="0.1" />
<rect x="-0.95" y="-1.05" width="1.9" height="0.1" />
<rect x="1.05" y="-1.05" width="1.9" height="0.1" />
<!-- Horizontal: BottomLeft, BottomMiddle, BottomRight -->
<rect x="-2.95" y="0.95" width="1.9" height="0.1" />
<rect x="-0.95" y="0.95" width="1.9" height="0.1" />
<rect x="1.05" y="0.95" width="1.9" height="0.1" />
</g>
<g id="hacker_emblem_dots" fill="white">
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<g id="scarab" fill="#f19a14">
<g transform="translate(-150, -170)">
<path id="scarab_head" d="M205.599,94.567c0-11.668-24.914-21.129-55.628-21.129
c-30.723,0-55.624,9.46-55.624,21.129c0,10.203,24.901,7.346,55.624,7.346C180.685,101.913,205.599,104.233,205.599,94.567z"/>
<path id="scarab_torso" d="M136.423,161.506c0,0,12.751,12.577,13.547,13.362
c2.262-2.232,13.545-13.362,13.545-13.362c7.135-7.036,87.111-6.399,91.066-6.363c-0.469-6.298-1.254-12.472-2.325-18.519
c-15.183-19.279-42.811-32.225-74.485-32.225h-55.518c-31.745,0-59.439,13.011-74.598,32.37c-1.054,6-1.829,12.128-2.296,18.374
C49.321,155.106,129.288,154.47,136.423,161.506z"/>
<path id="scarab_spine" d="M149.97,301.187c2.005-24.729,8.386-103.483,8.405-103.721
c-0.09-0.219-6.478-15.578-8.405-20.214c-1.936,4.655-8.316,19.995-8.408,20.214C141.582,197.704,147.965,276.458,149.97,301.187z"/>
<path id="scarab_wing_left" d="M140.403,197.149l8.862-21.31l-13.686-13.499
c-5.65-5.573-67.074-6.235-90.259-6.019l-0.006-0.622c-0.154,2.144-0.271,4.302-0.35,6.475
c-0.076,2.207,10.392,4.706,10.392,6.717c0,2.319-10.457,5.084-10.359,7.631c2.993,73.349,48.53,131.631,104.372,132.048
l-9.02-111.29L140.403,197.149z"/>
<path id="scarab_wing_right" d="M244.585,168.891c0-2.011,10.467-4.506,10.391-6.715
c-0.079-2.174-0.195-4.332-0.351-6.479l-0.004,0.624c-23.186-0.216-84.608,0.445-90.26,6.017l-13.688,13.502l8.915,21.438
l-9.017,111.29c55.854-0.417,101.378-58.698,104.373-132.049C255.04,173.976,244.585,171.209,244.585,168.891z"/>
<path id="scarab_leg_front_left" d="M44.506,141.12c-4.135-0.856-4.895-1.54-7.935-2.92
c-9.59-3.364-10.376-5.481-16.08-11.86c-7.426-8.306-12.661-20.142-17.1-29.463c-3.576-7.525-3.984-16.409-2.86-24.273
c0.991-6.935,7.144-12.869,12.074-18.92c5.844-7.191,10.356-14.822,17.924-21.354c7.736-6.682,23.203-9.809,26.168-19.648
C57.86,8.819,54.334,1.766,61.482,0c-0.366,4.703,3.639,8.477,2.397,13.575c-1.129,4.627-4.368,5.811-9.611,9.099
c-7.564,4.746-18.366,8.779-24.748,13.965c-7.175,5.827-4.369,13.771-10.569,20.057c-2.001,2.03-7.901,4.706-9.137,6.83
c-1.861,3.199-0.297,9.572-0.116,13.12c0.425,8.284,5.588,14.244,9.555,22.045c4.152,8.141,6.429,15.409,13.411,22.519
c4.183,4.262,11.429,4.802,16.21,10.647l-3.555,4.186L44.506,141.12z"/>
<path id="scarab_leg_middle_left" d="M43.94,191.922l-0.809-7.346
c-9.506-4.579-10.339-9.772-20.738-12.466c-23.728-6.151-21.361,11.25-15.532,26.373c5.676,14.726,8.237,30.23,14.345,44.795
c2.805,6.688,6.919,13.213,14.298,15.127c0.372-8.435-0.917-10.651-6.113-16.919c-4.395-5.293-3.326-12.548-6.072-18.504
c-3.581-7.804-4.196-15.646-7.279-23.502c-1.363-3.479-8.33-13.966-6.452-17.861c3.183-6.603,9.178-0.083,12.179,2.077
c4.218,3.036,6.467,2.223,11.681,2.898C34.041,186.673,37.005,188.756,43.94,191.922z"/>
<path id="scarab_leg_back_left" d="M65.839,257.063l-2.771-4.837
c-6.68,8.928-6.993,16.228-10.056,23.347c-5.277,12.263-0.157,28.851,9.854,37.676c6.052,5.375,15.907,9.618,23.122,13.136
c10.035,4.892,20.113,11.286,31.336,13.396c2.482,0.466,8.798,1.295,6.693-3.522c-0.975-2.237-8.091-4.591-10.146-5.734
c-8.312-4.623-16.377-10.524-24.142-16.176c-9.498-6.862-20.843-11.186-28.311-20.684c-3.054-3.885-3.544-4.922-2.816-9.39
c0.693-4.263,1.344-9.174,2.241-13.439C61.855,266.029,63.274,261.378,65.839,257.063z"/>
<path id="scarab_leg_front_right" d="M255.487,141.12c4.134-0.856,4.896-1.54,7.936-2.92
c9.583-3.364,10.369-5.481,16.071-11.86c7.428-8.306,12.661-20.142,17.115-29.463c3.574-7.525,3.983-16.409,2.86-24.273
c-0.992-6.935-7.157-12.869-12.087-18.92c-5.843-7.191-10.356-14.822-17.919-21.354c-7.735-6.682-23.202-9.809-26.167-19.648
C242.135,8.819,245.66,1.766,238.511,0c0.366,4.703-3.637,8.477-2.396,13.575c1.131,4.627,4.368,5.811,9.611,9.099
c7.563,4.746,18.367,8.779,24.747,13.965c7.17,5.827,4.362,13.771,10.563,20.057c2.001,2.03,7.901,4.706,9.139,6.83
c1.859,3.199,0.295,9.572,0.113,13.12c-0.424,8.284-5.588,14.244-9.553,22.045c-4.152,8.141-6.431,15.409-13.404,22.519
c-4.184,4.262-11.429,4.802-16.211,10.647l3.556,4.186L255.487,141.12z"/>
<path id="scarab_leg_middle_right" d="M256.053,191.922l0.81-7.346
c9.507-4.579,10.34-9.772,20.73-12.466c23.741-6.151,21.374,11.25,15.534,26.373c-5.676,14.726-8.238,30.23-14.347,44.795
c-2.804,6.688-6.911,13.213-14.291,15.127c-0.371-8.435,0.918-10.651,6.113-16.919c4.39-5.293,3.319-12.548,6.066-18.504
c3.58-7.804,4.197-15.646,7.278-23.502c1.363-3.479,8.33-13.966,6.453-17.861c-3.184-6.603-9.179-0.083-12.181,2.077
c-4.217,3.036-6.458,2.223-11.672,2.898C265.951,186.673,262.986,188.756,256.053,191.922z"/>
<path id="scarab_leg_back_right" d="M234.155,257.063l2.771-4.837
c6.679,8.928,6.991,16.228,10.057,23.347c5.274,12.263,0.154,28.851-9.854,37.676c-6.055,5.375-15.903,9.618-23.117,13.136
c-10.034,4.892-20.127,11.286-31.351,13.396c-2.481,0.466-8.789,1.295-6.691-3.522c0.976-2.237,8.092-4.591,10.146-5.734
c8.312-4.623,16.392-10.524,24.155-16.176c9.498-6.862,20.838-11.186,28.305-20.684c3.055-3.885,3.543-4.922,2.818-9.39
c-0.696-4.263-1.346-9.174-2.244-13.439C238.137,266.029,236.718,261.378,234.155,257.063z"/>
</g>
</g>
<radialGradient id="gradient_radial_dung"
cx="0" cy="0" r="60"
fx="0" fy="0" gradientUnits="userSpaceOnUse"
>
<stop offset="0" stop-color="#9a9a9a" />
<stop offset="0.70" stop-color="#bababa" />
<stop offset="0.95" stop-color="#FFFFFF" />
</radialGradient>
<g id="dung">
<circle cx="0" cy="0" r="60" fill="url(#gradient_radial_dung)" />
<g transform="translate(-61, -61)">
<!-- rough equivalent: <circle cx="0" cy="0" r="60" stroke="#8a8a8a" stroke-width="2" /> -->
<path fill="#8a8a8a" d="M0,61c0,33.636,27.364,61,61,61s61-27.364,61-61S94.636,0,61,0S0,27.364,0,61z
M2,61C2,28.467,28.467,2,61,2c32.532,0,59,26.467,59,59c0,32.533-26.468,59-59,59C28.467,120,2,93.533,2,61z"/>
</g>
<use xlink:href="#hacker_emblem" x="0" y="0" transform="scale(9)" />
</g>
<g id="dung_2_color">
<!-- This would be simple a circle like so:
<circle cx="0" cy="0" r="48" stroke-width="2" fill="none" stroke="white"/>
but there appears to currently be a bug in the cairo
PDF backend that results in an ugly spike in that
case. So we use 8 splines instead.
-->
<path stroke-width="4" stroke="white" fill="none" d="
M 48, 0
C 48, 12.730391512298112,
42.94287166245995, 24.939379331448613
33.941125496954285, 33.941125496954278
C 24.939379331448624, 42.942871662459943
12.730391512298114, 48
0, 48
C -12.730391512298109, 48,
-24.939379331448613, 42.94287166245995
-33.941125496954278, 33.941125496954285
C -42.942871662459943, 24.939379331448624,
-48, 12.730391512298118,
-48, 0,
C -48, -12.730391512298105,
-42.94287166245995, -24.939379331448613,
-33.941125496954285, -33.941125496954278
C -24.939379331448624, -42.942871662459943,
-12.730391512298119, -48,
0, -48
C 12.730391512298104, -48,
24.939379331448606, -42.942871662459943,
33.941125496954271, -33.941125496954285
C 42.942871662459936, -24.939379331448624,
48, -12.730391512298123,
48, 0" />
<g transform="scale(9)" fill="white" stroke="none" stroke-width="0.22222">
<!-- Hacker emblem grid -->
<!--
<path stroke="white" fill="none"
d="M -3,-3 L 3,-3 L 3,3 L-3,3 Z
M -1,-3 L -1, 3
M 1,-3 L 1, 3
M -3,-1 L 3,-1
M -3, 1 L 3, 1"/>
-->
<!-- Hacker emblem dots -->
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<!-- scarab dimensions: 300x340 -->
<!-- dung dimensions: 120x120 (radius: 60) -->
<!-- scarab and dung dimensions: 300x400 -->
<g id="cairo_logo">
<!-- dimensions: 300x400, centered -->
<!-- The logo (scarab and dung), with the center-point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 30)" />
</g>
<g id="cairo_logo_dung-centered">
<!-- The logo (scarab and dung), with the dung at (0,0), the scarab below -->
<use xlink:href="#dung_2_color" x="0" y="0" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0,170)" />
</g>
<g id="cairo_logo_scarab-centered">
<!-- The logo (scarab and dung), with the scarab's rotational center at (0,0), the dung above -->
<!-- The scarab's rotational center in this case is not the center of its bounding box,
but is calculated to be the intersection-point of the torso, spine and wings -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -175.85)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -5.85)" />
</g>
<g id="cairo_logo_top-centered">
<!-- The logo (scarab and dung), with the top-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 230)" /><!-- (0,170+60) -->
</g>
<g id="cairo_logo_bottom-centered">
<!-- The logo (scarab and dung), with the bottom-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -170)" />
</g>
<g id="cairo_logo_right-centered">
<!-- The logo (scarab and dung), with the right-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 30)" />
</g>
<g id="cairo_logo_left-centered">
<!-- The logo (scarab and dung), with the left-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 30)" />
</g>
<g id="cairo_logo_topleft-centered">
<!-- The logo (scarab and dung), with the top-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 230)" /><!-- (150, 170+60) -->
</g>
<g id="cairo_logo_topright-centered">
<!-- The logo (scarab and dung), with the top-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 230)" /><!-- (-150,170+60) -->
</g>
<g id="cairo_logo_bottomleft-centered">
<!-- The logo (scarab and dung), with the bottom-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, -170)" />
</g>
<g id="cairo_logo_bottomright-centered">
<!-- The logo (scarab and dung), with the bottom-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, -170)" />
</g>
<g id="cairo_text" transform="translate(0,-97)">
<g transform="scale(0.1484,0.1484)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(65,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(486.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1234.25,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1610,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small_spaced" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(379.5,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1341.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1826,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(261.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(764.75)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(988.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1355.5,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<g id="cairo_logo_text_small">
<!-- The logo on the left, the text 'cairo' on the right -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(0, 78), scale(0.1944)" />
<use xlink:href="#cairo_text_small" fill="white" transform="translate(175,82)"/>
</g>
<g id="cairo_logo_with_text">
<!-- The logo (scarab and dung), with the text 'cairo' below, the dot of the 'i' positioned between the hind legs of the scarab -->
<!-- dimensions: 300x490, centered -->
<use xlink:href="#cairo_logo_top-centered" transform="translate(0, -245)" />
<use xlink:href="#cairo_text" transform="translate(0, 245)" />
</g>
<g id="cairo_banner">
<!-- The logo on the left, the text 'cairo' in the center, and a mirror image of the logo on the right -->
<!-- The logos are scaled such that the scarab body nearly matches the height of the text characters (excepting the 'i')
and the dung should nearly aligns with the dot of the 'i'. The bottoms of the logos are aligned with the bottom of the text. -->
<!-- dimensions: 370x88, centered -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(-180, 40), scale(0.1944)" />
<use xlink:href="#cairo_text_small" transform="translate(0, 42)" fill="black" />
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(180, 40), scale(0.1944), scale(-1, 1)" />
</g>
<g id="freedesktop_org_logo" style="fill:#FFFFFF;stroke:#3B80AE;stroke-width:2.4588;">
<g>
<path style="stroke:#BABABA;" d="M85.277,40.796c2.058,7.884-2.667,15.942-10.551,17.999L27.143,71.21c-7.884,2.057-15.943-2.667-18-10.552
l-7.448-28.55c-2.057-7.884,2.667-15.942,10.551-17.999L59.83,1.695c7.884-2.057,15.942,2.667,17.999,10.551
l7.449,28.55z"/>>
<path style="fill:#3B80AE;stroke:none;" d="M80.444,39.778c1.749,7.854-1.816,13.621-9.504,15.447l-42.236,11.02c-7.569,2.396-14.089-1.181
-15.838-8.836L6.53,33.127c-1.749-8.145,0.709-12.889,9.503-15.447L58.27,6.661
c8.144-1.826,14.089,1.363,15.838,8.835l6.336,24.282z"/>>
</g>g>
<path style="opacity:0.5;fill:none;stroke:#FFFFFF;" d="M45.542,51.793L24.104,31.102l38.1-4.393L45.542,51.793z"/>>
<path d="M72.325,28.769c0.405,1.55-0.525,3.136-2.075,3.541l-12.331,3.217c-1.551,0.404-3.137-0.525-3.542-2.076l-2.295-8.801
c-0.405-1.551,0.524-3.137,2.076-3.542l12.33-3.217c1.551-0.405,3.137,0.525,3.542,2.076l2.295,8.801z"/>>
<path d="M36.51,33.625c0.496,1.9-0.645,3.844-2.545,4.34l-15.112,3.943c-1.901,0.496-3.845-0.644-4.34-2.544l-2.814-10.786
c-0.496-1.901,0.644-3.844,2.544-4.34l15.113-3.942c1.901-0.496,3.845,0.643,4.34,2.544l2.814,10.786z"/>>
<path d="M52.493,53.208c0.278,1.065-0.36,2.154-1.425,2.432L42.6,57.848c-1.064,0.277-2.153-0.36-2.431-1.426l-1.577-6.043
c-0.277-1.064,0.36-2.153,1.425-2.432l8.468-2.209c1.064-0.277,2.154,0.361,2.431,1.426l1.577,6.043z"/>>
</g>g>
<g id="bullet">
<use x="0" y="0" xlink:href="#cairo_logo" transform="translate(-6,-2) scale(0.1, 0.1)"/>>
</g>
<g id="redhat_logo_horizontal">
<!-- 380x125 Red Hat log (horizontal layout) -->
<g fill="black" stroke="none"
transform="translate(0,124),scale(1,-1),translate(-214,-258)"
fill-rule="evenodd"
>
<!-- r -->
<path fill="black" d="
M 367.0625 315.3203
C 367.0625 320.8765 366.9463 324.9644 366.7227 328.6597
L 375.811 328.6597
L 376.2002 320.7764
L 376.4971 320.7764
C 378.5391 326.6221 383.3809 329.5996 387.8594 329.5996
C 388.8843 329.5996 389.4824 329.5601 390.3218 329.373
L 390.3218 319.4863
C 389.3398 319.6763 388.4224 319.7842 387.1592 319.7842
C 382.1597 319.7842 378.688 316.6006 377.751 311.8447
C 377.5732 310.918 377.4805 309.8086 377.4805 308.6777
L 377.4805 287.1504
L 366.9766 287.1504
L 367.0625 315.3203
" />
<!-- e -->
<path fill="black" d="
M 402.9927 305.0791
C 403.2715 297.5586 409.0918 294.2695 415.814 294.2695
C 420.6406 294.2695 424.0942 295.0234 427.2681 296.1924
L 428.8232 288.9678
C 425.269 287.4629 420.3413 286.3359 414.3149 286.3359
C 400.8384 286.3359 392.9409 294.6592 392.9409 307.3809
C 392.9409 318.8369 399.8911 329.6772 413.2437 329.6772
C 426.7397 329.6772 431.1338 318.5771 431.1338 309.4893
C 431.1338 307.5381 430.9624 305.9707 430.7593 305.0059
L 402.9927 305.0791
M 421.2485 312.3926
C 421.2954 316.2388 419.6206 322.5088 412.5903 322.5088
C 406.1299 322.5088 403.4438 316.645 402.9722 312.3926
L 421.2485 312.3926
" />
<!-- d -->
<path fill="black" d="
M 476.355 344.667
L 465.8638 347.5083
L 465.8638 324.1914
L 465.6904 324.1914
C 463.8335 327.2563 459.7407 329.5996 454.0571 329.5996
C 444.0762 329.5996 435.3828 321.3374 435.4478 307.4307
C 435.4478 294.6719 443.2983 286.2168 453.2119 286.2168
C 459.2017 286.2168 464.2114 289.0723 466.6909 293.7217
L 466.8779 293.7217
L 467.3491 287.1504
L 476.6997 287.1504
C 476.5083 289.9717 476.355 294.543 476.355 298.792
L 476.355 344.667
M 465.8638 305.1504
C 465.8638 304.0479 465.7856 303.0234 465.5454 302.0869
C 464.4873 297.5439 460.7734 294.6172 456.4819 294.6172
C 449.8721 294.6172 446.0903 300.1885 446.0903 307.8164
C 446.0903 315.5166 449.8384 321.4761 456.6016 321.4761
C 461.3208 321.4761 464.6992 318.1484 465.6274 314.1064
C 465.8071 313.2559 465.8638 312.208 465.8638 311.3711
L 465.8638 305.1504
" />
<!-- h -->
<path fill="black" d="
M 503.7964 329.0176
C 500.6836 329.0176 497.8926 328.1187 495.5493 326.6714
C 493.1162 325.2461 491.1353 323.0464 489.959 320.7666
L 489.7915 320.7666
L 489.7915 341.0195
L 485.7427 342.1226
L 485.7427 287.1504
L 489.7915 287.1504
L 489.7915 312.1787
C 489.7915 313.8408 489.9204 314.9946 490.3462 316.2109
C 492.0928 321.3013 496.8896 325.4805 502.689 325.4805
C 511.0664 325.4805 513.9673 318.7603 513.9673 311.3906
L 513.9673 287.1504
L 518.0137 287.1504
L 518.0137 311.8359
C 518.0137 327.0791 507.6753 329.0176 503.7964 329.0176
" />
<!-- a -->
<path fill="black" d="
M 554.3413 296.873
C 554.3413 293.6357 554.4692 290.2832 554.9375 287.1504
L 551.2085 287.1504
L 550.6128 293.0156
L 550.4209 293.0156
C 548.438 289.8594 543.8765 286.2168 537.3726 286.2168
C 529.1392 286.2168 525.3057 292.0117 525.3057 297.4688
C 525.3057 306.9121 533.6421 312.6064 550.292 312.4321
L 550.292 313.5234
C 550.292 317.5718 549.5044 325.6475 539.8242 325.5859
C 536.2446 325.5859 532.5132 324.6255 529.5513 322.5366
L 528.2632 325.4805
C 532.0015 328.0137 536.5659 329.0176 540.2705 329.0176
C 552.0801 329.0176 554.3413 320.1509 554.3413 312.8379
L 554.3413 296.873
M 550.292 309.0234
C 541.3813 309.2813 529.6128 307.9336 529.6128 298.1055
C 529.6128 292.2246 533.4946 289.5811 537.7578 289.5811
C 544.5796 289.5811 548.4561 293.8018 549.8677 297.7871
C 550.1646 298.6621 550.292 299.5371 550.292 300.2402
L 550.292 309.0234
" />
<!-- t -->
<path fill="black" d="
M 570.459 337.0996
L 570.459 328.0801
L 582.1235 328.0801
L 582.1235 324.7959
L 570.459 324.7959
L 570.459 298.1943
C 570.459 292.9912 572.0757 289.7285 576.4692 289.7285
C 578.5815 289.7285 580.0757 290.0078 581.1206 290.3711
L 581.6099 287.2354
C 580.2871 286.6836 578.4302 286.2539 575.9619 286.2539
C 572.9741 286.2539 570.4995 287.1934 568.8994 289.1543
C 567.0469 291.3057 566.4116 294.7412 566.4116 298.916
L 566.4116 324.7959
L 559.5059 324.7959
L 559.5059 328.0801
L 566.4116 328.0801
L 566.4116 335.606
L 570.459 337.0996
" />
<!-- ® for 'redhat' -->
<path fill="black" d="
M 335.5 288.9707
L 336.0352 288.9707
L 336.8408 287.6445
L 337.3608 287.6445
L 336.4888 288.9937
C 336.9404 289.0498 337.2832 289.2881 337.2832 289.834
C 337.2832 290.4385 336.9258 290.7051 336.2017 290.7051
L 335.0366 290.7051
L 335.0366 287.6445
L 335.5 287.6445
L 335.5 288.9707
M 335.5 289.3643
L 335.5 290.3101
L 336.1318 290.3101
C 336.4531 290.3101 336.7979 290.2402 336.7979 289.8647
C 336.7979 289.3916 336.4492 289.3643 336.0566 289.3643
L 335.5 289.3643
" />
<path fill="black" d="
M 339.0439 289.1719
C 339.0439 287.5176 337.7041 286.1763 336.0493 286.1763
C 334.395 286.1763 333.0527 287.5176 333.0527 289.1719
C 333.0527 290.8271 334.395 292.1675 336.0493 292.1675
C 337.7041 292.1675 339.0439 290.8271 339.0439 289.1719
M 336.0493 291.6367
C 334.6865 291.6367 333.5835 290.5332 333.5835 289.1719
C 333.5835 287.8096 334.6865 286.7061 336.0493 286.7061
C 337.4082 286.7061 338.5117 287.8096 338.5117 289.1719
C 338.5117 290.5332 337.4082 291.6367 336.0493 291.6367
" />
<!-- Black background behind The Shadowman -->
<path fill="black" d="
M 326.4531 286.208
C 324.1177 286.7451 321.6396 287.0801 319.1338 287.0801
C 314.8496 287.0801 310.9502 286.3389 308.0732 285.1426
C 307.7559 284.9844 307.5303 284.6533 307.5303 284.2764
C 307.5303 284.1406 307.5654 283.999 307.6172 283.8838
C 307.957 282.8975 307.3984 281.8281 304.6157 281.2158
C 300.4883 280.3096 297.8833 276.0527 296.3916 274.6367
C 294.6411 272.9756 289.6973 271.9531 290.4404 272.9434
C 291.0225 273.7188 293.2485 276.1348 294.6016 278.748
C 295.8125 281.083 296.8906 281.7461 298.375 283.9736
C 298.811 284.627 300.4995 286.9219 300.9912 288.7373
C 301.543 290.5107 301.356 292.7344 301.5679 293.6494
C 301.8721 294.9697 303.1182 297.8369 303.2129 299.4531
C 303.2666 300.3691 299.3916 298.1494 297.5532 298.1494
C 295.7144 298.1494 293.9233 299.248 292.2808 299.3281
C 290.248 299.4248 288.9414 297.7607 287.1025 298.0508
C 286.0518 298.2178 285.167 299.1426 283.3311 299.2129
C 280.7178 299.3086 277.5244 297.7607 271.5264 297.9531
C 265.6255 298.1436 260.1753 305.4082 259.4312 306.5635
C 258.5605 307.9199 257.4961 307.9199 256.335 306.8555
C 255.1738 305.792 253.7432 306.627 253.3359 307.3389
C 252.5615 308.6943 250.4927 312.6543 247.2881 313.4824
C 242.8564 314.6309 240.6118 311.0283 240.9033 308.1621
C 241.1987 305.252 243.0801 304.4375 243.9512 302.8906
C 244.8213 301.3428 245.2671 300.3428 246.9053 299.6572
C 248.0674 299.1758 248.5 298.458 248.1533 297.5049
C 247.8506 296.6738 246.6416 296.4834 245.8477 296.4463
C 244.1592 296.3662 242.9756 296.8242 242.1123 297.376
C 241.1084 298.0137 240.292 298.9033 239.416 300.4131
C 238.4023 302.0781 236.8052 302.8037 234.9453 302.8037
C 234.0586 302.8037 233.2295 302.5693 232.4922 302.1895
C 229.5771 300.6748 226.1064 299.7744 222.3706 299.7744
L 218.1572 299.7734
C 216.1064 305.8555 214.9951 312.3682 214.9951 319.1416
C 214.9951 352.6064 242.1226 379.7334 275.5859 379.7334
C 309.0498 379.7334 336.1758 352.6064 336.1758 319.1416
C 336.1758 307 332.6035 295.6895 326.4531 286.208
" />
<!-- The Shadowman's face -->
<path fill="white" d="
M 326.4531 286.209
C 324.1177 286.7461 321.6396 287.084 319.1338 287.084
C 314.8496 287.084 310.9502 286.3418 308.0732 285.1436
C 307.7559 284.9873 307.5303 284.6553 307.5303 284.2783
C 307.5303 284.1416 307.5654 284.001 307.6172 283.8838
C 307.957 282.8994 307.3984 281.8311 304.6157 281.2178
C 300.4883 280.3115 297.8833 276.0537 296.3916 274.6416
C 294.6411 272.9766 289.6973 271.9551 290.4404 272.9463
C 291.0225 273.7197 293.2485 276.1367 294.6016 278.749
C 295.8125 281.083 296.8906 281.75 298.375 283.9756
C 298.811 284.627 300.4995 286.9238 300.9912 288.7402
C 301.543 290.5117 301.356 292.7354 301.5679 293.6514
C 301.8721 294.9727 303.1182 297.8379 303.2129 299.457
C 303.2666 300.3721 299.3916 298.1504 297.5532 298.1504
C 295.7144 298.1504 293.9233 299.251 292.2808 299.3301
C 290.248 299.4258 288.9414 297.7627 287.1025 298.0518
C 286.0518 298.2207 285.167 299.1465 283.3311 299.2148
C 280.7178 299.3096 277.5244 297.7627 271.5264 297.9561
C 265.6255 298.1475 260.1753 305.4121 259.4312 306.5674
C 258.5605 307.9219 257.4961 307.9219 256.335 306.8574
C 255.1738 305.7939 253.7432 306.6299 253.3359 307.3438
C 252.5615 308.6963 250.4927 312.6553 247.2881 313.4854
C 242.8564 314.6338 240.6118 311.0313 240.9033 308.1641
C 241.1987 305.2539 243.0801 304.4395 243.9512 302.8926
C 244.8213 301.3438 245.2671 300.3457 246.9053 299.6621
C 248.0674 299.1768 248.5 298.4609 248.1533 297.5068
C 247.8506 296.6768 246.6416 296.4873 245.8477 296.4492
C 244.1592 296.3672 242.9756 296.8262 242.1123 297.376
C 241.1084 298.0176 240.292 298.9043 239.416 300.416
C 238.4023 302.0801 236.8052 302.8086 234.9453 302.8086
C 234.0586 302.8086 233.2295 302.5723 232.4922 302.1934
C 229.5771 300.6748 226.1064 299.7773 222.3706 299.7773
L 218.1572 299.7744
C 226.2363 275.8105 248.8965 258.5527 275.5859 258.5527
C 296.9063 258.5527 315.6538 269.5635 326.4531 286.209
" />
<!-- nose shadow -->
<path fill="black" d="
M 288.9307 291.7637
C 289.2422 291.46 289.7793 290.4375 289.1226 289.1396
C 288.7544 288.4521 288.3579 287.9678 287.6489 287.4023
C 286.7969 286.7188 285.1309 285.9307 282.8457 287.3799
C 281.6172 288.1592 281.543 288.4209 279.8467 288.2012
C 278.6348 288.043 278.1533 289.2656 278.5884 290.2832
C 279.0244 291.2969 280.8145 292.1191 283.04 290.8135
C 284.041 290.2256 285.6025 288.9844 286.9688 290.084
C 287.5356 290.5381 287.875 290.8408 288.6611 291.75
C 288.6963 291.7881 288.7461 291.8105 288.8018 291.8105
C 288.8516 291.8105 288.8965 291.793 288.9307 291.7637
" />
<!-- The Shadowman's red hat -->
<path fill="#cc0000" d="
M 309.7769 335.2627
C 309.1787 333.251 308.3271 330.6763 304.5391 328.7314
C 303.9878 328.4497 303.7764 328.9126 304.0313 329.3477
C 305.4629 331.7832 305.7168 332.3921 306.1328 333.3525
C 306.7148 334.7568 307.02 336.7549 305.8618 340.9219
C 303.5835 349.1221 298.8296 360.083 295.375 363.6392
C 292.04 367.0698 285.998 368.0361 280.5371 366.6348
C 278.5264 366.1191 274.5918 364.0732 267.2939 365.7168
C 254.665 368.5605 252.7939 362.2368 252.0693 359.4824
C 251.3438 356.7271 249.6045 348.897 249.6045 348.897
C 249.0244 345.7085 248.2646 340.1631 267.874 336.4287
C 277.0088 334.6885 277.4736 332.3276 277.8779 330.6289
C 278.603 327.585 279.7627 325.8438 281.0674 324.9746
C 282.373 324.1035 281.0674 323.3828 279.6187 323.2349
C 275.7285 322.8311 261.3491 326.9541 252.8428 331.7881
C 245.8828 336.0415 245.7656 339.8721 247.3584 343.1211
C 236.8452 344.2573 228.9561 342.1348 227.5254 337.1582
C 225.0693 328.6157 246.3047 314.0264 270.4839 306.7061
C 295.8579 299.0225 321.9556 304.3857 324.8564 320.335
C 326.1738 327.5811 320.0713 332.9419 309.7769 335.2627
" />
<!-- shadow on hat -->
<path fill="black" d="
M 270.8711 350.8813
C 263.8721 350.375 263.145 349.6191 261.834 348.2227
C 259.9854 346.2539 257.5508 350.7773 257.5508 350.7773
C 256.0898 351.085 254.3179 353.4404 255.2744 355.6411
C 256.2158 357.8174 257.9551 357.1641 258.5 356.4868
C 259.1626 355.6621 260.5771 354.3125 262.4141 354.3613
C 264.251 354.4097 266.3706 354.7959 269.3262 354.7959
C 272.3213 354.7959 274.335 353.6777 274.4487 352.7168
C 274.5459 351.8965 274.2061 351.1226 270.8711 350.8813
" />
<!-- another shadow on hat -->
<path fill="black" d="
M 278.2236 362.4463
C 278.2129 362.4453 278.2021 362.4438 278.1919 362.4438
C 278.084 362.4438 277.9961 362.5273 277.9961 362.6274
C 277.9961 362.7007 278.041 362.7646 278.106 362.7939
C 279.4629 363.5107 281.4873 364.0811 283.8042 364.3169
C 284.499 364.3887 285.1787 364.4248 285.832 364.4307
C 285.9478 364.4307 286.0615 364.4297 286.1787 364.4277
C 290.062 364.3398 293.1719 362.7974 293.1255 360.9814
C 293.0791 359.165 289.8955 357.7637 286.0112 357.8506
C 284.7529 357.8794 283.5732 358.0615 282.5576 358.3545
C 282.4385 358.3857 282.3506 358.4883 282.3506 358.6094
C 282.3506 358.731 282.4385 358.834 282.5605 358.8638
C 284.9839 359.4248 286.6191 360.3408 286.5039 361.207
C 286.3511 362.3545 283.1816 362.979 279.4248 362.6011
C 279.0137 362.5596 278.6118 362.5068 278.2236 362.4463
" />
<!-- ® for The Shadowman -->
<path fill="black" d="
M 588.3018 288.9707
L 588.8369 288.9707
L 589.6426 287.6445
L 590.1626 287.6445
L 589.2905 288.9937
C 589.7422 289.0498 590.085 289.2881 590.085 289.834
C 590.085 290.4385 589.7275 290.7051 589.0034 290.7051
L 587.8384 290.7051
L 587.8384 287.6445
L 588.3018 287.6445
L 588.3018 288.9707
M 588.3018 289.3643
L 588.3018 290.3101
L 588.9336 290.3101
C 589.2549 290.3101 589.5996 290.2402 589.5996 289.8647
C 589.5996 289.3916 589.251 289.3643 588.8584 289.3643
L 588.3018 289.3643
" />
<path fill="black" d="
M 591.8457 289.1719
C 591.8457 287.5176 590.5059 286.1763 588.8511 286.1763
C 587.1968 286.1763 585.8545 287.5176 585.8545 289.1719
C 585.8545 290.8271 587.1968 292.1675 588.8511 292.1675
C 590.5059 292.1675 591.8457 290.8271 591.8457 289.1719
M 588.8511 291.6367
C 587.4883 291.6367 586.3853 290.5332 586.3853 289.1719
C 586.3853 287.8096 587.4883 286.7061 588.8511 286.7061
C 590.21 286.7061 591.3135 287.8096 591.3135 289.1719
C 591.3135 290.5332 590.21 291.6367 588.8511 291.6367
" />
</g>
</g>
</defs>
<g id="watermark" transform="translate(200, 185), rotate(-50), scale(2.5)">
<use xlink:href="#scarab" x="0" y="170" fill-opacity="0.2"/>
</g>
<!-- Blue bar at top of slide -->
<rect x="0" y="0" width="1024" height="170" fill="#162284" />
<!-- Scarab and "cairo" at upper-left -->
<g transform="translate(10,0)">
<use stroke="none" xlink:href="#cairo_logo_text_small"/>
</g>
<!-- Presentation title at upper-right -->
<text ss:variable="presentation-subtitle" text-anchor="end"
fill="white" x="1016" y="28" font-size="20">Presentation Sub-title</text>
<!-- Red Hat logo at lower-left -->
<use xlink:href="#redhat_logo_horizontal" transform="translate(8,768),scale(.5,.5),translate(0, -125)" />
<g font-family="Frutiger">
<!-- Slide title -->
<g id="slide_title" transform="translate(512, 133)">
<text text-anchor="middle"
fill="white"
font-weight="bold"
x="0"
y="4" font-size="55"
ss:variable="title">Slide Title</text>
</g>
<!-- Slide content -->
<g ss:region="default" font-family="Mono">
<rect x="112" y="170" width="800" height="480" fill="none" stroke="blue"/>
<text font-size="20" fill="black"
x="112" y="190">Slide content</text>
</g>
<!-- Footer -->
<text ss:variable="URL" x="1016" y="753" text-anchor="end" font-size="20">https://cairographics.org</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 40 KiB

@@ -0,0 +1,899 @@
<?xml version="1.0" ?>
<svg width="1024" height="768"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ss="http://www.svgslides.org/svgslides0.1"
fill="black">
<defs id="cairo-artwork_defs">
<g id="hacker_emblem">
<!-- Note: This is similar though not identical to Keith Packard's SVG version
of the hacker emblem (http://www.catb.org/hacker-emblem/glider.svg) -->
<g id="hacker_emblem_grid" fill="white" stroke="none">
<!-- Outside: Top, Right, Bottom, Left -->
<rect x="-2.95" y="-3.05" width="6" height="0.1" />
<rect x="2.95" y="-2.95" width="0.1" height="6" />
<rect x="-3.05" y="2.95" width="6" height="0.1" />
<rect x="-3.05" y="-3.05" width="0.1" height="6" />
<!-- Vertical: Left, Right -->
<rect x="-1.05" y="-2.95" width="0.1" height="5.9" />
<rect x="0.95" y="-2.95" width="0.1" height="5.9" />
<!-- Horizontal: TopLeft, TopMiddle, TopRight -->
<rect x="-2.95" y="-1.05" width="1.9" height="0.1" />
<rect x="-0.95" y="-1.05" width="1.9" height="0.1" />
<rect x="1.05" y="-1.05" width="1.9" height="0.1" />
<!-- Horizontal: BottomLeft, BottomMiddle, BottomRight -->
<rect x="-2.95" y="0.95" width="1.9" height="0.1" />
<rect x="-0.95" y="0.95" width="1.9" height="0.1" />
<rect x="1.05" y="0.95" width="1.9" height="0.1" />
</g>
<g id="hacker_emblem_dots" fill="white">
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<g id="scarab" fill="#f19a14">
<g transform="translate(-150, -170)">
<path id="scarab_head" d="M205.599,94.567c0-11.668-24.914-21.129-55.628-21.129
c-30.723,0-55.624,9.46-55.624,21.129c0,10.203,24.901,7.346,55.624,7.346C180.685,101.913,205.599,104.233,205.599,94.567z"/>
<path id="scarab_torso" d="M136.423,161.506c0,0,12.751,12.577,13.547,13.362
c2.262-2.232,13.545-13.362,13.545-13.362c7.135-7.036,87.111-6.399,91.066-6.363c-0.469-6.298-1.254-12.472-2.325-18.519
c-15.183-19.279-42.811-32.225-74.485-32.225h-55.518c-31.745,0-59.439,13.011-74.598,32.37c-1.054,6-1.829,12.128-2.296,18.374
C49.321,155.106,129.288,154.47,136.423,161.506z"/>
<path id="scarab_spine" d="M149.97,301.187c2.005-24.729,8.386-103.483,8.405-103.721
c-0.09-0.219-6.478-15.578-8.405-20.214c-1.936,4.655-8.316,19.995-8.408,20.214C141.582,197.704,147.965,276.458,149.97,301.187z"/>
<path id="scarab_wing_left" d="M140.403,197.149l8.862-21.31l-13.686-13.499
c-5.65-5.573-67.074-6.235-90.259-6.019l-0.006-0.622c-0.154,2.144-0.271,4.302-0.35,6.475
c-0.076,2.207,10.392,4.706,10.392,6.717c0,2.319-10.457,5.084-10.359,7.631c2.993,73.349,48.53,131.631,104.372,132.048
l-9.02-111.29L140.403,197.149z"/>
<path id="scarab_wing_right" d="M244.585,168.891c0-2.011,10.467-4.506,10.391-6.715
c-0.079-2.174-0.195-4.332-0.351-6.479l-0.004,0.624c-23.186-0.216-84.608,0.445-90.26,6.017l-13.688,13.502l8.915,21.438
l-9.017,111.29c55.854-0.417,101.378-58.698,104.373-132.049C255.04,173.976,244.585,171.209,244.585,168.891z"/>
<path id="scarab_leg_front_left" d="M44.506,141.12c-4.135-0.856-4.895-1.54-7.935-2.92
c-9.59-3.364-10.376-5.481-16.08-11.86c-7.426-8.306-12.661-20.142-17.1-29.463c-3.576-7.525-3.984-16.409-2.86-24.273
c0.991-6.935,7.144-12.869,12.074-18.92c5.844-7.191,10.356-14.822,17.924-21.354c7.736-6.682,23.203-9.809,26.168-19.648
C57.86,8.819,54.334,1.766,61.482,0c-0.366,4.703,3.639,8.477,2.397,13.575c-1.129,4.627-4.368,5.811-9.611,9.099
c-7.564,4.746-18.366,8.779-24.748,13.965c-7.175,5.827-4.369,13.771-10.569,20.057c-2.001,2.03-7.901,4.706-9.137,6.83
c-1.861,3.199-0.297,9.572-0.116,13.12c0.425,8.284,5.588,14.244,9.555,22.045c4.152,8.141,6.429,15.409,13.411,22.519
c4.183,4.262,11.429,4.802,16.21,10.647l-3.555,4.186L44.506,141.12z"/>
<path id="scarab_leg_middle_left" d="M43.94,191.922l-0.809-7.346
c-9.506-4.579-10.339-9.772-20.738-12.466c-23.728-6.151-21.361,11.25-15.532,26.373c5.676,14.726,8.237,30.23,14.345,44.795
c2.805,6.688,6.919,13.213,14.298,15.127c0.372-8.435-0.917-10.651-6.113-16.919c-4.395-5.293-3.326-12.548-6.072-18.504
c-3.581-7.804-4.196-15.646-7.279-23.502c-1.363-3.479-8.33-13.966-6.452-17.861c3.183-6.603,9.178-0.083,12.179,2.077
c4.218,3.036,6.467,2.223,11.681,2.898C34.041,186.673,37.005,188.756,43.94,191.922z"/>
<path id="scarab_leg_back_left" d="M65.839,257.063l-2.771-4.837
c-6.68,8.928-6.993,16.228-10.056,23.347c-5.277,12.263-0.157,28.851,9.854,37.676c6.052,5.375,15.907,9.618,23.122,13.136
c10.035,4.892,20.113,11.286,31.336,13.396c2.482,0.466,8.798,1.295,6.693-3.522c-0.975-2.237-8.091-4.591-10.146-5.734
c-8.312-4.623-16.377-10.524-24.142-16.176c-9.498-6.862-20.843-11.186-28.311-20.684c-3.054-3.885-3.544-4.922-2.816-9.39
c0.693-4.263,1.344-9.174,2.241-13.439C61.855,266.029,63.274,261.378,65.839,257.063z"/>
<path id="scarab_leg_front_right" d="M255.487,141.12c4.134-0.856,4.896-1.54,7.936-2.92
c9.583-3.364,10.369-5.481,16.071-11.86c7.428-8.306,12.661-20.142,17.115-29.463c3.574-7.525,3.983-16.409,2.86-24.273
c-0.992-6.935-7.157-12.869-12.087-18.92c-5.843-7.191-10.356-14.822-17.919-21.354c-7.735-6.682-23.202-9.809-26.167-19.648
C242.135,8.819,245.66,1.766,238.511,0c0.366,4.703-3.637,8.477-2.396,13.575c1.131,4.627,4.368,5.811,9.611,9.099
c7.563,4.746,18.367,8.779,24.747,13.965c7.17,5.827,4.362,13.771,10.563,20.057c2.001,2.03,7.901,4.706,9.139,6.83
c1.859,3.199,0.295,9.572,0.113,13.12c-0.424,8.284-5.588,14.244-9.553,22.045c-4.152,8.141-6.431,15.409-13.404,22.519
c-4.184,4.262-11.429,4.802-16.211,10.647l3.556,4.186L255.487,141.12z"/>
<path id="scarab_leg_middle_right" d="M256.053,191.922l0.81-7.346
c9.507-4.579,10.34-9.772,20.73-12.466c23.741-6.151,21.374,11.25,15.534,26.373c-5.676,14.726-8.238,30.23-14.347,44.795
c-2.804,6.688-6.911,13.213-14.291,15.127c-0.371-8.435,0.918-10.651,6.113-16.919c4.39-5.293,3.319-12.548,6.066-18.504
c3.58-7.804,4.197-15.646,7.278-23.502c1.363-3.479,8.33-13.966,6.453-17.861c-3.184-6.603-9.179-0.083-12.181,2.077
c-4.217,3.036-6.458,2.223-11.672,2.898C265.951,186.673,262.986,188.756,256.053,191.922z"/>
<path id="scarab_leg_back_right" d="M234.155,257.063l2.771-4.837
c6.679,8.928,6.991,16.228,10.057,23.347c5.274,12.263,0.154,28.851-9.854,37.676c-6.055,5.375-15.903,9.618-23.117,13.136
c-10.034,4.892-20.127,11.286-31.351,13.396c-2.481,0.466-8.789,1.295-6.691-3.522c0.976-2.237,8.092-4.591,10.146-5.734
c8.312-4.623,16.392-10.524,24.155-16.176c9.498-6.862,20.838-11.186,28.305-20.684c3.055-3.885,3.543-4.922,2.818-9.39
c-0.696-4.263-1.346-9.174-2.244-13.439C238.137,266.029,236.718,261.378,234.155,257.063z"/>
</g>
</g>
<radialGradient id="gradient_radial_dung"
cx="0" cy="0" r="60"
fx="0" fy="0" gradientUnits="userSpaceOnUse"
>
<stop offset="0" stop-color="#9a9a9a" />
<stop offset="0.70" stop-color="#bababa" />
<stop offset="0.95" stop-color="#FFFFFF" />
</radialGradient>
<g id="dung">
<circle cx="0" cy="0" r="60" fill="url(#gradient_radial_dung)" />
<g transform="translate(-61, -61)">
<!-- rough equivalent: <circle cx="0" cy="0" r="60" stroke="#8a8a8a" stroke-width="2" /> -->
<path fill="#8a8a8a" d="M0,61c0,33.636,27.364,61,61,61s61-27.364,61-61S94.636,0,61,0S0,27.364,0,61z
M2,61C2,28.467,28.467,2,61,2c32.532,0,59,26.467,59,59c0,32.533-26.468,59-59,59C28.467,120,2,93.533,2,61z"/>
</g>
<use xlink:href="#hacker_emblem" x="0" y="0" transform="scale(9)" />
</g>
<g id="dung_2_color">
<!-- This would be simple a circle like so:
<circle cx="0" cy="0" r="48" stroke-width="2" fill="none" stroke="white"/>
but there appears to currently be a bug in the cairo
PDF backend that results in an ugly spike in that
case. So we use 8 splines instead.
-->
<path stroke-width="4" stroke="white" fill="none" d="
M 48, 0
C 48, 12.730391512298112,
42.94287166245995, 24.939379331448613
33.941125496954285, 33.941125496954278
C 24.939379331448624, 42.942871662459943
12.730391512298114, 48
0, 48
C -12.730391512298109, 48,
-24.939379331448613, 42.94287166245995
-33.941125496954278, 33.941125496954285
C -42.942871662459943, 24.939379331448624,
-48, 12.730391512298118,
-48, 0,
C -48, -12.730391512298105,
-42.94287166245995, -24.939379331448613,
-33.941125496954285, -33.941125496954278
C -24.939379331448624, -42.942871662459943,
-12.730391512298119, -48,
0, -48
C 12.730391512298104, -48,
24.939379331448606, -42.942871662459943,
33.941125496954271, -33.941125496954285
C 42.942871662459936, -24.939379331448624,
48, -12.730391512298123,
48, 0" />
<g transform="scale(9)" fill="white" stroke="none" stroke-width="0.22222">
<!-- Hacker emblem grid -->
<!--
<path stroke="white" fill="none"
d="M -3,-3 L 3,-3 L 3,3 L-3,3 Z
M -1,-3 L -1, 3
M 1,-3 L 1, 3
M -3,-1 L 3,-1
M -3, 1 L 3, 1"/>
-->
<!-- Hacker emblem dots -->
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<!-- scarab dimensions: 300x340 -->
<!-- dung dimensions: 120x120 (radius: 60) -->
<!-- scarab and dung dimensions: 300x400 -->
<g id="cairo_logo">
<!-- dimensions: 300x400, centered -->
<!-- The logo (scarab and dung), with the center-point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 30)" />
</g>
<g id="cairo_logo_dung-centered">
<!-- The logo (scarab and dung), with the dung at (0,0), the scarab below -->
<use xlink:href="#dung_2_color" x="0" y="0" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0,170)" />
</g>
<g id="cairo_logo_scarab-centered">
<!-- The logo (scarab and dung), with the scarab's rotational center at (0,0), the dung above -->
<!-- The scarab's rotational center in this case is not the center of its bounding box,
but is calculated to be the intersection-point of the torso, spine and wings -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -175.85)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -5.85)" />
</g>
<g id="cairo_logo_top-centered">
<!-- The logo (scarab and dung), with the top-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 230)" /><!-- (0,170+60) -->
</g>
<g id="cairo_logo_bottom-centered">
<!-- The logo (scarab and dung), with the bottom-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -170)" />
</g>
<g id="cairo_logo_right-centered">
<!-- The logo (scarab and dung), with the right-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 30)" />
</g>
<g id="cairo_logo_left-centered">
<!-- The logo (scarab and dung), with the left-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 30)" />
</g>
<g id="cairo_logo_topleft-centered">
<!-- The logo (scarab and dung), with the top-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 230)" /><!-- (150, 170+60) -->
</g>
<g id="cairo_logo_topright-centered">
<!-- The logo (scarab and dung), with the top-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 230)" /><!-- (-150,170+60) -->
</g>
<g id="cairo_logo_bottomleft-centered">
<!-- The logo (scarab and dung), with the bottom-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, -170)" />
</g>
<g id="cairo_logo_bottomright-centered">
<!-- The logo (scarab and dung), with the bottom-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, -170)" />
</g>
<g id="cairo_text" transform="translate(0,-97)">
<g transform="scale(0.1484,0.1484)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(65,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(486.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1234.25,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1610,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small_spaced" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(379.5,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1341.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1826,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(261.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(764.75)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(988.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1355.5,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<g id="cairo_logo_text_small">
<!-- The logo on the left, the text 'cairo' on the right -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(0, 78), scale(0.1944)" />
<use xlink:href="#cairo_text_small" fill="white" transform="translate(175,82)"/>
</g>
<g id="cairo_logo_with_text">
<!-- The logo (scarab and dung), with the text 'cairo' below, the dot of the 'i' positioned between the hind legs of the scarab -->
<!-- dimensions: 300x490, centered -->
<use xlink:href="#cairo_logo_top-centered" transform="translate(0, -245)" />
<use xlink:href="#cairo_text" transform="translate(0, 245)" />
</g>
<g id="cairo_banner">
<!-- The logo on the left, the text 'cairo' in the center, and a mirror image of the logo on the right -->
<!-- The logos are scaled such that the scarab body nearly matches the height of the text characters (excepting the 'i')
and the dung should nearly aligns with the dot of the 'i'. The bottoms of the logos are aligned with the bottom of the text. -->
<!-- dimensions: 370x88, centered -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(-180, 40), scale(0.1944)" />
<use xlink:href="#cairo_text_small" transform="translate(0, 42)" fill="black" />
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(180, 40), scale(0.1944), scale(-1, 1)" />
</g>
<g id="freedesktop_org_logo" style="fill:#FFFFFF;stroke:#3B80AE;stroke-width:2.4588;">
<g>
<path style="stroke:#BABABA;" d="M85.277,40.796c2.058,7.884-2.667,15.942-10.551,17.999L27.143,71.21c-7.884,2.057-15.943-2.667-18-10.552
l-7.448-28.55c-2.057-7.884,2.667-15.942,10.551-17.999L59.83,1.695c7.884-2.057,15.942,2.667,17.999,10.551
l7.449,28.55z"/>>
<path style="fill:#3B80AE;stroke:none;" d="M80.444,39.778c1.749,7.854-1.816,13.621-9.504,15.447l-42.236,11.02c-7.569,2.396-14.089-1.181
-15.838-8.836L6.53,33.127c-1.749-8.145,0.709-12.889,9.503-15.447L58.27,6.661
c8.144-1.826,14.089,1.363,15.838,8.835l6.336,24.282z"/>>
</g>g>
<path style="opacity:0.5;fill:none;stroke:#FFFFFF;" d="M45.542,51.793L24.104,31.102l38.1-4.393L45.542,51.793z"/>>
<path d="M72.325,28.769c0.405,1.55-0.525,3.136-2.075,3.541l-12.331,3.217c-1.551,0.404-3.137-0.525-3.542-2.076l-2.295-8.801
c-0.405-1.551,0.524-3.137,2.076-3.542l12.33-3.217c1.551-0.405,3.137,0.525,3.542,2.076l2.295,8.801z"/>>
<path d="M36.51,33.625c0.496,1.9-0.645,3.844-2.545,4.34l-15.112,3.943c-1.901,0.496-3.845-0.644-4.34-2.544l-2.814-10.786
c-0.496-1.901,0.644-3.844,2.544-4.34l15.113-3.942c1.901-0.496,3.845,0.643,4.34,2.544l2.814,10.786z"/>>
<path d="M52.493,53.208c0.278,1.065-0.36,2.154-1.425,2.432L42.6,57.848c-1.064,0.277-2.153-0.36-2.431-1.426l-1.577-6.043
c-0.277-1.064,0.36-2.153,1.425-2.432l8.468-2.209c1.064-0.277,2.154,0.361,2.431,1.426l1.577,6.043z"/>>
</g>g>
<g id="bullet">
<use x="0" y="0" xlink:href="#cairo_logo" transform="translate(-6,-2) scale(0.1, 0.1)"/>>
</g>
<g id="redhat_logo_horizontal">
<!-- 380x125 Red Hat log (horizontal layout) -->
<g fill="black" stroke="none"
transform="translate(0,124),scale(1,-1),translate(-214,-258)"
fill-rule="evenodd"
>
<!-- r -->
<path fill="black" d="
M 367.0625 315.3203
C 367.0625 320.8765 366.9463 324.9644 366.7227 328.6597
L 375.811 328.6597
L 376.2002 320.7764
L 376.4971 320.7764
C 378.5391 326.6221 383.3809 329.5996 387.8594 329.5996
C 388.8843 329.5996 389.4824 329.5601 390.3218 329.373
L 390.3218 319.4863
C 389.3398 319.6763 388.4224 319.7842 387.1592 319.7842
C 382.1597 319.7842 378.688 316.6006 377.751 311.8447
C 377.5732 310.918 377.4805 309.8086 377.4805 308.6777
L 377.4805 287.1504
L 366.9766 287.1504
L 367.0625 315.3203
" />
<!-- e -->
<path fill="black" d="
M 402.9927 305.0791
C 403.2715 297.5586 409.0918 294.2695 415.814 294.2695
C 420.6406 294.2695 424.0942 295.0234 427.2681 296.1924
L 428.8232 288.9678
C 425.269 287.4629 420.3413 286.3359 414.3149 286.3359
C 400.8384 286.3359 392.9409 294.6592 392.9409 307.3809
C 392.9409 318.8369 399.8911 329.6772 413.2437 329.6772
C 426.7397 329.6772 431.1338 318.5771 431.1338 309.4893
C 431.1338 307.5381 430.9624 305.9707 430.7593 305.0059
L 402.9927 305.0791
M 421.2485 312.3926
C 421.2954 316.2388 419.6206 322.5088 412.5903 322.5088
C 406.1299 322.5088 403.4438 316.645 402.9722 312.3926
L 421.2485 312.3926
" />
<!-- d -->
<path fill="black" d="
M 476.355 344.667
L 465.8638 347.5083
L 465.8638 324.1914
L 465.6904 324.1914
C 463.8335 327.2563 459.7407 329.5996 454.0571 329.5996
C 444.0762 329.5996 435.3828 321.3374 435.4478 307.4307
C 435.4478 294.6719 443.2983 286.2168 453.2119 286.2168
C 459.2017 286.2168 464.2114 289.0723 466.6909 293.7217
L 466.8779 293.7217
L 467.3491 287.1504
L 476.6997 287.1504
C 476.5083 289.9717 476.355 294.543 476.355 298.792
L 476.355 344.667
M 465.8638 305.1504
C 465.8638 304.0479 465.7856 303.0234 465.5454 302.0869
C 464.4873 297.5439 460.7734 294.6172 456.4819 294.6172
C 449.8721 294.6172 446.0903 300.1885 446.0903 307.8164
C 446.0903 315.5166 449.8384 321.4761 456.6016 321.4761
C 461.3208 321.4761 464.6992 318.1484 465.6274 314.1064
C 465.8071 313.2559 465.8638 312.208 465.8638 311.3711
L 465.8638 305.1504
" />
<!-- h -->
<path fill="black" d="
M 503.7964 329.0176
C 500.6836 329.0176 497.8926 328.1187 495.5493 326.6714
C 493.1162 325.2461 491.1353 323.0464 489.959 320.7666
L 489.7915 320.7666
L 489.7915 341.0195
L 485.7427 342.1226
L 485.7427 287.1504
L 489.7915 287.1504
L 489.7915 312.1787
C 489.7915 313.8408 489.9204 314.9946 490.3462 316.2109
C 492.0928 321.3013 496.8896 325.4805 502.689 325.4805
C 511.0664 325.4805 513.9673 318.7603 513.9673 311.3906
L 513.9673 287.1504
L 518.0137 287.1504
L 518.0137 311.8359
C 518.0137 327.0791 507.6753 329.0176 503.7964 329.0176
" />
<!-- a -->
<path fill="black" d="
M 554.3413 296.873
C 554.3413 293.6357 554.4692 290.2832 554.9375 287.1504
L 551.2085 287.1504
L 550.6128 293.0156
L 550.4209 293.0156
C 548.438 289.8594 543.8765 286.2168 537.3726 286.2168
C 529.1392 286.2168 525.3057 292.0117 525.3057 297.4688
C 525.3057 306.9121 533.6421 312.6064 550.292 312.4321
L 550.292 313.5234
C 550.292 317.5718 549.5044 325.6475 539.8242 325.5859
C 536.2446 325.5859 532.5132 324.6255 529.5513 322.5366
L 528.2632 325.4805
C 532.0015 328.0137 536.5659 329.0176 540.2705 329.0176
C 552.0801 329.0176 554.3413 320.1509 554.3413 312.8379
L 554.3413 296.873
M 550.292 309.0234
C 541.3813 309.2813 529.6128 307.9336 529.6128 298.1055
C 529.6128 292.2246 533.4946 289.5811 537.7578 289.5811
C 544.5796 289.5811 548.4561 293.8018 549.8677 297.7871
C 550.1646 298.6621 550.292 299.5371 550.292 300.2402
L 550.292 309.0234
" />
<!-- t -->
<path fill="black" d="
M 570.459 337.0996
L 570.459 328.0801
L 582.1235 328.0801
L 582.1235 324.7959
L 570.459 324.7959
L 570.459 298.1943
C 570.459 292.9912 572.0757 289.7285 576.4692 289.7285
C 578.5815 289.7285 580.0757 290.0078 581.1206 290.3711
L 581.6099 287.2354
C 580.2871 286.6836 578.4302 286.2539 575.9619 286.2539
C 572.9741 286.2539 570.4995 287.1934 568.8994 289.1543
C 567.0469 291.3057 566.4116 294.7412 566.4116 298.916
L 566.4116 324.7959
L 559.5059 324.7959
L 559.5059 328.0801
L 566.4116 328.0801
L 566.4116 335.606
L 570.459 337.0996
" />
<!-- ® for 'redhat' -->
<path fill="black" d="
M 335.5 288.9707
L 336.0352 288.9707
L 336.8408 287.6445
L 337.3608 287.6445
L 336.4888 288.9937
C 336.9404 289.0498 337.2832 289.2881 337.2832 289.834
C 337.2832 290.4385 336.9258 290.7051 336.2017 290.7051
L 335.0366 290.7051
L 335.0366 287.6445
L 335.5 287.6445
L 335.5 288.9707
M 335.5 289.3643
L 335.5 290.3101
L 336.1318 290.3101
C 336.4531 290.3101 336.7979 290.2402 336.7979 289.8647
C 336.7979 289.3916 336.4492 289.3643 336.0566 289.3643
L 335.5 289.3643
" />
<path fill="black" d="
M 339.0439 289.1719
C 339.0439 287.5176 337.7041 286.1763 336.0493 286.1763
C 334.395 286.1763 333.0527 287.5176 333.0527 289.1719
C 333.0527 290.8271 334.395 292.1675 336.0493 292.1675
C 337.7041 292.1675 339.0439 290.8271 339.0439 289.1719
M 336.0493 291.6367
C 334.6865 291.6367 333.5835 290.5332 333.5835 289.1719
C 333.5835 287.8096 334.6865 286.7061 336.0493 286.7061
C 337.4082 286.7061 338.5117 287.8096 338.5117 289.1719
C 338.5117 290.5332 337.4082 291.6367 336.0493 291.6367
" />
<!-- Black background behind The Shadowman -->
<path fill="black" d="
M 326.4531 286.208
C 324.1177 286.7451 321.6396 287.0801 319.1338 287.0801
C 314.8496 287.0801 310.9502 286.3389 308.0732 285.1426
C 307.7559 284.9844 307.5303 284.6533 307.5303 284.2764
C 307.5303 284.1406 307.5654 283.999 307.6172 283.8838
C 307.957 282.8975 307.3984 281.8281 304.6157 281.2158
C 300.4883 280.3096 297.8833 276.0527 296.3916 274.6367
C 294.6411 272.9756 289.6973 271.9531 290.4404 272.9434
C 291.0225 273.7188 293.2485 276.1348 294.6016 278.748
C 295.8125 281.083 296.8906 281.7461 298.375 283.9736
C 298.811 284.627 300.4995 286.9219 300.9912 288.7373
C 301.543 290.5107 301.356 292.7344 301.5679 293.6494
C 301.8721 294.9697 303.1182 297.8369 303.2129 299.4531
C 303.2666 300.3691 299.3916 298.1494 297.5532 298.1494
C 295.7144 298.1494 293.9233 299.248 292.2808 299.3281
C 290.248 299.4248 288.9414 297.7607 287.1025 298.0508
C 286.0518 298.2178 285.167 299.1426 283.3311 299.2129
C 280.7178 299.3086 277.5244 297.7607 271.5264 297.9531
C 265.6255 298.1436 260.1753 305.4082 259.4312 306.5635
C 258.5605 307.9199 257.4961 307.9199 256.335 306.8555
C 255.1738 305.792 253.7432 306.627 253.3359 307.3389
C 252.5615 308.6943 250.4927 312.6543 247.2881 313.4824
C 242.8564 314.6309 240.6118 311.0283 240.9033 308.1621
C 241.1987 305.252 243.0801 304.4375 243.9512 302.8906
C 244.8213 301.3428 245.2671 300.3428 246.9053 299.6572
C 248.0674 299.1758 248.5 298.458 248.1533 297.5049
C 247.8506 296.6738 246.6416 296.4834 245.8477 296.4463
C 244.1592 296.3662 242.9756 296.8242 242.1123 297.376
C 241.1084 298.0137 240.292 298.9033 239.416 300.4131
C 238.4023 302.0781 236.8052 302.8037 234.9453 302.8037
C 234.0586 302.8037 233.2295 302.5693 232.4922 302.1895
C 229.5771 300.6748 226.1064 299.7744 222.3706 299.7744
L 218.1572 299.7734
C 216.1064 305.8555 214.9951 312.3682 214.9951 319.1416
C 214.9951 352.6064 242.1226 379.7334 275.5859 379.7334
C 309.0498 379.7334 336.1758 352.6064 336.1758 319.1416
C 336.1758 307 332.6035 295.6895 326.4531 286.208
" />
<!-- The Shadowman's face -->
<path fill="white" d="
M 326.4531 286.209
C 324.1177 286.7461 321.6396 287.084 319.1338 287.084
C 314.8496 287.084 310.9502 286.3418 308.0732 285.1436
C 307.7559 284.9873 307.5303 284.6553 307.5303 284.2783
C 307.5303 284.1416 307.5654 284.001 307.6172 283.8838
C 307.957 282.8994 307.3984 281.8311 304.6157 281.2178
C 300.4883 280.3115 297.8833 276.0537 296.3916 274.6416
C 294.6411 272.9766 289.6973 271.9551 290.4404 272.9463
C 291.0225 273.7197 293.2485 276.1367 294.6016 278.749
C 295.8125 281.083 296.8906 281.75 298.375 283.9756
C 298.811 284.627 300.4995 286.9238 300.9912 288.7402
C 301.543 290.5117 301.356 292.7354 301.5679 293.6514
C 301.8721 294.9727 303.1182 297.8379 303.2129 299.457
C 303.2666 300.3721 299.3916 298.1504 297.5532 298.1504
C 295.7144 298.1504 293.9233 299.251 292.2808 299.3301
C 290.248 299.4258 288.9414 297.7627 287.1025 298.0518
C 286.0518 298.2207 285.167 299.1465 283.3311 299.2148
C 280.7178 299.3096 277.5244 297.7627 271.5264 297.9561
C 265.6255 298.1475 260.1753 305.4121 259.4312 306.5674
C 258.5605 307.9219 257.4961 307.9219 256.335 306.8574
C 255.1738 305.7939 253.7432 306.6299 253.3359 307.3438
C 252.5615 308.6963 250.4927 312.6553 247.2881 313.4854
C 242.8564 314.6338 240.6118 311.0313 240.9033 308.1641
C 241.1987 305.2539 243.0801 304.4395 243.9512 302.8926
C 244.8213 301.3438 245.2671 300.3457 246.9053 299.6621
C 248.0674 299.1768 248.5 298.4609 248.1533 297.5068
C 247.8506 296.6768 246.6416 296.4873 245.8477 296.4492
C 244.1592 296.3672 242.9756 296.8262 242.1123 297.376
C 241.1084 298.0176 240.292 298.9043 239.416 300.416
C 238.4023 302.0801 236.8052 302.8086 234.9453 302.8086
C 234.0586 302.8086 233.2295 302.5723 232.4922 302.1934
C 229.5771 300.6748 226.1064 299.7773 222.3706 299.7773
L 218.1572 299.7744
C 226.2363 275.8105 248.8965 258.5527 275.5859 258.5527
C 296.9063 258.5527 315.6538 269.5635 326.4531 286.209
" />
<!-- nose shadow -->
<path fill="black" d="
M 288.9307 291.7637
C 289.2422 291.46 289.7793 290.4375 289.1226 289.1396
C 288.7544 288.4521 288.3579 287.9678 287.6489 287.4023
C 286.7969 286.7188 285.1309 285.9307 282.8457 287.3799
C 281.6172 288.1592 281.543 288.4209 279.8467 288.2012
C 278.6348 288.043 278.1533 289.2656 278.5884 290.2832
C 279.0244 291.2969 280.8145 292.1191 283.04 290.8135
C 284.041 290.2256 285.6025 288.9844 286.9688 290.084
C 287.5356 290.5381 287.875 290.8408 288.6611 291.75
C 288.6963 291.7881 288.7461 291.8105 288.8018 291.8105
C 288.8516 291.8105 288.8965 291.793 288.9307 291.7637
" />
<!-- The Shadowman's red hat -->
<path fill="#cc0000" d="
M 309.7769 335.2627
C 309.1787 333.251 308.3271 330.6763 304.5391 328.7314
C 303.9878 328.4497 303.7764 328.9126 304.0313 329.3477
C 305.4629 331.7832 305.7168 332.3921 306.1328 333.3525
C 306.7148 334.7568 307.02 336.7549 305.8618 340.9219
C 303.5835 349.1221 298.8296 360.083 295.375 363.6392
C 292.04 367.0698 285.998 368.0361 280.5371 366.6348
C 278.5264 366.1191 274.5918 364.0732 267.2939 365.7168
C 254.665 368.5605 252.7939 362.2368 252.0693 359.4824
C 251.3438 356.7271 249.6045 348.897 249.6045 348.897
C 249.0244 345.7085 248.2646 340.1631 267.874 336.4287
C 277.0088 334.6885 277.4736 332.3276 277.8779 330.6289
C 278.603 327.585 279.7627 325.8438 281.0674 324.9746
C 282.373 324.1035 281.0674 323.3828 279.6187 323.2349
C 275.7285 322.8311 261.3491 326.9541 252.8428 331.7881
C 245.8828 336.0415 245.7656 339.8721 247.3584 343.1211
C 236.8452 344.2573 228.9561 342.1348 227.5254 337.1582
C 225.0693 328.6157 246.3047 314.0264 270.4839 306.7061
C 295.8579 299.0225 321.9556 304.3857 324.8564 320.335
C 326.1738 327.5811 320.0713 332.9419 309.7769 335.2627
" />
<!-- shadow on hat -->
<path fill="black" d="
M 270.8711 350.8813
C 263.8721 350.375 263.145 349.6191 261.834 348.2227
C 259.9854 346.2539 257.5508 350.7773 257.5508 350.7773
C 256.0898 351.085 254.3179 353.4404 255.2744 355.6411
C 256.2158 357.8174 257.9551 357.1641 258.5 356.4868
C 259.1626 355.6621 260.5771 354.3125 262.4141 354.3613
C 264.251 354.4097 266.3706 354.7959 269.3262 354.7959
C 272.3213 354.7959 274.335 353.6777 274.4487 352.7168
C 274.5459 351.8965 274.2061 351.1226 270.8711 350.8813
" />
<!-- another shadow on hat -->
<path fill="black" d="
M 278.2236 362.4463
C 278.2129 362.4453 278.2021 362.4438 278.1919 362.4438
C 278.084 362.4438 277.9961 362.5273 277.9961 362.6274
C 277.9961 362.7007 278.041 362.7646 278.106 362.7939
C 279.4629 363.5107 281.4873 364.0811 283.8042 364.3169
C 284.499 364.3887 285.1787 364.4248 285.832 364.4307
C 285.9478 364.4307 286.0615 364.4297 286.1787 364.4277
C 290.062 364.3398 293.1719 362.7974 293.1255 360.9814
C 293.0791 359.165 289.8955 357.7637 286.0112 357.8506
C 284.7529 357.8794 283.5732 358.0615 282.5576 358.3545
C 282.4385 358.3857 282.3506 358.4883 282.3506 358.6094
C 282.3506 358.731 282.4385 358.834 282.5605 358.8638
C 284.9839 359.4248 286.6191 360.3408 286.5039 361.207
C 286.3511 362.3545 283.1816 362.979 279.4248 362.6011
C 279.0137 362.5596 278.6118 362.5068 278.2236 362.4463
" />
<!-- ® for The Shadowman -->
<path fill="black" d="
M 588.3018 288.9707
L 588.8369 288.9707
L 589.6426 287.6445
L 590.1626 287.6445
L 589.2905 288.9937
C 589.7422 289.0498 590.085 289.2881 590.085 289.834
C 590.085 290.4385 589.7275 290.7051 589.0034 290.7051
L 587.8384 290.7051
L 587.8384 287.6445
L 588.3018 287.6445
L 588.3018 288.9707
M 588.3018 289.3643
L 588.3018 290.3101
L 588.9336 290.3101
C 589.2549 290.3101 589.5996 290.2402 589.5996 289.8647
C 589.5996 289.3916 589.251 289.3643 588.8584 289.3643
L 588.3018 289.3643
" />
<path fill="black" d="
M 591.8457 289.1719
C 591.8457 287.5176 590.5059 286.1763 588.8511 286.1763
C 587.1968 286.1763 585.8545 287.5176 585.8545 289.1719
C 585.8545 290.8271 587.1968 292.1675 588.8511 292.1675
C 590.5059 292.1675 591.8457 290.8271 591.8457 289.1719
M 588.8511 291.6367
C 587.4883 291.6367 586.3853 290.5332 586.3853 289.1719
C 586.3853 287.8096 587.4883 286.7061 588.8511 286.7061
C 590.21 286.7061 591.3135 287.8096 591.3135 289.1719
C 591.3135 290.5332 590.21 291.6367 588.8511 291.6367
" />
</g>
</g>
</defs>
<g id="watermark" transform="translate(200, 185), rotate(-50), scale(2.5)">
<use xlink:href="#scarab" x="0" y="170" fill-opacity="0.2"/>
</g>
<!-- Blue bar at top of slide -->
<rect x="0" y="0" width="1024" height="80" fill="#162284" />
<g font-family="Frutiger">
<!-- Slide title -->
<!-- Slide title -->
<g id="slide_title" transform="translate(512, 60)">
<text text-anchor="middle"
fill="white"
font-weight="bold"
x="0"
y="4" font-size="55"
ss:variable="title">Slide Title</text>
</g>
<!-- Slide content -->
<g ss:region="default">
<rect x="112" y="120" width="800" height="580" fill="none" stroke="blue"/>
<text font-size="40" fill="black"
x="112" y="152">Slide content</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

@@ -0,0 +1,909 @@
<?xml version="1.0" ?>
<svg width="1024" height="768"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ss="http://www.svgslides.org/svgslides0.1"
fill="black">
<defs id="cairo-artwork_defs">
<g id="hacker_emblem">
<!-- Note: This is similar though not identical to Keith Packard's SVG version
of the hacker emblem (http://www.catb.org/hacker-emblem/glider.svg) -->
<g id="hacker_emblem_grid" fill="white" stroke="none">
<!-- Outside: Top, Right, Bottom, Left -->
<rect x="-2.95" y="-3.05" width="6" height="0.1" />
<rect x="2.95" y="-2.95" width="0.1" height="6" />
<rect x="-3.05" y="2.95" width="6" height="0.1" />
<rect x="-3.05" y="-3.05" width="0.1" height="6" />
<!-- Vertical: Left, Right -->
<rect x="-1.05" y="-2.95" width="0.1" height="5.9" />
<rect x="0.95" y="-2.95" width="0.1" height="5.9" />
<!-- Horizontal: TopLeft, TopMiddle, TopRight -->
<rect x="-2.95" y="-1.05" width="1.9" height="0.1" />
<rect x="-0.95" y="-1.05" width="1.9" height="0.1" />
<rect x="1.05" y="-1.05" width="1.9" height="0.1" />
<!-- Horizontal: BottomLeft, BottomMiddle, BottomRight -->
<rect x="-2.95" y="0.95" width="1.9" height="0.1" />
<rect x="-0.95" y="0.95" width="1.9" height="0.1" />
<rect x="1.05" y="0.95" width="1.9" height="0.1" />
</g>
<g id="hacker_emblem_dots" fill="white">
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<g id="scarab" fill="#f19a14">
<g transform="translate(-150, -170)">
<path id="scarab_head" d="M205.599,94.567c0-11.668-24.914-21.129-55.628-21.129
c-30.723,0-55.624,9.46-55.624,21.129c0,10.203,24.901,7.346,55.624,7.346C180.685,101.913,205.599,104.233,205.599,94.567z"/>
<path id="scarab_torso" d="M136.423,161.506c0,0,12.751,12.577,13.547,13.362
c2.262-2.232,13.545-13.362,13.545-13.362c7.135-7.036,87.111-6.399,91.066-6.363c-0.469-6.298-1.254-12.472-2.325-18.519
c-15.183-19.279-42.811-32.225-74.485-32.225h-55.518c-31.745,0-59.439,13.011-74.598,32.37c-1.054,6-1.829,12.128-2.296,18.374
C49.321,155.106,129.288,154.47,136.423,161.506z"/>
<path id="scarab_spine" d="M149.97,301.187c2.005-24.729,8.386-103.483,8.405-103.721
c-0.09-0.219-6.478-15.578-8.405-20.214c-1.936,4.655-8.316,19.995-8.408,20.214C141.582,197.704,147.965,276.458,149.97,301.187z"/>
<path id="scarab_wing_left" d="M140.403,197.149l8.862-21.31l-13.686-13.499
c-5.65-5.573-67.074-6.235-90.259-6.019l-0.006-0.622c-0.154,2.144-0.271,4.302-0.35,6.475
c-0.076,2.207,10.392,4.706,10.392,6.717c0,2.319-10.457,5.084-10.359,7.631c2.993,73.349,48.53,131.631,104.372,132.048
l-9.02-111.29L140.403,197.149z"/>
<path id="scarab_wing_right" d="M244.585,168.891c0-2.011,10.467-4.506,10.391-6.715
c-0.079-2.174-0.195-4.332-0.351-6.479l-0.004,0.624c-23.186-0.216-84.608,0.445-90.26,6.017l-13.688,13.502l8.915,21.438
l-9.017,111.29c55.854-0.417,101.378-58.698,104.373-132.049C255.04,173.976,244.585,171.209,244.585,168.891z"/>
<path id="scarab_leg_front_left" d="M44.506,141.12c-4.135-0.856-4.895-1.54-7.935-2.92
c-9.59-3.364-10.376-5.481-16.08-11.86c-7.426-8.306-12.661-20.142-17.1-29.463c-3.576-7.525-3.984-16.409-2.86-24.273
c0.991-6.935,7.144-12.869,12.074-18.92c5.844-7.191,10.356-14.822,17.924-21.354c7.736-6.682,23.203-9.809,26.168-19.648
C57.86,8.819,54.334,1.766,61.482,0c-0.366,4.703,3.639,8.477,2.397,13.575c-1.129,4.627-4.368,5.811-9.611,9.099
c-7.564,4.746-18.366,8.779-24.748,13.965c-7.175,5.827-4.369,13.771-10.569,20.057c-2.001,2.03-7.901,4.706-9.137,6.83
c-1.861,3.199-0.297,9.572-0.116,13.12c0.425,8.284,5.588,14.244,9.555,22.045c4.152,8.141,6.429,15.409,13.411,22.519
c4.183,4.262,11.429,4.802,16.21,10.647l-3.555,4.186L44.506,141.12z"/>
<path id="scarab_leg_middle_left" d="M43.94,191.922l-0.809-7.346
c-9.506-4.579-10.339-9.772-20.738-12.466c-23.728-6.151-21.361,11.25-15.532,26.373c5.676,14.726,8.237,30.23,14.345,44.795
c2.805,6.688,6.919,13.213,14.298,15.127c0.372-8.435-0.917-10.651-6.113-16.919c-4.395-5.293-3.326-12.548-6.072-18.504
c-3.581-7.804-4.196-15.646-7.279-23.502c-1.363-3.479-8.33-13.966-6.452-17.861c3.183-6.603,9.178-0.083,12.179,2.077
c4.218,3.036,6.467,2.223,11.681,2.898C34.041,186.673,37.005,188.756,43.94,191.922z"/>
<path id="scarab_leg_back_left" d="M65.839,257.063l-2.771-4.837
c-6.68,8.928-6.993,16.228-10.056,23.347c-5.277,12.263-0.157,28.851,9.854,37.676c6.052,5.375,15.907,9.618,23.122,13.136
c10.035,4.892,20.113,11.286,31.336,13.396c2.482,0.466,8.798,1.295,6.693-3.522c-0.975-2.237-8.091-4.591-10.146-5.734
c-8.312-4.623-16.377-10.524-24.142-16.176c-9.498-6.862-20.843-11.186-28.311-20.684c-3.054-3.885-3.544-4.922-2.816-9.39
c0.693-4.263,1.344-9.174,2.241-13.439C61.855,266.029,63.274,261.378,65.839,257.063z"/>
<path id="scarab_leg_front_right" d="M255.487,141.12c4.134-0.856,4.896-1.54,7.936-2.92
c9.583-3.364,10.369-5.481,16.071-11.86c7.428-8.306,12.661-20.142,17.115-29.463c3.574-7.525,3.983-16.409,2.86-24.273
c-0.992-6.935-7.157-12.869-12.087-18.92c-5.843-7.191-10.356-14.822-17.919-21.354c-7.735-6.682-23.202-9.809-26.167-19.648
C242.135,8.819,245.66,1.766,238.511,0c0.366,4.703-3.637,8.477-2.396,13.575c1.131,4.627,4.368,5.811,9.611,9.099
c7.563,4.746,18.367,8.779,24.747,13.965c7.17,5.827,4.362,13.771,10.563,20.057c2.001,2.03,7.901,4.706,9.139,6.83
c1.859,3.199,0.295,9.572,0.113,13.12c-0.424,8.284-5.588,14.244-9.553,22.045c-4.152,8.141-6.431,15.409-13.404,22.519
c-4.184,4.262-11.429,4.802-16.211,10.647l3.556,4.186L255.487,141.12z"/>
<path id="scarab_leg_middle_right" d="M256.053,191.922l0.81-7.346
c9.507-4.579,10.34-9.772,20.73-12.466c23.741-6.151,21.374,11.25,15.534,26.373c-5.676,14.726-8.238,30.23-14.347,44.795
c-2.804,6.688-6.911,13.213-14.291,15.127c-0.371-8.435,0.918-10.651,6.113-16.919c4.39-5.293,3.319-12.548,6.066-18.504
c3.58-7.804,4.197-15.646,7.278-23.502c1.363-3.479,8.33-13.966,6.453-17.861c-3.184-6.603-9.179-0.083-12.181,2.077
c-4.217,3.036-6.458,2.223-11.672,2.898C265.951,186.673,262.986,188.756,256.053,191.922z"/>
<path id="scarab_leg_back_right" d="M234.155,257.063l2.771-4.837
c6.679,8.928,6.991,16.228,10.057,23.347c5.274,12.263,0.154,28.851-9.854,37.676c-6.055,5.375-15.903,9.618-23.117,13.136
c-10.034,4.892-20.127,11.286-31.351,13.396c-2.481,0.466-8.789,1.295-6.691-3.522c0.976-2.237,8.092-4.591,10.146-5.734
c8.312-4.623,16.392-10.524,24.155-16.176c9.498-6.862,20.838-11.186,28.305-20.684c3.055-3.885,3.543-4.922,2.818-9.39
c-0.696-4.263-1.346-9.174-2.244-13.439C238.137,266.029,236.718,261.378,234.155,257.063z"/>
</g>
</g>
<radialGradient id="gradient_radial_dung"
cx="0" cy="0" r="60"
fx="0" fy="0" gradientUnits="userSpaceOnUse"
>
<stop offset="0" stop-color="#9a9a9a" />
<stop offset="0.70" stop-color="#bababa" />
<stop offset="0.95" stop-color="#FFFFFF" />
</radialGradient>
<g id="dung">
<circle cx="0" cy="0" r="60" fill="url(#gradient_radial_dung)" />
<g transform="translate(-61, -61)">
<!-- rough equivalent: <circle cx="0" cy="0" r="60" stroke="#8a8a8a" stroke-width="2" /> -->
<path fill="#8a8a8a" d="M0,61c0,33.636,27.364,61,61,61s61-27.364,61-61S94.636,0,61,0S0,27.364,0,61z
M2,61C2,28.467,28.467,2,61,2c32.532,0,59,26.467,59,59c0,32.533-26.468,59-59,59C28.467,120,2,93.533,2,61z"/>
</g>
<use xlink:href="#hacker_emblem" x="0" y="0" transform="scale(9)" />
</g>
<g id="dung_2_color">
<!-- This would be simple a circle like so:
<circle cx="0" cy="0" r="48" stroke-width="2" fill="none" stroke="white"/>
but there appears to currently be a bug in the cairo
PDF backend that results in an ugly spike in that
case. So we use 8 splines instead.
-->
<path stroke-width="4" stroke="white" fill="none" d="
M 48, 0
C 48, 12.730391512298112,
42.94287166245995, 24.939379331448613
33.941125496954285, 33.941125496954278
C 24.939379331448624, 42.942871662459943
12.730391512298114, 48
0, 48
C -12.730391512298109, 48,
-24.939379331448613, 42.94287166245995
-33.941125496954278, 33.941125496954285
C -42.942871662459943, 24.939379331448624,
-48, 12.730391512298118,
-48, 0,
C -48, -12.730391512298105,
-42.94287166245995, -24.939379331448613,
-33.941125496954285, -33.941125496954278
C -24.939379331448624, -42.942871662459943,
-12.730391512298119, -48,
0, -48
C 12.730391512298104, -48,
24.939379331448606, -42.942871662459943,
33.941125496954271, -33.941125496954285
C 42.942871662459936, -24.939379331448624,
48, -12.730391512298123,
48, 0" />
<g transform="scale(9)" fill="white" stroke="none" stroke-width="0.22222">
<!-- Hacker emblem grid -->
<!--
<path stroke="white" fill="none"
d="M -3,-3 L 3,-3 L 3,3 L-3,3 Z
M -1,-3 L -1, 3
M 1,-3 L 1, 3
M -3,-1 L 3,-1
M -3, 1 L 3, 1"/>
-->
<!-- Hacker emblem dots -->
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<!-- scarab dimensions: 300x340 -->
<!-- dung dimensions: 120x120 (radius: 60) -->
<!-- scarab and dung dimensions: 300x400 -->
<g id="cairo_logo">
<!-- dimensions: 300x400, centered -->
<!-- The logo (scarab and dung), with the center-point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 30)" />
</g>
<g id="cairo_logo_dung-centered">
<!-- The logo (scarab and dung), with the dung at (0,0), the scarab below -->
<use xlink:href="#dung_2_color" x="0" y="0" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0,170)" />
</g>
<g id="cairo_logo_scarab-centered">
<!-- The logo (scarab and dung), with the scarab's rotational center at (0,0), the dung above -->
<!-- The scarab's rotational center in this case is not the center of its bounding box,
but is calculated to be the intersection-point of the torso, spine and wings -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -175.85)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -5.85)" />
</g>
<g id="cairo_logo_top-centered">
<!-- The logo (scarab and dung), with the top-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 230)" /><!-- (0,170+60) -->
</g>
<g id="cairo_logo_bottom-centered">
<!-- The logo (scarab and dung), with the bottom-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -170)" />
</g>
<g id="cairo_logo_right-centered">
<!-- The logo (scarab and dung), with the right-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 30)" />
</g>
<g id="cairo_logo_left-centered">
<!-- The logo (scarab and dung), with the left-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 30)" />
</g>
<g id="cairo_logo_topleft-centered">
<!-- The logo (scarab and dung), with the top-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 230)" /><!-- (150, 170+60) -->
</g>
<g id="cairo_logo_topright-centered">
<!-- The logo (scarab and dung), with the top-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 230)" /><!-- (-150,170+60) -->
</g>
<g id="cairo_logo_bottomleft-centered">
<!-- The logo (scarab and dung), with the bottom-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, -170)" />
</g>
<g id="cairo_logo_bottomright-centered">
<!-- The logo (scarab and dung), with the bottom-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, -170)" />
</g>
<g id="cairo_text" transform="translate(0,-97)">
<g transform="scale(0.1484,0.1484)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(65,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(486.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1234.25,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1610,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small_spaced" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(379.5,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1341.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1826,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(261.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(764.75)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(988.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1355.5,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<g id="cairo_logo_text_small">
<!-- The logo on the left, the text 'cairo' on the right -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(0, 78), scale(0.1944)" />
<use xlink:href="#cairo_text_small" fill="white" transform="translate(175,82)"/>
</g>
<g id="cairo_logo_with_text">
<!-- The logo (scarab and dung), with the text 'cairo' below, the dot of the 'i' positioned between the hind legs of the scarab -->
<!-- dimensions: 300x490, centered -->
<use xlink:href="#cairo_logo_top-centered" transform="translate(0, -245)" />
<use xlink:href="#cairo_text" transform="translate(0, 245)" />
</g>
<g id="cairo_banner">
<!-- The logo on the left, the text 'cairo' in the center, and a mirror image of the logo on the right -->
<!-- The logos are scaled such that the scarab body nearly matches the height of the text characters (excepting the 'i')
and the dung should nearly aligns with the dot of the 'i'. The bottoms of the logos are aligned with the bottom of the text. -->
<!-- dimensions: 370x88, centered -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(-180, 40), scale(0.1944)" />
<use xlink:href="#cairo_text_small" transform="translate(0, 42)" fill="black" />
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(180, 40), scale(0.1944), scale(-1, 1)" />
</g>
<g id="freedesktop_org_logo" style="fill:#FFFFFF;stroke:#3B80AE;stroke-width:2.4588;">
<g>
<path style="stroke:#BABABA;" d="M85.277,40.796c2.058,7.884-2.667,15.942-10.551,17.999L27.143,71.21c-7.884,2.057-15.943-2.667-18-10.552
l-7.448-28.55c-2.057-7.884,2.667-15.942,10.551-17.999L59.83,1.695c7.884-2.057,15.942,2.667,17.999,10.551
l7.449,28.55z"/>>
<path style="fill:#3B80AE;stroke:none;" d="M80.444,39.778c1.749,7.854-1.816,13.621-9.504,15.447l-42.236,11.02c-7.569,2.396-14.089-1.181
-15.838-8.836L6.53,33.127c-1.749-8.145,0.709-12.889,9.503-15.447L58.27,6.661
c8.144-1.826,14.089,1.363,15.838,8.835l6.336,24.282z"/>>
</g>g>
<path style="opacity:0.5;fill:none;stroke:#FFFFFF;" d="M45.542,51.793L24.104,31.102l38.1-4.393L45.542,51.793z"/>>
<path d="M72.325,28.769c0.405,1.55-0.525,3.136-2.075,3.541l-12.331,3.217c-1.551,0.404-3.137-0.525-3.542-2.076l-2.295-8.801
c-0.405-1.551,0.524-3.137,2.076-3.542l12.33-3.217c1.551-0.405,3.137,0.525,3.542,2.076l2.295,8.801z"/>>
<path d="M36.51,33.625c0.496,1.9-0.645,3.844-2.545,4.34l-15.112,3.943c-1.901,0.496-3.845-0.644-4.34-2.544l-2.814-10.786
c-0.496-1.901,0.644-3.844,2.544-4.34l15.113-3.942c1.901-0.496,3.845,0.643,4.34,2.544l2.814,10.786z"/>>
<path d="M52.493,53.208c0.278,1.065-0.36,2.154-1.425,2.432L42.6,57.848c-1.064,0.277-2.153-0.36-2.431-1.426l-1.577-6.043
c-0.277-1.064,0.36-2.153,1.425-2.432l8.468-2.209c1.064-0.277,2.154,0.361,2.431,1.426l1.577,6.043z"/>>
</g>g>
<g id="bullet">
<use x="0" y="0" xlink:href="#cairo_logo" transform="translate(-6,-2) scale(0.1, 0.1)"/>>
</g>
<g id="redhat_logo_horizontal">
<!-- 380x125 Red Hat log (horizontal layout) -->
<g fill="black" stroke="none"
transform="translate(0,124),scale(1,-1),translate(-214,-258)"
fill-rule="evenodd"
>
<!-- r -->
<path fill="black" d="
M 367.0625 315.3203
C 367.0625 320.8765 366.9463 324.9644 366.7227 328.6597
L 375.811 328.6597
L 376.2002 320.7764
L 376.4971 320.7764
C 378.5391 326.6221 383.3809 329.5996 387.8594 329.5996
C 388.8843 329.5996 389.4824 329.5601 390.3218 329.373
L 390.3218 319.4863
C 389.3398 319.6763 388.4224 319.7842 387.1592 319.7842
C 382.1597 319.7842 378.688 316.6006 377.751 311.8447
C 377.5732 310.918 377.4805 309.8086 377.4805 308.6777
L 377.4805 287.1504
L 366.9766 287.1504
L 367.0625 315.3203
" />
<!-- e -->
<path fill="black" d="
M 402.9927 305.0791
C 403.2715 297.5586 409.0918 294.2695 415.814 294.2695
C 420.6406 294.2695 424.0942 295.0234 427.2681 296.1924
L 428.8232 288.9678
C 425.269 287.4629 420.3413 286.3359 414.3149 286.3359
C 400.8384 286.3359 392.9409 294.6592 392.9409 307.3809
C 392.9409 318.8369 399.8911 329.6772 413.2437 329.6772
C 426.7397 329.6772 431.1338 318.5771 431.1338 309.4893
C 431.1338 307.5381 430.9624 305.9707 430.7593 305.0059
L 402.9927 305.0791
M 421.2485 312.3926
C 421.2954 316.2388 419.6206 322.5088 412.5903 322.5088
C 406.1299 322.5088 403.4438 316.645 402.9722 312.3926
L 421.2485 312.3926
" />
<!-- d -->
<path fill="black" d="
M 476.355 344.667
L 465.8638 347.5083
L 465.8638 324.1914
L 465.6904 324.1914
C 463.8335 327.2563 459.7407 329.5996 454.0571 329.5996
C 444.0762 329.5996 435.3828 321.3374 435.4478 307.4307
C 435.4478 294.6719 443.2983 286.2168 453.2119 286.2168
C 459.2017 286.2168 464.2114 289.0723 466.6909 293.7217
L 466.8779 293.7217
L 467.3491 287.1504
L 476.6997 287.1504
C 476.5083 289.9717 476.355 294.543 476.355 298.792
L 476.355 344.667
M 465.8638 305.1504
C 465.8638 304.0479 465.7856 303.0234 465.5454 302.0869
C 464.4873 297.5439 460.7734 294.6172 456.4819 294.6172
C 449.8721 294.6172 446.0903 300.1885 446.0903 307.8164
C 446.0903 315.5166 449.8384 321.4761 456.6016 321.4761
C 461.3208 321.4761 464.6992 318.1484 465.6274 314.1064
C 465.8071 313.2559 465.8638 312.208 465.8638 311.3711
L 465.8638 305.1504
" />
<!-- h -->
<path fill="black" d="
M 503.7964 329.0176
C 500.6836 329.0176 497.8926 328.1187 495.5493 326.6714
C 493.1162 325.2461 491.1353 323.0464 489.959 320.7666
L 489.7915 320.7666
L 489.7915 341.0195
L 485.7427 342.1226
L 485.7427 287.1504
L 489.7915 287.1504
L 489.7915 312.1787
C 489.7915 313.8408 489.9204 314.9946 490.3462 316.2109
C 492.0928 321.3013 496.8896 325.4805 502.689 325.4805
C 511.0664 325.4805 513.9673 318.7603 513.9673 311.3906
L 513.9673 287.1504
L 518.0137 287.1504
L 518.0137 311.8359
C 518.0137 327.0791 507.6753 329.0176 503.7964 329.0176
" />
<!-- a -->
<path fill="black" d="
M 554.3413 296.873
C 554.3413 293.6357 554.4692 290.2832 554.9375 287.1504
L 551.2085 287.1504
L 550.6128 293.0156
L 550.4209 293.0156
C 548.438 289.8594 543.8765 286.2168 537.3726 286.2168
C 529.1392 286.2168 525.3057 292.0117 525.3057 297.4688
C 525.3057 306.9121 533.6421 312.6064 550.292 312.4321
L 550.292 313.5234
C 550.292 317.5718 549.5044 325.6475 539.8242 325.5859
C 536.2446 325.5859 532.5132 324.6255 529.5513 322.5366
L 528.2632 325.4805
C 532.0015 328.0137 536.5659 329.0176 540.2705 329.0176
C 552.0801 329.0176 554.3413 320.1509 554.3413 312.8379
L 554.3413 296.873
M 550.292 309.0234
C 541.3813 309.2813 529.6128 307.9336 529.6128 298.1055
C 529.6128 292.2246 533.4946 289.5811 537.7578 289.5811
C 544.5796 289.5811 548.4561 293.8018 549.8677 297.7871
C 550.1646 298.6621 550.292 299.5371 550.292 300.2402
L 550.292 309.0234
" />
<!-- t -->
<path fill="black" d="
M 570.459 337.0996
L 570.459 328.0801
L 582.1235 328.0801
L 582.1235 324.7959
L 570.459 324.7959
L 570.459 298.1943
C 570.459 292.9912 572.0757 289.7285 576.4692 289.7285
C 578.5815 289.7285 580.0757 290.0078 581.1206 290.3711
L 581.6099 287.2354
C 580.2871 286.6836 578.4302 286.2539 575.9619 286.2539
C 572.9741 286.2539 570.4995 287.1934 568.8994 289.1543
C 567.0469 291.3057 566.4116 294.7412 566.4116 298.916
L 566.4116 324.7959
L 559.5059 324.7959
L 559.5059 328.0801
L 566.4116 328.0801
L 566.4116 335.606
L 570.459 337.0996
" />
<!-- ® for 'redhat' -->
<path fill="black" d="
M 335.5 288.9707
L 336.0352 288.9707
L 336.8408 287.6445
L 337.3608 287.6445
L 336.4888 288.9937
C 336.9404 289.0498 337.2832 289.2881 337.2832 289.834
C 337.2832 290.4385 336.9258 290.7051 336.2017 290.7051
L 335.0366 290.7051
L 335.0366 287.6445
L 335.5 287.6445
L 335.5 288.9707
M 335.5 289.3643
L 335.5 290.3101
L 336.1318 290.3101
C 336.4531 290.3101 336.7979 290.2402 336.7979 289.8647
C 336.7979 289.3916 336.4492 289.3643 336.0566 289.3643
L 335.5 289.3643
" />
<path fill="black" d="
M 339.0439 289.1719
C 339.0439 287.5176 337.7041 286.1763 336.0493 286.1763
C 334.395 286.1763 333.0527 287.5176 333.0527 289.1719
C 333.0527 290.8271 334.395 292.1675 336.0493 292.1675
C 337.7041 292.1675 339.0439 290.8271 339.0439 289.1719
M 336.0493 291.6367
C 334.6865 291.6367 333.5835 290.5332 333.5835 289.1719
C 333.5835 287.8096 334.6865 286.7061 336.0493 286.7061
C 337.4082 286.7061 338.5117 287.8096 338.5117 289.1719
C 338.5117 290.5332 337.4082 291.6367 336.0493 291.6367
" />
<!-- Black background behind The Shadowman -->
<path fill="black" d="
M 326.4531 286.208
C 324.1177 286.7451 321.6396 287.0801 319.1338 287.0801
C 314.8496 287.0801 310.9502 286.3389 308.0732 285.1426
C 307.7559 284.9844 307.5303 284.6533 307.5303 284.2764
C 307.5303 284.1406 307.5654 283.999 307.6172 283.8838
C 307.957 282.8975 307.3984 281.8281 304.6157 281.2158
C 300.4883 280.3096 297.8833 276.0527 296.3916 274.6367
C 294.6411 272.9756 289.6973 271.9531 290.4404 272.9434
C 291.0225 273.7188 293.2485 276.1348 294.6016 278.748
C 295.8125 281.083 296.8906 281.7461 298.375 283.9736
C 298.811 284.627 300.4995 286.9219 300.9912 288.7373
C 301.543 290.5107 301.356 292.7344 301.5679 293.6494
C 301.8721 294.9697 303.1182 297.8369 303.2129 299.4531
C 303.2666 300.3691 299.3916 298.1494 297.5532 298.1494
C 295.7144 298.1494 293.9233 299.248 292.2808 299.3281
C 290.248 299.4248 288.9414 297.7607 287.1025 298.0508
C 286.0518 298.2178 285.167 299.1426 283.3311 299.2129
C 280.7178 299.3086 277.5244 297.7607 271.5264 297.9531
C 265.6255 298.1436 260.1753 305.4082 259.4312 306.5635
C 258.5605 307.9199 257.4961 307.9199 256.335 306.8555
C 255.1738 305.792 253.7432 306.627 253.3359 307.3389
C 252.5615 308.6943 250.4927 312.6543 247.2881 313.4824
C 242.8564 314.6309 240.6118 311.0283 240.9033 308.1621
C 241.1987 305.252 243.0801 304.4375 243.9512 302.8906
C 244.8213 301.3428 245.2671 300.3428 246.9053 299.6572
C 248.0674 299.1758 248.5 298.458 248.1533 297.5049
C 247.8506 296.6738 246.6416 296.4834 245.8477 296.4463
C 244.1592 296.3662 242.9756 296.8242 242.1123 297.376
C 241.1084 298.0137 240.292 298.9033 239.416 300.4131
C 238.4023 302.0781 236.8052 302.8037 234.9453 302.8037
C 234.0586 302.8037 233.2295 302.5693 232.4922 302.1895
C 229.5771 300.6748 226.1064 299.7744 222.3706 299.7744
L 218.1572 299.7734
C 216.1064 305.8555 214.9951 312.3682 214.9951 319.1416
C 214.9951 352.6064 242.1226 379.7334 275.5859 379.7334
C 309.0498 379.7334 336.1758 352.6064 336.1758 319.1416
C 336.1758 307 332.6035 295.6895 326.4531 286.208
" />
<!-- The Shadowman's face -->
<path fill="white" d="
M 326.4531 286.209
C 324.1177 286.7461 321.6396 287.084 319.1338 287.084
C 314.8496 287.084 310.9502 286.3418 308.0732 285.1436
C 307.7559 284.9873 307.5303 284.6553 307.5303 284.2783
C 307.5303 284.1416 307.5654 284.001 307.6172 283.8838
C 307.957 282.8994 307.3984 281.8311 304.6157 281.2178
C 300.4883 280.3115 297.8833 276.0537 296.3916 274.6416
C 294.6411 272.9766 289.6973 271.9551 290.4404 272.9463
C 291.0225 273.7197 293.2485 276.1367 294.6016 278.749
C 295.8125 281.083 296.8906 281.75 298.375 283.9756
C 298.811 284.627 300.4995 286.9238 300.9912 288.7402
C 301.543 290.5117 301.356 292.7354 301.5679 293.6514
C 301.8721 294.9727 303.1182 297.8379 303.2129 299.457
C 303.2666 300.3721 299.3916 298.1504 297.5532 298.1504
C 295.7144 298.1504 293.9233 299.251 292.2808 299.3301
C 290.248 299.4258 288.9414 297.7627 287.1025 298.0518
C 286.0518 298.2207 285.167 299.1465 283.3311 299.2148
C 280.7178 299.3096 277.5244 297.7627 271.5264 297.9561
C 265.6255 298.1475 260.1753 305.4121 259.4312 306.5674
C 258.5605 307.9219 257.4961 307.9219 256.335 306.8574
C 255.1738 305.7939 253.7432 306.6299 253.3359 307.3438
C 252.5615 308.6963 250.4927 312.6553 247.2881 313.4854
C 242.8564 314.6338 240.6118 311.0313 240.9033 308.1641
C 241.1987 305.2539 243.0801 304.4395 243.9512 302.8926
C 244.8213 301.3438 245.2671 300.3457 246.9053 299.6621
C 248.0674 299.1768 248.5 298.4609 248.1533 297.5068
C 247.8506 296.6768 246.6416 296.4873 245.8477 296.4492
C 244.1592 296.3672 242.9756 296.8262 242.1123 297.376
C 241.1084 298.0176 240.292 298.9043 239.416 300.416
C 238.4023 302.0801 236.8052 302.8086 234.9453 302.8086
C 234.0586 302.8086 233.2295 302.5723 232.4922 302.1934
C 229.5771 300.6748 226.1064 299.7773 222.3706 299.7773
L 218.1572 299.7744
C 226.2363 275.8105 248.8965 258.5527 275.5859 258.5527
C 296.9063 258.5527 315.6538 269.5635 326.4531 286.209
" />
<!-- nose shadow -->
<path fill="black" d="
M 288.9307 291.7637
C 289.2422 291.46 289.7793 290.4375 289.1226 289.1396
C 288.7544 288.4521 288.3579 287.9678 287.6489 287.4023
C 286.7969 286.7188 285.1309 285.9307 282.8457 287.3799
C 281.6172 288.1592 281.543 288.4209 279.8467 288.2012
C 278.6348 288.043 278.1533 289.2656 278.5884 290.2832
C 279.0244 291.2969 280.8145 292.1191 283.04 290.8135
C 284.041 290.2256 285.6025 288.9844 286.9688 290.084
C 287.5356 290.5381 287.875 290.8408 288.6611 291.75
C 288.6963 291.7881 288.7461 291.8105 288.8018 291.8105
C 288.8516 291.8105 288.8965 291.793 288.9307 291.7637
" />
<!-- The Shadowman's red hat -->
<path fill="#cc0000" d="
M 309.7769 335.2627
C 309.1787 333.251 308.3271 330.6763 304.5391 328.7314
C 303.9878 328.4497 303.7764 328.9126 304.0313 329.3477
C 305.4629 331.7832 305.7168 332.3921 306.1328 333.3525
C 306.7148 334.7568 307.02 336.7549 305.8618 340.9219
C 303.5835 349.1221 298.8296 360.083 295.375 363.6392
C 292.04 367.0698 285.998 368.0361 280.5371 366.6348
C 278.5264 366.1191 274.5918 364.0732 267.2939 365.7168
C 254.665 368.5605 252.7939 362.2368 252.0693 359.4824
C 251.3438 356.7271 249.6045 348.897 249.6045 348.897
C 249.0244 345.7085 248.2646 340.1631 267.874 336.4287
C 277.0088 334.6885 277.4736 332.3276 277.8779 330.6289
C 278.603 327.585 279.7627 325.8438 281.0674 324.9746
C 282.373 324.1035 281.0674 323.3828 279.6187 323.2349
C 275.7285 322.8311 261.3491 326.9541 252.8428 331.7881
C 245.8828 336.0415 245.7656 339.8721 247.3584 343.1211
C 236.8452 344.2573 228.9561 342.1348 227.5254 337.1582
C 225.0693 328.6157 246.3047 314.0264 270.4839 306.7061
C 295.8579 299.0225 321.9556 304.3857 324.8564 320.335
C 326.1738 327.5811 320.0713 332.9419 309.7769 335.2627
" />
<!-- shadow on hat -->
<path fill="black" d="
M 270.8711 350.8813
C 263.8721 350.375 263.145 349.6191 261.834 348.2227
C 259.9854 346.2539 257.5508 350.7773 257.5508 350.7773
C 256.0898 351.085 254.3179 353.4404 255.2744 355.6411
C 256.2158 357.8174 257.9551 357.1641 258.5 356.4868
C 259.1626 355.6621 260.5771 354.3125 262.4141 354.3613
C 264.251 354.4097 266.3706 354.7959 269.3262 354.7959
C 272.3213 354.7959 274.335 353.6777 274.4487 352.7168
C 274.5459 351.8965 274.2061 351.1226 270.8711 350.8813
" />
<!-- another shadow on hat -->
<path fill="black" d="
M 278.2236 362.4463
C 278.2129 362.4453 278.2021 362.4438 278.1919 362.4438
C 278.084 362.4438 277.9961 362.5273 277.9961 362.6274
C 277.9961 362.7007 278.041 362.7646 278.106 362.7939
C 279.4629 363.5107 281.4873 364.0811 283.8042 364.3169
C 284.499 364.3887 285.1787 364.4248 285.832 364.4307
C 285.9478 364.4307 286.0615 364.4297 286.1787 364.4277
C 290.062 364.3398 293.1719 362.7974 293.1255 360.9814
C 293.0791 359.165 289.8955 357.7637 286.0112 357.8506
C 284.7529 357.8794 283.5732 358.0615 282.5576 358.3545
C 282.4385 358.3857 282.3506 358.4883 282.3506 358.6094
C 282.3506 358.731 282.4385 358.834 282.5605 358.8638
C 284.9839 359.4248 286.6191 360.3408 286.5039 361.207
C 286.3511 362.3545 283.1816 362.979 279.4248 362.6011
C 279.0137 362.5596 278.6118 362.5068 278.2236 362.4463
" />
<!-- ® for The Shadowman -->
<path fill="black" d="
M 588.3018 288.9707
L 588.8369 288.9707
L 589.6426 287.6445
L 590.1626 287.6445
L 589.2905 288.9937
C 589.7422 289.0498 590.085 289.2881 590.085 289.834
C 590.085 290.4385 589.7275 290.7051 589.0034 290.7051
L 587.8384 290.7051
L 587.8384 287.6445
L 588.3018 287.6445
L 588.3018 288.9707
M 588.3018 289.3643
L 588.3018 290.3101
L 588.9336 290.3101
C 589.2549 290.3101 589.5996 290.2402 589.5996 289.8647
C 589.5996 289.3916 589.251 289.3643 588.8584 289.3643
L 588.3018 289.3643
" />
<path fill="black" d="
M 591.8457 289.1719
C 591.8457 287.5176 590.5059 286.1763 588.8511 286.1763
C 587.1968 286.1763 585.8545 287.5176 585.8545 289.1719
C 585.8545 290.8271 587.1968 292.1675 588.8511 292.1675
C 590.5059 292.1675 591.8457 290.8271 591.8457 289.1719
M 588.8511 291.6367
C 587.4883 291.6367 586.3853 290.5332 586.3853 289.1719
C 586.3853 287.8096 587.4883 286.7061 588.8511 286.7061
C 590.21 286.7061 591.3135 287.8096 591.3135 289.1719
C 591.3135 290.5332 590.21 291.6367 588.8511 291.6367
" />
</g>
</g>
</defs>
<g id="watermark" transform="translate(200, 185), rotate(-50), scale(2.5)">
<use xlink:href="#scarab" x="0" y="170" fill-opacity="0.2"/>
</g>
<!-- Blue bar at top of slide -->
<rect x="0" y="0" width="1024" height="170" fill="#162284" />
<!-- Scarab and "cairo" at upper-left -->
<g transform="translate(10,0)">
<use stroke="none" xlink:href="#cairo_logo_text_small"/>
</g>
<!-- Presentation title at upper-right -->
<text ss:variable="presentation-subtitle" text-anchor="end"
fill="white" x="1016" y="28" font-size="20">Presentation Sub-title</text>
<!-- Red Hat logo at lower-left -->
<use xlink:href="#redhat_logo_horizontal" transform="translate(8,768),scale(.5,.5),translate(0, -125)" />
<g font-family="Frutiger">
<text text-anchor="middle"
fill="black"
x="512"
y="300" font-size="80"
font-weight="bold"
ss:variable="title">Slide Title</text>
<!-- Slide content -->
<g ss:region="default">
<rect x="512" y="400" width="2" height="280" fill="none" stroke="blue"/>
<text font-size="50" fill="black" text-anchor="middle"
x="512" y="450">Slide content</text>
</g>
<!-- Footer -->
<text ss:variable="URL" x="1016" y="753" text-anchor="end" font-size="20">https://cairographics.org</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

@@ -0,0 +1,898 @@
<?xml version="1.0" ?>
<svg width="1024" height="768"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ss="http://www.svgslides.org/svgslides0.1"
fill="black">
<defs id="cairo-artwork_defs">
<g id="hacker_emblem">
<!-- Note: This is similar though not identical to Keith Packard's SVG version
of the hacker emblem (http://www.catb.org/hacker-emblem/glider.svg) -->
<g id="hacker_emblem_grid" fill="white" stroke="none">
<!-- Outside: Top, Right, Bottom, Left -->
<rect x="-2.95" y="-3.05" width="6" height="0.1" />
<rect x="2.95" y="-2.95" width="0.1" height="6" />
<rect x="-3.05" y="2.95" width="6" height="0.1" />
<rect x="-3.05" y="-3.05" width="0.1" height="6" />
<!-- Vertical: Left, Right -->
<rect x="-1.05" y="-2.95" width="0.1" height="5.9" />
<rect x="0.95" y="-2.95" width="0.1" height="5.9" />
<!-- Horizontal: TopLeft, TopMiddle, TopRight -->
<rect x="-2.95" y="-1.05" width="1.9" height="0.1" />
<rect x="-0.95" y="-1.05" width="1.9" height="0.1" />
<rect x="1.05" y="-1.05" width="1.9" height="0.1" />
<!-- Horizontal: BottomLeft, BottomMiddle, BottomRight -->
<rect x="-2.95" y="0.95" width="1.9" height="0.1" />
<rect x="-0.95" y="0.95" width="1.9" height="0.1" />
<rect x="1.05" y="0.95" width="1.9" height="0.1" />
</g>
<g id="hacker_emblem_dots" fill="white">
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<g id="scarab" fill="#f19a14">
<g transform="translate(-150, -170)">
<path id="scarab_head" d="M205.599,94.567c0-11.668-24.914-21.129-55.628-21.129
c-30.723,0-55.624,9.46-55.624,21.129c0,10.203,24.901,7.346,55.624,7.346C180.685,101.913,205.599,104.233,205.599,94.567z"/>
<path id="scarab_torso" d="M136.423,161.506c0,0,12.751,12.577,13.547,13.362
c2.262-2.232,13.545-13.362,13.545-13.362c7.135-7.036,87.111-6.399,91.066-6.363c-0.469-6.298-1.254-12.472-2.325-18.519
c-15.183-19.279-42.811-32.225-74.485-32.225h-55.518c-31.745,0-59.439,13.011-74.598,32.37c-1.054,6-1.829,12.128-2.296,18.374
C49.321,155.106,129.288,154.47,136.423,161.506z"/>
<path id="scarab_spine" d="M149.97,301.187c2.005-24.729,8.386-103.483,8.405-103.721
c-0.09-0.219-6.478-15.578-8.405-20.214c-1.936,4.655-8.316,19.995-8.408,20.214C141.582,197.704,147.965,276.458,149.97,301.187z"/>
<path id="scarab_wing_left" d="M140.403,197.149l8.862-21.31l-13.686-13.499
c-5.65-5.573-67.074-6.235-90.259-6.019l-0.006-0.622c-0.154,2.144-0.271,4.302-0.35,6.475
c-0.076,2.207,10.392,4.706,10.392,6.717c0,2.319-10.457,5.084-10.359,7.631c2.993,73.349,48.53,131.631,104.372,132.048
l-9.02-111.29L140.403,197.149z"/>
<path id="scarab_wing_right" d="M244.585,168.891c0-2.011,10.467-4.506,10.391-6.715
c-0.079-2.174-0.195-4.332-0.351-6.479l-0.004,0.624c-23.186-0.216-84.608,0.445-90.26,6.017l-13.688,13.502l8.915,21.438
l-9.017,111.29c55.854-0.417,101.378-58.698,104.373-132.049C255.04,173.976,244.585,171.209,244.585,168.891z"/>
<path id="scarab_leg_front_left" d="M44.506,141.12c-4.135-0.856-4.895-1.54-7.935-2.92
c-9.59-3.364-10.376-5.481-16.08-11.86c-7.426-8.306-12.661-20.142-17.1-29.463c-3.576-7.525-3.984-16.409-2.86-24.273
c0.991-6.935,7.144-12.869,12.074-18.92c5.844-7.191,10.356-14.822,17.924-21.354c7.736-6.682,23.203-9.809,26.168-19.648
C57.86,8.819,54.334,1.766,61.482,0c-0.366,4.703,3.639,8.477,2.397,13.575c-1.129,4.627-4.368,5.811-9.611,9.099
c-7.564,4.746-18.366,8.779-24.748,13.965c-7.175,5.827-4.369,13.771-10.569,20.057c-2.001,2.03-7.901,4.706-9.137,6.83
c-1.861,3.199-0.297,9.572-0.116,13.12c0.425,8.284,5.588,14.244,9.555,22.045c4.152,8.141,6.429,15.409,13.411,22.519
c4.183,4.262,11.429,4.802,16.21,10.647l-3.555,4.186L44.506,141.12z"/>
<path id="scarab_leg_middle_left" d="M43.94,191.922l-0.809-7.346
c-9.506-4.579-10.339-9.772-20.738-12.466c-23.728-6.151-21.361,11.25-15.532,26.373c5.676,14.726,8.237,30.23,14.345,44.795
c2.805,6.688,6.919,13.213,14.298,15.127c0.372-8.435-0.917-10.651-6.113-16.919c-4.395-5.293-3.326-12.548-6.072-18.504
c-3.581-7.804-4.196-15.646-7.279-23.502c-1.363-3.479-8.33-13.966-6.452-17.861c3.183-6.603,9.178-0.083,12.179,2.077
c4.218,3.036,6.467,2.223,11.681,2.898C34.041,186.673,37.005,188.756,43.94,191.922z"/>
<path id="scarab_leg_back_left" d="M65.839,257.063l-2.771-4.837
c-6.68,8.928-6.993,16.228-10.056,23.347c-5.277,12.263-0.157,28.851,9.854,37.676c6.052,5.375,15.907,9.618,23.122,13.136
c10.035,4.892,20.113,11.286,31.336,13.396c2.482,0.466,8.798,1.295,6.693-3.522c-0.975-2.237-8.091-4.591-10.146-5.734
c-8.312-4.623-16.377-10.524-24.142-16.176c-9.498-6.862-20.843-11.186-28.311-20.684c-3.054-3.885-3.544-4.922-2.816-9.39
c0.693-4.263,1.344-9.174,2.241-13.439C61.855,266.029,63.274,261.378,65.839,257.063z"/>
<path id="scarab_leg_front_right" d="M255.487,141.12c4.134-0.856,4.896-1.54,7.936-2.92
c9.583-3.364,10.369-5.481,16.071-11.86c7.428-8.306,12.661-20.142,17.115-29.463c3.574-7.525,3.983-16.409,2.86-24.273
c-0.992-6.935-7.157-12.869-12.087-18.92c-5.843-7.191-10.356-14.822-17.919-21.354c-7.735-6.682-23.202-9.809-26.167-19.648
C242.135,8.819,245.66,1.766,238.511,0c0.366,4.703-3.637,8.477-2.396,13.575c1.131,4.627,4.368,5.811,9.611,9.099
c7.563,4.746,18.367,8.779,24.747,13.965c7.17,5.827,4.362,13.771,10.563,20.057c2.001,2.03,7.901,4.706,9.139,6.83
c1.859,3.199,0.295,9.572,0.113,13.12c-0.424,8.284-5.588,14.244-9.553,22.045c-4.152,8.141-6.431,15.409-13.404,22.519
c-4.184,4.262-11.429,4.802-16.211,10.647l3.556,4.186L255.487,141.12z"/>
<path id="scarab_leg_middle_right" d="M256.053,191.922l0.81-7.346
c9.507-4.579,10.34-9.772,20.73-12.466c23.741-6.151,21.374,11.25,15.534,26.373c-5.676,14.726-8.238,30.23-14.347,44.795
c-2.804,6.688-6.911,13.213-14.291,15.127c-0.371-8.435,0.918-10.651,6.113-16.919c4.39-5.293,3.319-12.548,6.066-18.504
c3.58-7.804,4.197-15.646,7.278-23.502c1.363-3.479,8.33-13.966,6.453-17.861c-3.184-6.603-9.179-0.083-12.181,2.077
c-4.217,3.036-6.458,2.223-11.672,2.898C265.951,186.673,262.986,188.756,256.053,191.922z"/>
<path id="scarab_leg_back_right" d="M234.155,257.063l2.771-4.837
c6.679,8.928,6.991,16.228,10.057,23.347c5.274,12.263,0.154,28.851-9.854,37.676c-6.055,5.375-15.903,9.618-23.117,13.136
c-10.034,4.892-20.127,11.286-31.351,13.396c-2.481,0.466-8.789,1.295-6.691-3.522c0.976-2.237,8.092-4.591,10.146-5.734
c8.312-4.623,16.392-10.524,24.155-16.176c9.498-6.862,20.838-11.186,28.305-20.684c3.055-3.885,3.543-4.922,2.818-9.39
c-0.696-4.263-1.346-9.174-2.244-13.439C238.137,266.029,236.718,261.378,234.155,257.063z"/>
</g>
</g>
<radialGradient id="gradient_radial_dung"
cx="0" cy="0" r="60"
fx="0" fy="0" gradientUnits="userSpaceOnUse"
>
<stop offset="0" stop-color="#9a9a9a" />
<stop offset="0.70" stop-color="#bababa" />
<stop offset="0.95" stop-color="#FFFFFF" />
</radialGradient>
<g id="dung">
<circle cx="0" cy="0" r="60" fill="url(#gradient_radial_dung)" />
<g transform="translate(-61, -61)">
<!-- rough equivalent: <circle cx="0" cy="0" r="60" stroke="#8a8a8a" stroke-width="2" /> -->
<path fill="#8a8a8a" d="M0,61c0,33.636,27.364,61,61,61s61-27.364,61-61S94.636,0,61,0S0,27.364,0,61z
M2,61C2,28.467,28.467,2,61,2c32.532,0,59,26.467,59,59c0,32.533-26.468,59-59,59C28.467,120,2,93.533,2,61z"/>
</g>
<use xlink:href="#hacker_emblem" x="0" y="0" transform="scale(9)" />
</g>
<g id="dung_2_color">
<!-- This would be simple a circle like so:
<circle cx="0" cy="0" r="48" stroke-width="2" fill="none" stroke="white"/>
but there appears to currently be a bug in the cairo
PDF backend that results in an ugly spike in that
case. So we use 8 splines instead.
-->
<path stroke-width="4" stroke="white" fill="none" d="
M 48, 0
C 48, 12.730391512298112,
42.94287166245995, 24.939379331448613
33.941125496954285, 33.941125496954278
C 24.939379331448624, 42.942871662459943
12.730391512298114, 48
0, 48
C -12.730391512298109, 48,
-24.939379331448613, 42.94287166245995
-33.941125496954278, 33.941125496954285
C -42.942871662459943, 24.939379331448624,
-48, 12.730391512298118,
-48, 0,
C -48, -12.730391512298105,
-42.94287166245995, -24.939379331448613,
-33.941125496954285, -33.941125496954278
C -24.939379331448624, -42.942871662459943,
-12.730391512298119, -48,
0, -48
C 12.730391512298104, -48,
24.939379331448606, -42.942871662459943,
33.941125496954271, -33.941125496954285
C 42.942871662459936, -24.939379331448624,
48, -12.730391512298123,
48, 0" />
<g transform="scale(9)" fill="white" stroke="none"
stroke-width="0.2">
<!-- Hacker emblem grid -->
<path stroke="white" fill="none"
d="M -3,-3 L 3,-3 L 3,3 L-3,3 Z
M -1,-3 L -1, 3
M 1,-3 L 1, 3
M -3,-1 L 3,-1
M -3, 1 L 3, 1"/>
<!-- Hacker emblem dots -->
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<!-- scarab dimensions: 300x340 -->
<!-- dung dimensions: 120x120 (radius: 60) -->
<!-- scarab and dung dimensions: 300x400 -->
<g id="cairo_logo">
<!-- dimensions: 300x400, centered -->
<!-- The logo (scarab and dung), with the center-point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 30)" />
</g>
<g id="cairo_logo_dung-centered">
<!-- The logo (scarab and dung), with the dung at (0,0), the scarab below -->
<use xlink:href="#dung_2_color" x="0" y="0" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0,170)" />
</g>
<g id="cairo_logo_scarab-centered">
<!-- The logo (scarab and dung), with the scarab's rotational center at (0,0), the dung above -->
<!-- The scarab's rotational center in this case is not the center of its bounding box,
but is calculated to be the intersection-point of the torso, spine and wings -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -175.85)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -5.85)" />
</g>
<g id="cairo_logo_top-centered">
<!-- The logo (scarab and dung), with the top-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 230)" /><!-- (0,170+60) -->
</g>
<g id="cairo_logo_bottom-centered">
<!-- The logo (scarab and dung), with the bottom-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -170)" />
</g>
<g id="cairo_logo_right-centered">
<!-- The logo (scarab and dung), with the right-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 30)" />
</g>
<g id="cairo_logo_left-centered">
<!-- The logo (scarab and dung), with the left-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 30)" />
</g>
<g id="cairo_logo_topleft-centered">
<!-- The logo (scarab and dung), with the top-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 230)" /><!-- (150, 170+60) -->
</g>
<g id="cairo_logo_topright-centered">
<!-- The logo (scarab and dung), with the top-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 230)" /><!-- (-150,170+60) -->
</g>
<g id="cairo_logo_bottomleft-centered">
<!-- The logo (scarab and dung), with the bottom-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, -170)" />
</g>
<g id="cairo_logo_bottomright-centered">
<!-- The logo (scarab and dung), with the bottom-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, -170)" />
</g>
<g id="cairo_text" transform="translate(0,-97)">
<g transform="scale(0.1484,0.1484)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(65,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(486.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1234.25,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1610,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small_spaced" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(379.5,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1341.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1826,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(261.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(764.75)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(988.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1355.5,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<g id="cairo_logo_text_small">
<!-- The logo on the left, the text 'cairo' on the right -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(0, 78), scale(0.1944)" />
<use xlink:href="#cairo_text_small" fill="white" transform="translate(175,82)"/>
</g>
<g id="cairo_logo_with_text">
<!-- The logo (scarab and dung), with the text 'cairo' below, the dot of the 'i' positioned between the hind legs of the scarab -->
<!-- dimensions: 300x490, centered -->
<use xlink:href="#cairo_logo_top-centered" transform="translate(0, -245)" />
<use xlink:href="#cairo_text" transform="translate(0, 245)" />
</g>
<g id="cairo_banner">
<!-- The logo on the left, the text 'cairo' in the center, and a mirror image of the logo on the right -->
<!-- The logos are scaled such that the scarab body nearly matches the height of the text characters (excepting the 'i')
and the dung should nearly aligns with the dot of the 'i'. The bottoms of the logos are aligned with the bottom of the text. -->
<!-- dimensions: 370x88, centered -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(-180, 40), scale(0.1944)" />
<use xlink:href="#cairo_text_small" transform="translate(0, 42)" fill="black" />
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(180, 40), scale(0.1944), scale(-1, 1)" />
</g>
<g id="freedesktop_org_logo" style="fill:#FFFFFF;stroke:#3B80AE;stroke-width:2.4588;">
<g>
<path style="stroke:#BABABA;" d="M85.277,40.796c2.058,7.884-2.667,15.942-10.551,17.999L27.143,71.21c-7.884,2.057-15.943-2.667-18-10.552
l-7.448-28.55c-2.057-7.884,2.667-15.942,10.551-17.999L59.83,1.695c7.884-2.057,15.942,2.667,17.999,10.551
l7.449,28.55z"/>>
<path style="fill:#3B80AE;stroke:none;" d="M80.444,39.778c1.749,7.854-1.816,13.621-9.504,15.447l-42.236,11.02c-7.569,2.396-14.089-1.181
-15.838-8.836L6.53,33.127c-1.749-8.145,0.709-12.889,9.503-15.447L58.27,6.661
c8.144-1.826,14.089,1.363,15.838,8.835l6.336,24.282z"/>>
</g>g>
<path style="opacity:0.5;fill:none;stroke:#FFFFFF;" d="M45.542,51.793L24.104,31.102l38.1-4.393L45.542,51.793z"/>>
<path d="M72.325,28.769c0.405,1.55-0.525,3.136-2.075,3.541l-12.331,3.217c-1.551,0.404-3.137-0.525-3.542-2.076l-2.295-8.801
c-0.405-1.551,0.524-3.137,2.076-3.542l12.33-3.217c1.551-0.405,3.137,0.525,3.542,2.076l2.295,8.801z"/>>
<path d="M36.51,33.625c0.496,1.9-0.645,3.844-2.545,4.34l-15.112,3.943c-1.901,0.496-3.845-0.644-4.34-2.544l-2.814-10.786
c-0.496-1.901,0.644-3.844,2.544-4.34l15.113-3.942c1.901-0.496,3.845,0.643,4.34,2.544l2.814,10.786z"/>>
<path d="M52.493,53.208c0.278,1.065-0.36,2.154-1.425,2.432L42.6,57.848c-1.064,0.277-2.153-0.36-2.431-1.426l-1.577-6.043
c-0.277-1.064,0.36-2.153,1.425-2.432l8.468-2.209c1.064-0.277,2.154,0.361,2.431,1.426l1.577,6.043z"/>>
</g>g>
<g id="bullet">
<use x="0" y="0" xlink:href="#cairo_logo" transform="translate(-6,-2) scale(0.1, 0.1)"/>>
</g>
<g id="redhat_logo_horizontal">
<!-- 380x125 Red Hat log (horizontal layout) -->
<g fill="black" stroke="none"
transform="translate(0,124),scale(1,-1),translate(-214,-258)"
fill-rule="evenodd"
>
<!-- r -->
<path fill="black" d="
M 367.0625 315.3203
C 367.0625 320.8765 366.9463 324.9644 366.7227 328.6597
L 375.811 328.6597
L 376.2002 320.7764
L 376.4971 320.7764
C 378.5391 326.6221 383.3809 329.5996 387.8594 329.5996
C 388.8843 329.5996 389.4824 329.5601 390.3218 329.373
L 390.3218 319.4863
C 389.3398 319.6763 388.4224 319.7842 387.1592 319.7842
C 382.1597 319.7842 378.688 316.6006 377.751 311.8447
C 377.5732 310.918 377.4805 309.8086 377.4805 308.6777
L 377.4805 287.1504
L 366.9766 287.1504
L 367.0625 315.3203
" />
<!-- e -->
<path fill="black" d="
M 402.9927 305.0791
C 403.2715 297.5586 409.0918 294.2695 415.814 294.2695
C 420.6406 294.2695 424.0942 295.0234 427.2681 296.1924
L 428.8232 288.9678
C 425.269 287.4629 420.3413 286.3359 414.3149 286.3359
C 400.8384 286.3359 392.9409 294.6592 392.9409 307.3809
C 392.9409 318.8369 399.8911 329.6772 413.2437 329.6772
C 426.7397 329.6772 431.1338 318.5771 431.1338 309.4893
C 431.1338 307.5381 430.9624 305.9707 430.7593 305.0059
L 402.9927 305.0791
M 421.2485 312.3926
C 421.2954 316.2388 419.6206 322.5088 412.5903 322.5088
C 406.1299 322.5088 403.4438 316.645 402.9722 312.3926
L 421.2485 312.3926
" />
<!-- d -->
<path fill="black" d="
M 476.355 344.667
L 465.8638 347.5083
L 465.8638 324.1914
L 465.6904 324.1914
C 463.8335 327.2563 459.7407 329.5996 454.0571 329.5996
C 444.0762 329.5996 435.3828 321.3374 435.4478 307.4307
C 435.4478 294.6719 443.2983 286.2168 453.2119 286.2168
C 459.2017 286.2168 464.2114 289.0723 466.6909 293.7217
L 466.8779 293.7217
L 467.3491 287.1504
L 476.6997 287.1504
C 476.5083 289.9717 476.355 294.543 476.355 298.792
L 476.355 344.667
M 465.8638 305.1504
C 465.8638 304.0479 465.7856 303.0234 465.5454 302.0869
C 464.4873 297.5439 460.7734 294.6172 456.4819 294.6172
C 449.8721 294.6172 446.0903 300.1885 446.0903 307.8164
C 446.0903 315.5166 449.8384 321.4761 456.6016 321.4761
C 461.3208 321.4761 464.6992 318.1484 465.6274 314.1064
C 465.8071 313.2559 465.8638 312.208 465.8638 311.3711
L 465.8638 305.1504
" />
<!-- h -->
<path fill="black" d="
M 503.7964 329.0176
C 500.6836 329.0176 497.8926 328.1187 495.5493 326.6714
C 493.1162 325.2461 491.1353 323.0464 489.959 320.7666
L 489.7915 320.7666
L 489.7915 341.0195
L 485.7427 342.1226
L 485.7427 287.1504
L 489.7915 287.1504
L 489.7915 312.1787
C 489.7915 313.8408 489.9204 314.9946 490.3462 316.2109
C 492.0928 321.3013 496.8896 325.4805 502.689 325.4805
C 511.0664 325.4805 513.9673 318.7603 513.9673 311.3906
L 513.9673 287.1504
L 518.0137 287.1504
L 518.0137 311.8359
C 518.0137 327.0791 507.6753 329.0176 503.7964 329.0176
" />
<!-- a -->
<path fill="black" d="
M 554.3413 296.873
C 554.3413 293.6357 554.4692 290.2832 554.9375 287.1504
L 551.2085 287.1504
L 550.6128 293.0156
L 550.4209 293.0156
C 548.438 289.8594 543.8765 286.2168 537.3726 286.2168
C 529.1392 286.2168 525.3057 292.0117 525.3057 297.4688
C 525.3057 306.9121 533.6421 312.6064 550.292 312.4321
L 550.292 313.5234
C 550.292 317.5718 549.5044 325.6475 539.8242 325.5859
C 536.2446 325.5859 532.5132 324.6255 529.5513 322.5366
L 528.2632 325.4805
C 532.0015 328.0137 536.5659 329.0176 540.2705 329.0176
C 552.0801 329.0176 554.3413 320.1509 554.3413 312.8379
L 554.3413 296.873
M 550.292 309.0234
C 541.3813 309.2813 529.6128 307.9336 529.6128 298.1055
C 529.6128 292.2246 533.4946 289.5811 537.7578 289.5811
C 544.5796 289.5811 548.4561 293.8018 549.8677 297.7871
C 550.1646 298.6621 550.292 299.5371 550.292 300.2402
L 550.292 309.0234
" />
<!-- t -->
<path fill="black" d="
M 570.459 337.0996
L 570.459 328.0801
L 582.1235 328.0801
L 582.1235 324.7959
L 570.459 324.7959
L 570.459 298.1943
C 570.459 292.9912 572.0757 289.7285 576.4692 289.7285
C 578.5815 289.7285 580.0757 290.0078 581.1206 290.3711
L 581.6099 287.2354
C 580.2871 286.6836 578.4302 286.2539 575.9619 286.2539
C 572.9741 286.2539 570.4995 287.1934 568.8994 289.1543
C 567.0469 291.3057 566.4116 294.7412 566.4116 298.916
L 566.4116 324.7959
L 559.5059 324.7959
L 559.5059 328.0801
L 566.4116 328.0801
L 566.4116 335.606
L 570.459 337.0996
" />
<!-- ® for 'redhat' -->
<path fill="black" d="
M 335.5 288.9707
L 336.0352 288.9707
L 336.8408 287.6445
L 337.3608 287.6445
L 336.4888 288.9937
C 336.9404 289.0498 337.2832 289.2881 337.2832 289.834
C 337.2832 290.4385 336.9258 290.7051 336.2017 290.7051
L 335.0366 290.7051
L 335.0366 287.6445
L 335.5 287.6445
L 335.5 288.9707
M 335.5 289.3643
L 335.5 290.3101
L 336.1318 290.3101
C 336.4531 290.3101 336.7979 290.2402 336.7979 289.8647
C 336.7979 289.3916 336.4492 289.3643 336.0566 289.3643
L 335.5 289.3643
" />
<path fill="black" d="
M 339.0439 289.1719
C 339.0439 287.5176 337.7041 286.1763 336.0493 286.1763
C 334.395 286.1763 333.0527 287.5176 333.0527 289.1719
C 333.0527 290.8271 334.395 292.1675 336.0493 292.1675
C 337.7041 292.1675 339.0439 290.8271 339.0439 289.1719
M 336.0493 291.6367
C 334.6865 291.6367 333.5835 290.5332 333.5835 289.1719
C 333.5835 287.8096 334.6865 286.7061 336.0493 286.7061
C 337.4082 286.7061 338.5117 287.8096 338.5117 289.1719
C 338.5117 290.5332 337.4082 291.6367 336.0493 291.6367
" />
<!-- Black background behind The Shadowman -->
<path fill="black" d="
M 326.4531 286.208
C 324.1177 286.7451 321.6396 287.0801 319.1338 287.0801
C 314.8496 287.0801 310.9502 286.3389 308.0732 285.1426
C 307.7559 284.9844 307.5303 284.6533 307.5303 284.2764
C 307.5303 284.1406 307.5654 283.999 307.6172 283.8838
C 307.957 282.8975 307.3984 281.8281 304.6157 281.2158
C 300.4883 280.3096 297.8833 276.0527 296.3916 274.6367
C 294.6411 272.9756 289.6973 271.9531 290.4404 272.9434
C 291.0225 273.7188 293.2485 276.1348 294.6016 278.748
C 295.8125 281.083 296.8906 281.7461 298.375 283.9736
C 298.811 284.627 300.4995 286.9219 300.9912 288.7373
C 301.543 290.5107 301.356 292.7344 301.5679 293.6494
C 301.8721 294.9697 303.1182 297.8369 303.2129 299.4531
C 303.2666 300.3691 299.3916 298.1494 297.5532 298.1494
C 295.7144 298.1494 293.9233 299.248 292.2808 299.3281
C 290.248 299.4248 288.9414 297.7607 287.1025 298.0508
C 286.0518 298.2178 285.167 299.1426 283.3311 299.2129
C 280.7178 299.3086 277.5244 297.7607 271.5264 297.9531
C 265.6255 298.1436 260.1753 305.4082 259.4312 306.5635
C 258.5605 307.9199 257.4961 307.9199 256.335 306.8555
C 255.1738 305.792 253.7432 306.627 253.3359 307.3389
C 252.5615 308.6943 250.4927 312.6543 247.2881 313.4824
C 242.8564 314.6309 240.6118 311.0283 240.9033 308.1621
C 241.1987 305.252 243.0801 304.4375 243.9512 302.8906
C 244.8213 301.3428 245.2671 300.3428 246.9053 299.6572
C 248.0674 299.1758 248.5 298.458 248.1533 297.5049
C 247.8506 296.6738 246.6416 296.4834 245.8477 296.4463
C 244.1592 296.3662 242.9756 296.8242 242.1123 297.376
C 241.1084 298.0137 240.292 298.9033 239.416 300.4131
C 238.4023 302.0781 236.8052 302.8037 234.9453 302.8037
C 234.0586 302.8037 233.2295 302.5693 232.4922 302.1895
C 229.5771 300.6748 226.1064 299.7744 222.3706 299.7744
L 218.1572 299.7734
C 216.1064 305.8555 214.9951 312.3682 214.9951 319.1416
C 214.9951 352.6064 242.1226 379.7334 275.5859 379.7334
C 309.0498 379.7334 336.1758 352.6064 336.1758 319.1416
C 336.1758 307 332.6035 295.6895 326.4531 286.208
" />
<!-- The Shadowman's face -->
<path fill="white" d="
M 326.4531 286.209
C 324.1177 286.7461 321.6396 287.084 319.1338 287.084
C 314.8496 287.084 310.9502 286.3418 308.0732 285.1436
C 307.7559 284.9873 307.5303 284.6553 307.5303 284.2783
C 307.5303 284.1416 307.5654 284.001 307.6172 283.8838
C 307.957 282.8994 307.3984 281.8311 304.6157 281.2178
C 300.4883 280.3115 297.8833 276.0537 296.3916 274.6416
C 294.6411 272.9766 289.6973 271.9551 290.4404 272.9463
C 291.0225 273.7197 293.2485 276.1367 294.6016 278.749
C 295.8125 281.083 296.8906 281.75 298.375 283.9756
C 298.811 284.627 300.4995 286.9238 300.9912 288.7402
C 301.543 290.5117 301.356 292.7354 301.5679 293.6514
C 301.8721 294.9727 303.1182 297.8379 303.2129 299.457
C 303.2666 300.3721 299.3916 298.1504 297.5532 298.1504
C 295.7144 298.1504 293.9233 299.251 292.2808 299.3301
C 290.248 299.4258 288.9414 297.7627 287.1025 298.0518
C 286.0518 298.2207 285.167 299.1465 283.3311 299.2148
C 280.7178 299.3096 277.5244 297.7627 271.5264 297.9561
C 265.6255 298.1475 260.1753 305.4121 259.4312 306.5674
C 258.5605 307.9219 257.4961 307.9219 256.335 306.8574
C 255.1738 305.7939 253.7432 306.6299 253.3359 307.3438
C 252.5615 308.6963 250.4927 312.6553 247.2881 313.4854
C 242.8564 314.6338 240.6118 311.0313 240.9033 308.1641
C 241.1987 305.2539 243.0801 304.4395 243.9512 302.8926
C 244.8213 301.3438 245.2671 300.3457 246.9053 299.6621
C 248.0674 299.1768 248.5 298.4609 248.1533 297.5068
C 247.8506 296.6768 246.6416 296.4873 245.8477 296.4492
C 244.1592 296.3672 242.9756 296.8262 242.1123 297.376
C 241.1084 298.0176 240.292 298.9043 239.416 300.416
C 238.4023 302.0801 236.8052 302.8086 234.9453 302.8086
C 234.0586 302.8086 233.2295 302.5723 232.4922 302.1934
C 229.5771 300.6748 226.1064 299.7773 222.3706 299.7773
L 218.1572 299.7744
C 226.2363 275.8105 248.8965 258.5527 275.5859 258.5527
C 296.9063 258.5527 315.6538 269.5635 326.4531 286.209
" />
<!-- nose shadow -->
<path fill="black" d="
M 288.9307 291.7637
C 289.2422 291.46 289.7793 290.4375 289.1226 289.1396
C 288.7544 288.4521 288.3579 287.9678 287.6489 287.4023
C 286.7969 286.7188 285.1309 285.9307 282.8457 287.3799
C 281.6172 288.1592 281.543 288.4209 279.8467 288.2012
C 278.6348 288.043 278.1533 289.2656 278.5884 290.2832
C 279.0244 291.2969 280.8145 292.1191 283.04 290.8135
C 284.041 290.2256 285.6025 288.9844 286.9688 290.084
C 287.5356 290.5381 287.875 290.8408 288.6611 291.75
C 288.6963 291.7881 288.7461 291.8105 288.8018 291.8105
C 288.8516 291.8105 288.8965 291.793 288.9307 291.7637
" />
<!-- The Shadowman's red hat -->
<path fill="#cc0000" d="
M 309.7769 335.2627
C 309.1787 333.251 308.3271 330.6763 304.5391 328.7314
C 303.9878 328.4497 303.7764 328.9126 304.0313 329.3477
C 305.4629 331.7832 305.7168 332.3921 306.1328 333.3525
C 306.7148 334.7568 307.02 336.7549 305.8618 340.9219
C 303.5835 349.1221 298.8296 360.083 295.375 363.6392
C 292.04 367.0698 285.998 368.0361 280.5371 366.6348
C 278.5264 366.1191 274.5918 364.0732 267.2939 365.7168
C 254.665 368.5605 252.7939 362.2368 252.0693 359.4824
C 251.3438 356.7271 249.6045 348.897 249.6045 348.897
C 249.0244 345.7085 248.2646 340.1631 267.874 336.4287
C 277.0088 334.6885 277.4736 332.3276 277.8779 330.6289
C 278.603 327.585 279.7627 325.8438 281.0674 324.9746
C 282.373 324.1035 281.0674 323.3828 279.6187 323.2349
C 275.7285 322.8311 261.3491 326.9541 252.8428 331.7881
C 245.8828 336.0415 245.7656 339.8721 247.3584 343.1211
C 236.8452 344.2573 228.9561 342.1348 227.5254 337.1582
C 225.0693 328.6157 246.3047 314.0264 270.4839 306.7061
C 295.8579 299.0225 321.9556 304.3857 324.8564 320.335
C 326.1738 327.5811 320.0713 332.9419 309.7769 335.2627
" />
<!-- shadow on hat -->
<path fill="black" d="
M 270.8711 350.8813
C 263.8721 350.375 263.145 349.6191 261.834 348.2227
C 259.9854 346.2539 257.5508 350.7773 257.5508 350.7773
C 256.0898 351.085 254.3179 353.4404 255.2744 355.6411
C 256.2158 357.8174 257.9551 357.1641 258.5 356.4868
C 259.1626 355.6621 260.5771 354.3125 262.4141 354.3613
C 264.251 354.4097 266.3706 354.7959 269.3262 354.7959
C 272.3213 354.7959 274.335 353.6777 274.4487 352.7168
C 274.5459 351.8965 274.2061 351.1226 270.8711 350.8813
" />
<!-- another shadow on hat -->
<path fill="black" d="
M 278.2236 362.4463
C 278.2129 362.4453 278.2021 362.4438 278.1919 362.4438
C 278.084 362.4438 277.9961 362.5273 277.9961 362.6274
C 277.9961 362.7007 278.041 362.7646 278.106 362.7939
C 279.4629 363.5107 281.4873 364.0811 283.8042 364.3169
C 284.499 364.3887 285.1787 364.4248 285.832 364.4307
C 285.9478 364.4307 286.0615 364.4297 286.1787 364.4277
C 290.062 364.3398 293.1719 362.7974 293.1255 360.9814
C 293.0791 359.165 289.8955 357.7637 286.0112 357.8506
C 284.7529 357.8794 283.5732 358.0615 282.5576 358.3545
C 282.4385 358.3857 282.3506 358.4883 282.3506 358.6094
C 282.3506 358.731 282.4385 358.834 282.5605 358.8638
C 284.9839 359.4248 286.6191 360.3408 286.5039 361.207
C 286.3511 362.3545 283.1816 362.979 279.4248 362.6011
C 279.0137 362.5596 278.6118 362.5068 278.2236 362.4463
" />
<!-- ® for The Shadowman -->
<path fill="black" d="
M 588.3018 288.9707
L 588.8369 288.9707
L 589.6426 287.6445
L 590.1626 287.6445
L 589.2905 288.9937
C 589.7422 289.0498 590.085 289.2881 590.085 289.834
C 590.085 290.4385 589.7275 290.7051 589.0034 290.7051
L 587.8384 290.7051
L 587.8384 287.6445
L 588.3018 287.6445
L 588.3018 288.9707
M 588.3018 289.3643
L 588.3018 290.3101
L 588.9336 290.3101
C 589.2549 290.3101 589.5996 290.2402 589.5996 289.8647
C 589.5996 289.3916 589.251 289.3643 588.8584 289.3643
L 588.3018 289.3643
" />
<path fill="black" d="
M 591.8457 289.1719
C 591.8457 287.5176 590.5059 286.1763 588.8511 286.1763
C 587.1968 286.1763 585.8545 287.5176 585.8545 289.1719
C 585.8545 290.8271 587.1968 292.1675 588.8511 292.1675
C 590.5059 292.1675 591.8457 290.8271 591.8457 289.1719
M 588.8511 291.6367
C 587.4883 291.6367 586.3853 290.5332 586.3853 289.1719
C 586.3853 287.8096 587.4883 286.7061 588.8511 286.7061
C 590.21 286.7061 591.3135 287.8096 591.3135 289.1719
C 591.3135 290.5332 590.21 291.6367 588.8511 291.6367
" />
</g>
</g>
</defs>
<g fill="black">
<g font-family="Frutiger">
<rect x="0" y="0" width="341" height="768" fill="#162284"/>
<use xlink:href="#cairo_logo_with_text" fill="white" transform="translate(170, 420)" />
<use xlink:href="#redhat_logo_horizontal"
transform="translate(826,768),scale(.5,.5),translate(0,-125)"/>
<g id="slide_title" transform="translate(683, 80)">
<text text-anchor="middle"
fill="black"
font-weight="bold"
x="0"
y="10" font-size="50"
ss:variable="presentation">Presentation Title</text>
</g>
<g ss:region="default" text-anchor="middle">
<rect x="683" y="270" width="2" height="350" fill="none" stroke="blue"/>
<text font-size="40" fill="black"
x="683" y="310">Slide content</text>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

@@ -0,0 +1,898 @@
<?xml version="1.0" ?>
<svg width="1024" height="768"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ss="http://www.svgslides.org/svgslides0.1"
fill="black">
<defs id="cairo-artwork_defs">
<g id="hacker_emblem">
<!-- Note: This is similar though not identical to Keith Packard's SVG version
of the hacker emblem (http://www.catb.org/hacker-emblem/glider.svg) -->
<g id="hacker_emblem_grid" fill="white" stroke="none">
<!-- Outside: Top, Right, Bottom, Left -->
<rect x="-2.95" y="-3.05" width="6" height="0.1" />
<rect x="2.95" y="-2.95" width="0.1" height="6" />
<rect x="-3.05" y="2.95" width="6" height="0.1" />
<rect x="-3.05" y="-3.05" width="0.1" height="6" />
<!-- Vertical: Left, Right -->
<rect x="-1.05" y="-2.95" width="0.1" height="5.9" />
<rect x="0.95" y="-2.95" width="0.1" height="5.9" />
<!-- Horizontal: TopLeft, TopMiddle, TopRight -->
<rect x="-2.95" y="-1.05" width="1.9" height="0.1" />
<rect x="-0.95" y="-1.05" width="1.9" height="0.1" />
<rect x="1.05" y="-1.05" width="1.9" height="0.1" />
<!-- Horizontal: BottomLeft, BottomMiddle, BottomRight -->
<rect x="-2.95" y="0.95" width="1.9" height="0.1" />
<rect x="-0.95" y="0.95" width="1.9" height="0.1" />
<rect x="1.05" y="0.95" width="1.9" height="0.1" />
</g>
<g id="hacker_emblem_dots" fill="white">
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
<g id="scarab" fill="#f19a14" stroke="none">
<g transform="translate(-150, -170)">
<path id="scarab_head" d="M205.599,94.567c0-11.668-24.914-21.129-55.628-21.129
c-30.723,0-55.624,9.46-55.624,21.129c0,10.203,24.901,7.346,55.624,7.346C180.685,101.913,205.599,104.233,205.599,94.567z"/>
<path id="scarab_torso" d="M136.423,161.506c0,0,12.751,12.577,13.547,13.362
c2.262-2.232,13.545-13.362,13.545-13.362c7.135-7.036,87.111-6.399,91.066-6.363c-0.469-6.298-1.254-12.472-2.325-18.519
c-15.183-19.279-42.811-32.225-74.485-32.225h-55.518c-31.745,0-59.439,13.011-74.598,32.37c-1.054,6-1.829,12.128-2.296,18.374
C49.321,155.106,129.288,154.47,136.423,161.506z"/>
<path id="scarab_spine" d="M149.97,301.187c2.005-24.729,8.386-103.483,8.405-103.721
c-0.09-0.219-6.478-15.578-8.405-20.214c-1.936,4.655-8.316,19.995-8.408,20.214C141.582,197.704,147.965,276.458,149.97,301.187z"/>
<path id="scarab_wing_left" d="M140.403,197.149l8.862-21.31l-13.686-13.499
c-5.65-5.573-67.074-6.235-90.259-6.019l-0.006-0.622c-0.154,2.144-0.271,4.302-0.35,6.475
c-0.076,2.207,10.392,4.706,10.392,6.717c0,2.319-10.457,5.084-10.359,7.631c2.993,73.349,48.53,131.631,104.372,132.048
l-9.02-111.29L140.403,197.149z"/>
<path id="scarab_wing_right" d="M244.585,168.891c0-2.011,10.467-4.506,10.391-6.715
c-0.079-2.174-0.195-4.332-0.351-6.479l-0.004,0.624c-23.186-0.216-84.608,0.445-90.26,6.017l-13.688,13.502l8.915,21.438
l-9.017,111.29c55.854-0.417,101.378-58.698,104.373-132.049C255.04,173.976,244.585,171.209,244.585,168.891z"/>
<path id="scarab_leg_front_left" d="M44.506,141.12c-4.135-0.856-4.895-1.54-7.935-2.92
c-9.59-3.364-10.376-5.481-16.08-11.86c-7.426-8.306-12.661-20.142-17.1-29.463c-3.576-7.525-3.984-16.409-2.86-24.273
c0.991-6.935,7.144-12.869,12.074-18.92c5.844-7.191,10.356-14.822,17.924-21.354c7.736-6.682,23.203-9.809,26.168-19.648
C57.86,8.819,54.334,1.766,61.482,0c-0.366,4.703,3.639,8.477,2.397,13.575c-1.129,4.627-4.368,5.811-9.611,9.099
c-7.564,4.746-18.366,8.779-24.748,13.965c-7.175,5.827-4.369,13.771-10.569,20.057c-2.001,2.03-7.901,4.706-9.137,6.83
c-1.861,3.199-0.297,9.572-0.116,13.12c0.425,8.284,5.588,14.244,9.555,22.045c4.152,8.141,6.429,15.409,13.411,22.519
c4.183,4.262,11.429,4.802,16.21,10.647l-3.555,4.186L44.506,141.12z"/>
<path id="scarab_leg_middle_left" d="M43.94,191.922l-0.809-7.346
c-9.506-4.579-10.339-9.772-20.738-12.466c-23.728-6.151-21.361,11.25-15.532,26.373c5.676,14.726,8.237,30.23,14.345,44.795
c2.805,6.688,6.919,13.213,14.298,15.127c0.372-8.435-0.917-10.651-6.113-16.919c-4.395-5.293-3.326-12.548-6.072-18.504
c-3.581-7.804-4.196-15.646-7.279-23.502c-1.363-3.479-8.33-13.966-6.452-17.861c3.183-6.603,9.178-0.083,12.179,2.077
c4.218,3.036,6.467,2.223,11.681,2.898C34.041,186.673,37.005,188.756,43.94,191.922z"/>
<path id="scarab_leg_back_left" d="M65.839,257.063l-2.771-4.837
c-6.68,8.928-6.993,16.228-10.056,23.347c-5.277,12.263-0.157,28.851,9.854,37.676c6.052,5.375,15.907,9.618,23.122,13.136
c10.035,4.892,20.113,11.286,31.336,13.396c2.482,0.466,8.798,1.295,6.693-3.522c-0.975-2.237-8.091-4.591-10.146-5.734
c-8.312-4.623-16.377-10.524-24.142-16.176c-9.498-6.862-20.843-11.186-28.311-20.684c-3.054-3.885-3.544-4.922-2.816-9.39
c0.693-4.263,1.344-9.174,2.241-13.439C61.855,266.029,63.274,261.378,65.839,257.063z"/>
<path id="scarab_leg_front_right" d="M255.487,141.12c4.134-0.856,4.896-1.54,7.936-2.92
c9.583-3.364,10.369-5.481,16.071-11.86c7.428-8.306,12.661-20.142,17.115-29.463c3.574-7.525,3.983-16.409,2.86-24.273
c-0.992-6.935-7.157-12.869-12.087-18.92c-5.843-7.191-10.356-14.822-17.919-21.354c-7.735-6.682-23.202-9.809-26.167-19.648
C242.135,8.819,245.66,1.766,238.511,0c0.366,4.703-3.637,8.477-2.396,13.575c1.131,4.627,4.368,5.811,9.611,9.099
c7.563,4.746,18.367,8.779,24.747,13.965c7.17,5.827,4.362,13.771,10.563,20.057c2.001,2.03,7.901,4.706,9.139,6.83
c1.859,3.199,0.295,9.572,0.113,13.12c-0.424,8.284-5.588,14.244-9.553,22.045c-4.152,8.141-6.431,15.409-13.404,22.519
c-4.184,4.262-11.429,4.802-16.211,10.647l3.556,4.186L255.487,141.12z"/>
<path id="scarab_leg_middle_right" d="M256.053,191.922l0.81-7.346
c9.507-4.579,10.34-9.772,20.73-12.466c23.741-6.151,21.374,11.25,15.534,26.373c-5.676,14.726-8.238,30.23-14.347,44.795
c-2.804,6.688-6.911,13.213-14.291,15.127c-0.371-8.435,0.918-10.651,6.113-16.919c4.39-5.293,3.319-12.548,6.066-18.504
c3.58-7.804,4.197-15.646,7.278-23.502c1.363-3.479,8.33-13.966,6.453-17.861c-3.184-6.603-9.179-0.083-12.181,2.077
c-4.217,3.036-6.458,2.223-11.672,2.898C265.951,186.673,262.986,188.756,256.053,191.922z"/>
<path id="scarab_leg_back_right" d="M234.155,257.063l2.771-4.837
c6.679,8.928,6.991,16.228,10.057,23.347c5.274,12.263,0.154,28.851-9.854,37.676c-6.055,5.375-15.903,9.618-23.117,13.136
c-10.034,4.892-20.127,11.286-31.351,13.396c-2.481,0.466-8.789,1.295-6.691-3.522c0.976-2.237,8.092-4.591,10.146-5.734
c8.312-4.623,16.392-10.524,24.155-16.176c9.498-6.862,20.838-11.186,28.305-20.684c3.055-3.885,3.543-4.922,2.818-9.39
c-0.696-4.263-1.346-9.174-2.244-13.439C238.137,266.029,236.718,261.378,234.155,257.063z"/>
</g>
</g>
<radialGradient id="gradient_radial_dung"
cx="0" cy="0" r="60"
fx="0" fy="0" gradientUnits="userSpaceOnUse"
>
<stop offset="0" stop-color="#9a9a9a" />
<stop offset="0.70" stop-color="#bababa" />
<stop offset="0.95" stop-color="#FFFFFF" />
</radialGradient>
<g id="dung">
<circle cx="0" cy="0" r="60" fill="url(#gradient_radial_dung)" />
<g transform="translate(-61, -61)">
<!-- rough equivalent: <circle cx="0" cy="0" r="60" stroke="#8a8a8a" stroke-width="2" /> -->
<path fill="#8a8a8a" d="M0,61c0,33.636,27.364,61,61,61s61-27.364,61-61S94.636,0,61,0S0,27.364,0,61z
M2,61C2,28.467,28.467,2,61,2c32.532,0,59,26.467,59,59c0,32.533-26.468,59-59,59C28.467,120,2,93.533,2,61z"/>
</g>
<use xlink:href="#hacker_emblem" x="0" y="0" transform="scale(9)" />
</g>
<g id="dung_2_color">
<path stroke="none" d="
M -46, 0
A 46, 46,
0,
0, 1,
46, 0
A 46, 46,
0,
0, 1,
-46, 0
M -50, 0
A 50, 50,
0,
0, 0,
50, 0
A 50, 50,
0,
0, 0,
-50, 0
Z" />
<g transform="scale(9)">
<!-- Hacker emblem grid -->
<path fill="none" stroke-width="0.2"
d="M -3,-3 L 3,-3 L 3,3 L-3,3 Z
M -1,-3 L -1, 3
M 1,-3 L 1, 3
M -3,-1 L 3,-1
M -3, 1 L 3, 1"/>
<g stroke="none">
<!-- Hacker emblem dots -->
<circle cx="0" cy="-2" r="0.7" />
<circle cx="2" cy="0" r="0.7" />
<circle cx="-2" cy="2" r="0.7" />
<circle cx="0" cy="2" r="0.7" />
<circle cx="2" cy="2" r="0.7" />
</g>
</g>
</g>
<!-- scarab dimensions: 300x340 -->
<!-- dung dimensions: 120x120 (radius: 60) -->
<!-- scarab and dung dimensions: 300x400 -->
<g id="cairo_logo">
<!-- dimensions: 300x400, centered -->
<!-- The logo (scarab and dung), with the center-point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 30)" />
</g>
<g id="cairo_logo_dung-centered">
<!-- The logo (scarab and dung), with the dung at (0,0), the scarab below -->
<use xlink:href="#dung_2_color" x="0" y="0" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0,170)" />
</g>
<g id="cairo_logo_scarab-centered">
<!-- The logo (scarab and dung), with the scarab's rotational center at (0,0), the dung above -->
<!-- The scarab's rotational center in this case is not the center of its bounding box,
but is calculated to be the intersection-point of the torso, spine and wings -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -175.85)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -5.85)" />
</g>
<g id="cairo_logo_top-centered">
<!-- The logo (scarab and dung), with the top-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, 230)" /><!-- (0,170+60) -->
</g>
<g id="cairo_logo_bottom-centered">
<!-- The logo (scarab and dung), with the bottom-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(0, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(0, -170)" />
</g>
<g id="cairo_logo_right-centered">
<!-- The logo (scarab and dung), with the right-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 30)" />
</g>
<g id="cairo_logo_left-centered">
<!-- The logo (scarab and dung), with the left-center point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -140)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 30)" />
</g>
<g id="cairo_logo_topleft-centered">
<!-- The logo (scarab and dung), with the top-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, 230)" /><!-- (150, 170+60) -->
</g>
<g id="cairo_logo_topright-centered">
<!-- The logo (scarab and dung), with the top-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, 60)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, 230)" /><!-- (-150,170+60) -->
</g>
<g id="cairo_logo_bottomleft-centered">
<!-- The logo (scarab and dung), with the bottom-left point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(150, -170)" />
</g>
<g id="cairo_logo_bottomright-centered">
<!-- The logo (scarab and dung), with the bottom-right point of the bounding box at (0,0) -->
<use xlink:href="#dung_2_color" x="0" y="0" transform="translate(-150, -340)" />
<use xlink:href="#scarab" x="0" y="0" transform="translate(-150, -170)" />
</g>
<g id="cairo_text" transform="translate(0,-97)">
<g transform="scale(0.1484,0.1484)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(65,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(486.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1234.25,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1610,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small_spaced" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(379.5,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(1000,0)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(1341.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1826,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<!-- scaled by 0.72, shifted around to hit pixel boundaries -->
<g id="cairo_text_small" transform="translate(0,-71)">
<g transform="scale(0.085,0.085)"> <g transform="translate(-1139,-208.5)">
<!-- 63 (c), advance 444, 0 horiBearing 38,522 -->
<path transform="translate(-151,0)" d="
M 412, 433
C 385, 422 336, 413 298, 413
C 142, 413 38, 525 38, 680
C 38, 826 144, 947 298, 947
C 332, 947 377, 944 416, 926
L 409, 842
C 380, 861 340, 871 308, 871
C 187, 871 138, 771 138, 680
C 138, 583 197, 489 302, 489
C 332, 489 368, 496 404, 511
L 412, 433 " />
<!-- 61 (a), advance 556, 0 horiBearing 46,522 -->
<path transform="translate(261.75,0)" d="
M 109, 541
C 147, 509 204, 489 257, 489
C 351, 489 383, 534 383, 622
C 346, 620 320, 620 283, 620
C 186, 620 46, 660 46, 788
C 46, 899 123, 947 233, 947
C 319, 947 369, 900 391, 869
L 393, 869
L 393, 935
L 481, 935
C 479, 920 477, 893 477, 835
L 477, 624
C 477, 485 418, 413 272, 413
C 207, 413 151, 433 104, 461
L 109, 541
M 383, 737
C 383, 813 334, 871 241, 871
C 198, 871 146, 842 146, 788
C 146, 698 272, 690 323, 690
C 343, 690 363, 692 383, 692
L 383, 737 " />
<!-- 69 (i), advance 278, 0 horiBearing 86,730 -->
<path transform="translate(764.75)" d="
M 92, 935
L 186, 935
L 186, 425
L 92, 425
L 92, 935
M 88, 261
A 51, 51 0 1 1 190,261
A 51, 51 0 1 1 88,261" />
<!-- 72 (r), advance 389, 0 horiBearing 80,522 -->
<path transform="translate(988.5,0)" d="
M 80, 935
L 174, 935
L 174, 703
C 174, 575 229, 495 313, 495
C 329, 495 348, 497 365, 504
L 365, 420
C 345, 416 331, 413 303, 413
C 249, 413 195, 451 170, 504
L 168, 504
L 168, 425
L 80, 425
L 80, 935 " />
<!-- 6f (o), advance 611, 0 horiBearing 46,522 -->
<path transform="translate(1355.5,0)" d="
M 46, 680
C 46, 826 152, 947 306, 947
C 459, 947 565, 826 565, 680
C 565, 525 461, 413 306, 413
C 150, 413 46, 525 46, 680
M 146, 680
C 146, 583 205, 489 306, 489
C 406, 489 465, 583 465, 680
C 465, 771 416, 871 306, 871
C 195, 871 146, 771 146, 680 " />
<!-- bounds: 38, 205 <-> 2232, 947 -->
</g> </g>
</g>
<g id="cairo_logo_text_small">
<!-- The logo on the left, the text 'cairo' on the right -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(0, 78), scale(0.1944)" />
<use xlink:href="#cairo_text_small" fill="white" transform="translate(175,82)"/>
</g>
<g id="cairo_logo_with_text">
<!-- The logo (scarab and dung), with the text 'cairo' below, the dot of the 'i' positioned between the hind legs of the scarab -->
<!-- dimensions: 300x490, centered -->
<use xlink:href="#cairo_logo_top-centered" transform="translate(0, -245)" />
<use xlink:href="#cairo_text" transform="translate(0, 245)" />
</g>
<g id="cairo_banner">
<!-- The logo on the left, the text 'cairo' in the center, and a mirror image of the logo on the right -->
<!-- The logos are scaled such that the scarab body nearly matches the height of the text characters (excepting the 'i')
and the dung should nearly aligns with the dot of the 'i'. The bottoms of the logos are aligned with the bottom of the text. -->
<!-- dimensions: 370x88, centered -->
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(-180, 40), scale(0.1944)" />
<use xlink:href="#cairo_text_small" transform="translate(0, 42)" fill="black" />
<use xlink:href="#cairo_logo_bottomleft-centered" transform="translate(180, 40), scale(0.1944), scale(-1, 1)" />
</g>
<g id="freedesktop_org_logo" style="fill:#FFFFFF;stroke:#3B80AE;stroke-width:2.4588;">
<g>
<path style="stroke:#BABABA;" d="M85.277,40.796c2.058,7.884-2.667,15.942-10.551,17.999L27.143,71.21c-7.884,2.057-15.943-2.667-18-10.552
l-7.448-28.55c-2.057-7.884,2.667-15.942,10.551-17.999L59.83,1.695c7.884-2.057,15.942,2.667,17.999,10.551
l7.449,28.55z"/>>
<path style="fill:#3B80AE;stroke:none;" d="M80.444,39.778c1.749,7.854-1.816,13.621-9.504,15.447l-42.236,11.02c-7.569,2.396-14.089-1.181
-15.838-8.836L6.53,33.127c-1.749-8.145,0.709-12.889,9.503-15.447L58.27,6.661
c8.144-1.826,14.089,1.363,15.838,8.835l6.336,24.282z"/>>
</g>g>
<path style="opacity:0.5;fill:none;stroke:#FFFFFF;" d="M45.542,51.793L24.104,31.102l38.1-4.393L45.542,51.793z"/>>
<path d="M72.325,28.769c0.405,1.55-0.525,3.136-2.075,3.541l-12.331,3.217c-1.551,0.404-3.137-0.525-3.542-2.076l-2.295-8.801
c-0.405-1.551,0.524-3.137,2.076-3.542l12.33-3.217c1.551-0.405,3.137,0.525,3.542,2.076l2.295,8.801z"/>>
<path d="M36.51,33.625c0.496,1.9-0.645,3.844-2.545,4.34l-15.112,3.943c-1.901,0.496-3.845-0.644-4.34-2.544l-2.814-10.786
c-0.496-1.901,0.644-3.844,2.544-4.34l15.113-3.942c1.901-0.496,3.845,0.643,4.34,2.544l2.814,10.786z"/>>
<path d="M52.493,53.208c0.278,1.065-0.36,2.154-1.425,2.432L42.6,57.848c-1.064,0.277-2.153-0.36-2.431-1.426l-1.577-6.043
c-0.277-1.064,0.36-2.153,1.425-2.432l8.468-2.209c1.064-0.277,2.154,0.361,2.431,1.426l1.577,6.043z"/>>
</g>g>
<g id="bullet">
<use x="0" y="0" xlink:href="#cairo_logo" transform="translate(-6,-2) scale(0.1, 0.1)"/>>
</g>
<g id="redhat_logo_horizontal">
<!-- 380x125 Red Hat log (horizontal layout) -->
<g fill="black" stroke="none"
transform="translate(0,124),scale(1,-1),translate(-214,-258)"
fill-rule="evenodd"
>
<!-- r -->
<path fill="black" d="
M 367.0625 315.3203
C 367.0625 320.8765 366.9463 324.9644 366.7227 328.6597
L 375.811 328.6597
L 376.2002 320.7764
L 376.4971 320.7764
C 378.5391 326.6221 383.3809 329.5996 387.8594 329.5996
C 388.8843 329.5996 389.4824 329.5601 390.3218 329.373
L 390.3218 319.4863
C 389.3398 319.6763 388.4224 319.7842 387.1592 319.7842
C 382.1597 319.7842 378.688 316.6006 377.751 311.8447
C 377.5732 310.918 377.4805 309.8086 377.4805 308.6777
L 377.4805 287.1504
L 366.9766 287.1504
L 367.0625 315.3203
" />
<!-- e -->
<path fill="black" d="
M 402.9927 305.0791
C 403.2715 297.5586 409.0918 294.2695 415.814 294.2695
C 420.6406 294.2695 424.0942 295.0234 427.2681 296.1924
L 428.8232 288.9678
C 425.269 287.4629 420.3413 286.3359 414.3149 286.3359
C 400.8384 286.3359 392.9409 294.6592 392.9409 307.3809
C 392.9409 318.8369 399.8911 329.6772 413.2437 329.6772
C 426.7397 329.6772 431.1338 318.5771 431.1338 309.4893
C 431.1338 307.5381 430.9624 305.9707 430.7593 305.0059
L 402.9927 305.0791
M 421.2485 312.3926
C 421.2954 316.2388 419.6206 322.5088 412.5903 322.5088
C 406.1299 322.5088 403.4438 316.645 402.9722 312.3926
L 421.2485 312.3926
" />
<!-- d -->
<path fill="black" d="
M 476.355 344.667
L 465.8638 347.5083
L 465.8638 324.1914
L 465.6904 324.1914
C 463.8335 327.2563 459.7407 329.5996 454.0571 329.5996
C 444.0762 329.5996 435.3828 321.3374 435.4478 307.4307
C 435.4478 294.6719 443.2983 286.2168 453.2119 286.2168
C 459.2017 286.2168 464.2114 289.0723 466.6909 293.7217
L 466.8779 293.7217
L 467.3491 287.1504
L 476.6997 287.1504
C 476.5083 289.9717 476.355 294.543 476.355 298.792
L 476.355 344.667
M 465.8638 305.1504
C 465.8638 304.0479 465.7856 303.0234 465.5454 302.0869
C 464.4873 297.5439 460.7734 294.6172 456.4819 294.6172
C 449.8721 294.6172 446.0903 300.1885 446.0903 307.8164
C 446.0903 315.5166 449.8384 321.4761 456.6016 321.4761
C 461.3208 321.4761 464.6992 318.1484 465.6274 314.1064
C 465.8071 313.2559 465.8638 312.208 465.8638 311.3711
L 465.8638 305.1504
" />
<!-- h -->
<path fill="black" d="
M 503.7964 329.0176
C 500.6836 329.0176 497.8926 328.1187 495.5493 326.6714
C 493.1162 325.2461 491.1353 323.0464 489.959 320.7666
L 489.7915 320.7666
L 489.7915 341.0195
L 485.7427 342.1226
L 485.7427 287.1504
L 489.7915 287.1504
L 489.7915 312.1787
C 489.7915 313.8408 489.9204 314.9946 490.3462 316.2109
C 492.0928 321.3013 496.8896 325.4805 502.689 325.4805
C 511.0664 325.4805 513.9673 318.7603 513.9673 311.3906
L 513.9673 287.1504
L 518.0137 287.1504
L 518.0137 311.8359
C 518.0137 327.0791 507.6753 329.0176 503.7964 329.0176
" />
<!-- a -->
<path fill="black" d="
M 554.3413 296.873
C 554.3413 293.6357 554.4692 290.2832 554.9375 287.1504
L 551.2085 287.1504
L 550.6128 293.0156
L 550.4209 293.0156
C 548.438 289.8594 543.8765 286.2168 537.3726 286.2168
C 529.1392 286.2168 525.3057 292.0117 525.3057 297.4688
C 525.3057 306.9121 533.6421 312.6064 550.292 312.4321
L 550.292 313.5234
C 550.292 317.5718 549.5044 325.6475 539.8242 325.5859
C 536.2446 325.5859 532.5132 324.6255 529.5513 322.5366
L 528.2632 325.4805
C 532.0015 328.0137 536.5659 329.0176 540.2705 329.0176
C 552.0801 329.0176 554.3413 320.1509 554.3413 312.8379
L 554.3413 296.873
M 550.292 309.0234
C 541.3813 309.2813 529.6128 307.9336 529.6128 298.1055
C 529.6128 292.2246 533.4946 289.5811 537.7578 289.5811
C 544.5796 289.5811 548.4561 293.8018 549.8677 297.7871
C 550.1646 298.6621 550.292 299.5371 550.292 300.2402
L 550.292 309.0234
" />
<!-- t -->
<path fill="black" d="
M 570.459 337.0996
L 570.459 328.0801
L 582.1235 328.0801
L 582.1235 324.7959
L 570.459 324.7959
L 570.459 298.1943
C 570.459 292.9912 572.0757 289.7285 576.4692 289.7285
C 578.5815 289.7285 580.0757 290.0078 581.1206 290.3711
L 581.6099 287.2354
C 580.2871 286.6836 578.4302 286.2539 575.9619 286.2539
C 572.9741 286.2539 570.4995 287.1934 568.8994 289.1543
C 567.0469 291.3057 566.4116 294.7412 566.4116 298.916
L 566.4116 324.7959
L 559.5059 324.7959
L 559.5059 328.0801
L 566.4116 328.0801
L 566.4116 335.606
L 570.459 337.0996
" />
<!-- ® for 'redhat' -->
<path fill="black" d="
M 335.5 288.9707
L 336.0352 288.9707
L 336.8408 287.6445
L 337.3608 287.6445
L 336.4888 288.9937
C 336.9404 289.0498 337.2832 289.2881 337.2832 289.834
C 337.2832 290.4385 336.9258 290.7051 336.2017 290.7051
L 335.0366 290.7051
L 335.0366 287.6445
L 335.5 287.6445
L 335.5 288.9707
M 335.5 289.3643
L 335.5 290.3101
L 336.1318 290.3101
C 336.4531 290.3101 336.7979 290.2402 336.7979 289.8647
C 336.7979 289.3916 336.4492 289.3643 336.0566 289.3643
L 335.5 289.3643
" />
<path fill="black" d="
M 339.0439 289.1719
C 339.0439 287.5176 337.7041 286.1763 336.0493 286.1763
C 334.395 286.1763 333.0527 287.5176 333.0527 289.1719
C 333.0527 290.8271 334.395 292.1675 336.0493 292.1675
C 337.7041 292.1675 339.0439 290.8271 339.0439 289.1719
M 336.0493 291.6367
C 334.6865 291.6367 333.5835 290.5332 333.5835 289.1719
C 333.5835 287.8096 334.6865 286.7061 336.0493 286.7061
C 337.4082 286.7061 338.5117 287.8096 338.5117 289.1719
C 338.5117 290.5332 337.4082 291.6367 336.0493 291.6367
" />
<!-- Black background behind The Shadowman -->
<path fill="black" d="
M 326.4531 286.208
C 324.1177 286.7451 321.6396 287.0801 319.1338 287.0801
C 314.8496 287.0801 310.9502 286.3389 308.0732 285.1426
C 307.7559 284.9844 307.5303 284.6533 307.5303 284.2764
C 307.5303 284.1406 307.5654 283.999 307.6172 283.8838
C 307.957 282.8975 307.3984 281.8281 304.6157 281.2158
C 300.4883 280.3096 297.8833 276.0527 296.3916 274.6367
C 294.6411 272.9756 289.6973 271.9531 290.4404 272.9434
C 291.0225 273.7188 293.2485 276.1348 294.6016 278.748
C 295.8125 281.083 296.8906 281.7461 298.375 283.9736
C 298.811 284.627 300.4995 286.9219 300.9912 288.7373
C 301.543 290.5107 301.356 292.7344 301.5679 293.6494
C 301.8721 294.9697 303.1182 297.8369 303.2129 299.4531
C 303.2666 300.3691 299.3916 298.1494 297.5532 298.1494
C 295.7144 298.1494 293.9233 299.248 292.2808 299.3281
C 290.248 299.4248 288.9414 297.7607 287.1025 298.0508
C 286.0518 298.2178 285.167 299.1426 283.3311 299.2129
C 280.7178 299.3086 277.5244 297.7607 271.5264 297.9531
C 265.6255 298.1436 260.1753 305.4082 259.4312 306.5635
C 258.5605 307.9199 257.4961 307.9199 256.335 306.8555
C 255.1738 305.792 253.7432 306.627 253.3359 307.3389
C 252.5615 308.6943 250.4927 312.6543 247.2881 313.4824
C 242.8564 314.6309 240.6118 311.0283 240.9033 308.1621
C 241.1987 305.252 243.0801 304.4375 243.9512 302.8906
C 244.8213 301.3428 245.2671 300.3428 246.9053 299.6572
C 248.0674 299.1758 248.5 298.458 248.1533 297.5049
C 247.8506 296.6738 246.6416 296.4834 245.8477 296.4463
C 244.1592 296.3662 242.9756 296.8242 242.1123 297.376
C 241.1084 298.0137 240.292 298.9033 239.416 300.4131
C 238.4023 302.0781 236.8052 302.8037 234.9453 302.8037
C 234.0586 302.8037 233.2295 302.5693 232.4922 302.1895
C 229.5771 300.6748 226.1064 299.7744 222.3706 299.7744
L 218.1572 299.7734
C 216.1064 305.8555 214.9951 312.3682 214.9951 319.1416
C 214.9951 352.6064 242.1226 379.7334 275.5859 379.7334
C 309.0498 379.7334 336.1758 352.6064 336.1758 319.1416
C 336.1758 307 332.6035 295.6895 326.4531 286.208
" />
<!-- The Shadowman's face -->
<path fill="white" d="
M 326.4531 286.209
C 324.1177 286.7461 321.6396 287.084 319.1338 287.084
C 314.8496 287.084 310.9502 286.3418 308.0732 285.1436
C 307.7559 284.9873 307.5303 284.6553 307.5303 284.2783
C 307.5303 284.1416 307.5654 284.001 307.6172 283.8838
C 307.957 282.8994 307.3984 281.8311 304.6157 281.2178
C 300.4883 280.3115 297.8833 276.0537 296.3916 274.6416
C 294.6411 272.9766 289.6973 271.9551 290.4404 272.9463
C 291.0225 273.7197 293.2485 276.1367 294.6016 278.749
C 295.8125 281.083 296.8906 281.75 298.375 283.9756
C 298.811 284.627 300.4995 286.9238 300.9912 288.7402
C 301.543 290.5117 301.356 292.7354 301.5679 293.6514
C 301.8721 294.9727 303.1182 297.8379 303.2129 299.457
C 303.2666 300.3721 299.3916 298.1504 297.5532 298.1504
C 295.7144 298.1504 293.9233 299.251 292.2808 299.3301
C 290.248 299.4258 288.9414 297.7627 287.1025 298.0518
C 286.0518 298.2207 285.167 299.1465 283.3311 299.2148
C 280.7178 299.3096 277.5244 297.7627 271.5264 297.9561
C 265.6255 298.1475 260.1753 305.4121 259.4312 306.5674
C 258.5605 307.9219 257.4961 307.9219 256.335 306.8574
C 255.1738 305.7939 253.7432 306.6299 253.3359 307.3438
C 252.5615 308.6963 250.4927 312.6553 247.2881 313.4854
C 242.8564 314.6338 240.6118 311.0313 240.9033 308.1641
C 241.1987 305.2539 243.0801 304.4395 243.9512 302.8926
C 244.8213 301.3438 245.2671 300.3457 246.9053 299.6621
C 248.0674 299.1768 248.5 298.4609 248.1533 297.5068
C 247.8506 296.6768 246.6416 296.4873 245.8477 296.4492
C 244.1592 296.3672 242.9756 296.8262 242.1123 297.376
C 241.1084 298.0176 240.292 298.9043 239.416 300.416
C 238.4023 302.0801 236.8052 302.8086 234.9453 302.8086
C 234.0586 302.8086 233.2295 302.5723 232.4922 302.1934
C 229.5771 300.6748 226.1064 299.7773 222.3706 299.7773
L 218.1572 299.7744
C 226.2363 275.8105 248.8965 258.5527 275.5859 258.5527
C 296.9063 258.5527 315.6538 269.5635 326.4531 286.209
" />
<!-- nose shadow -->
<path fill="black" d="
M 288.9307 291.7637
C 289.2422 291.46 289.7793 290.4375 289.1226 289.1396
C 288.7544 288.4521 288.3579 287.9678 287.6489 287.4023
C 286.7969 286.7188 285.1309 285.9307 282.8457 287.3799
C 281.6172 288.1592 281.543 288.4209 279.8467 288.2012
C 278.6348 288.043 278.1533 289.2656 278.5884 290.2832
C 279.0244 291.2969 280.8145 292.1191 283.04 290.8135
C 284.041 290.2256 285.6025 288.9844 286.9688 290.084
C 287.5356 290.5381 287.875 290.8408 288.6611 291.75
C 288.6963 291.7881 288.7461 291.8105 288.8018 291.8105
C 288.8516 291.8105 288.8965 291.793 288.9307 291.7637
" />
<!-- The Shadowman's red hat -->
<path fill="#cc0000" d="
M 309.7769 335.2627
C 309.1787 333.251 308.3271 330.6763 304.5391 328.7314
C 303.9878 328.4497 303.7764 328.9126 304.0313 329.3477
C 305.4629 331.7832 305.7168 332.3921 306.1328 333.3525
C 306.7148 334.7568 307.02 336.7549 305.8618 340.9219
C 303.5835 349.1221 298.8296 360.083 295.375 363.6392
C 292.04 367.0698 285.998 368.0361 280.5371 366.6348
C 278.5264 366.1191 274.5918 364.0732 267.2939 365.7168
C 254.665 368.5605 252.7939 362.2368 252.0693 359.4824
C 251.3438 356.7271 249.6045 348.897 249.6045 348.897
C 249.0244 345.7085 248.2646 340.1631 267.874 336.4287
C 277.0088 334.6885 277.4736 332.3276 277.8779 330.6289
C 278.603 327.585 279.7627 325.8438 281.0674 324.9746
C 282.373 324.1035 281.0674 323.3828 279.6187 323.2349
C 275.7285 322.8311 261.3491 326.9541 252.8428 331.7881
C 245.8828 336.0415 245.7656 339.8721 247.3584 343.1211
C 236.8452 344.2573 228.9561 342.1348 227.5254 337.1582
C 225.0693 328.6157 246.3047 314.0264 270.4839 306.7061
C 295.8579 299.0225 321.9556 304.3857 324.8564 320.335
C 326.1738 327.5811 320.0713 332.9419 309.7769 335.2627
" />
<!-- shadow on hat -->
<path fill="black" d="
M 270.8711 350.8813
C 263.8721 350.375 263.145 349.6191 261.834 348.2227
C 259.9854 346.2539 257.5508 350.7773 257.5508 350.7773
C 256.0898 351.085 254.3179 353.4404 255.2744 355.6411
C 256.2158 357.8174 257.9551 357.1641 258.5 356.4868
C 259.1626 355.6621 260.5771 354.3125 262.4141 354.3613
C 264.251 354.4097 266.3706 354.7959 269.3262 354.7959
C 272.3213 354.7959 274.335 353.6777 274.4487 352.7168
C 274.5459 351.8965 274.2061 351.1226 270.8711 350.8813
" />
<!-- another shadow on hat -->
<path fill="black" d="
M 278.2236 362.4463
C 278.2129 362.4453 278.2021 362.4438 278.1919 362.4438
C 278.084 362.4438 277.9961 362.5273 277.9961 362.6274
C 277.9961 362.7007 278.041 362.7646 278.106 362.7939
C 279.4629 363.5107 281.4873 364.0811 283.8042 364.3169
C 284.499 364.3887 285.1787 364.4248 285.832 364.4307
C 285.9478 364.4307 286.0615 364.4297 286.1787 364.4277
C 290.062 364.3398 293.1719 362.7974 293.1255 360.9814
C 293.0791 359.165 289.8955 357.7637 286.0112 357.8506
C 284.7529 357.8794 283.5732 358.0615 282.5576 358.3545
C 282.4385 358.3857 282.3506 358.4883 282.3506 358.6094
C 282.3506 358.731 282.4385 358.834 282.5605 358.8638
C 284.9839 359.4248 286.6191 360.3408 286.5039 361.207
C 286.3511 362.3545 283.1816 362.979 279.4248 362.6011
C 279.0137 362.5596 278.6118 362.5068 278.2236 362.4463
" />
<!-- ® for The Shadowman -->
<path fill="black" d="
M 588.3018 288.9707
L 588.8369 288.9707
L 589.6426 287.6445
L 590.1626 287.6445
L 589.2905 288.9937
C 589.7422 289.0498 590.085 289.2881 590.085 289.834
C 590.085 290.4385 589.7275 290.7051 589.0034 290.7051
L 587.8384 290.7051
L 587.8384 287.6445
L 588.3018 287.6445
L 588.3018 288.9707
M 588.3018 289.3643
L 588.3018 290.3101
L 588.9336 290.3101
C 589.2549 290.3101 589.5996 290.2402 589.5996 289.8647
C 589.5996 289.3916 589.251 289.3643 588.8584 289.3643
L 588.3018 289.3643
" />
<path fill="black" d="
M 591.8457 289.1719
C 591.8457 287.5176 590.5059 286.1763 588.8511 286.1763
C 587.1968 286.1763 585.8545 287.5176 585.8545 289.1719
C 585.8545 290.8271 587.1968 292.1675 588.8511 292.1675
C 590.5059 292.1675 591.8457 290.8271 591.8457 289.1719
M 588.8511 291.6367
C 587.4883 291.6367 586.3853 290.5332 586.3853 289.1719
C 586.3853 287.8096 587.4883 286.7061 588.8511 286.7061
C 590.21 286.7061 591.3135 287.8096 591.3135 289.1719
C 591.3135 290.5332 590.21 291.6367 588.8511 291.6367
" />
</g>
</g>
</defs>
<g id="watermark" transform="translate(200, 185), rotate(-50), scale(2.5)">
<use xlink:href="#scarab" x="0" y="170" fill-opacity="0.2"/>
</g>
<!-- Blue bar at top of slide -->
<rect x="0" y="0" width="1024" height="170" fill="#162284" />
<!-- Scarab and "cairo" at upper-left -->
<g transform="translate(10,0)">
<use stroke="none" fill="white" xlink:href="#cairo_logo_text_small"/>
</g>
<!-- Presentation title at upper-right -->
<text ss:variable="presentation-subtitle" text-anchor="end"
fill="white" x="1016" y="28" font-size="20">Presentation Sub-title</text>
<!-- Red Hat logo at lower-left -->
<use xlink:href="#redhat_logo_horizontal" transform="translate(8,768),scale(.5,.5),translate(0, -125)" />
<g font-family="Frutiger">
<!-- Slide title -->
<g id="slide_title" transform="translate(512, 133)">
<text text-anchor="middle"
fill="white"
font-weight="bold"
x="0"
y="4" font-size="55"
ss:variable="title">Really long slide title so you can see</text>
</g>
<!-- Slide content -->
<g ss:region="default">
<rect x="112" y="200" width="800" height="480" fill="none" stroke="blue"/>
<text font-size="40" fill="black"
x="112" y="232">Slide content</text>
</g>
<!-- Footer -->
<text ss:variable="URL" x="1016" y="753" text-anchor="end" font-size="20">https://cairographics.org</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Some files were not shown because too many files have changed in this diff Show More