cairo: vendor as full-fork recipe (path=source, patches baked)
@@ -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 = [
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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.]
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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, &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, &x, &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 |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 383 B |
|
After Width: | Height: | Size: 1.3 KiB |