From 70b8424bd152b29abc970adfc5985312f1b33395 Mon Sep 17 00:00:00 2001 From: Carlos Amengual Date: Mon, 23 Sep 2024 20:50:22 +0200 Subject: [PATCH] Add SVG benchmarks (EchoSVG vs Batik) --- NOTICE | 4 + README.md | 2 +- build.gradle | 19 +- pom.xml | 32 + resources/io/sf/carte/mark/svg/css/test.css | 32 + resources/io/sf/carte/mark/svg/issue91.svg | 11463 ++++++++++++++++ resources/io/sf/carte/mark/svg/pooh3.svg | 165 + .../io/sf/carte/mark/svg/useMultiple.svg | 105 + .../carte/mark/svg/FontDecorationPainter.java | 102 + src/io/sf/carte/mark/svg/Issue91Mark.java | 78 + src/io/sf/carte/mark/svg/Pooh3Mark.java | 78 + .../sf/carte/mark/svg/SVGGraphics2DMark.java | 156 + src/io/sf/carte/mark/svg/UseMultipleMark.java | 78 + src/io/sf/carte/mark/svg/package-info.java | 4 + 14 files changed, 12314 insertions(+), 4 deletions(-) create mode 100644 NOTICE create mode 100644 resources/io/sf/carte/mark/svg/css/test.css create mode 100644 resources/io/sf/carte/mark/svg/issue91.svg create mode 100644 resources/io/sf/carte/mark/svg/pooh3.svg create mode 100644 resources/io/sf/carte/mark/svg/useMultiple.svg create mode 100644 src/io/sf/carte/mark/svg/FontDecorationPainter.java create mode 100644 src/io/sf/carte/mark/svg/Issue91Mark.java create mode 100644 src/io/sf/carte/mark/svg/Pooh3Mark.java create mode 100644 src/io/sf/carte/mark/svg/SVGGraphics2DMark.java create mode 100644 src/io/sf/carte/mark/svg/UseMultipleMark.java create mode 100644 src/io/sf/carte/mark/svg/package-info.java diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..5aa428e --- /dev/null +++ b/NOTICE @@ -0,0 +1,4 @@ +This project contains SVG files from the EchoSVG project: + +Copyright 2020-2024 Contributors to the EchoSVG project +Copyright 1999-2020 The Apache Software Foundation diff --git a/README.md b/README.md index d0d4d8d..a12c9ae 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# DOM / SAC / CSSOM Benchmarks +# DOM / SAC / CSSOM / SVG Benchmarks You can build and run the benchmarks in this repository with either Maven or Gradle, Java 11 or later is required: diff --git a/build.gradle b/build.gradle index b7ea88d..4037b7e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,14 @@ +/* + + Copyright (c) 2019-2024, C. Amengual. + + Licensed under a BSD-style License. You can find the license here: + https://css4j.github.io/LICENSE.txt + + */ + +// SPDX-License-Identifier: BSD-3-Clause + plugins { id 'java' id 'maven-publish' @@ -13,8 +24,7 @@ repositories { releasesOnly() } content { - includeGroup 'io.sf.carte' - includeGroup 'io.sf.jclf' + includeGroupByRegex 'io\\.sf\\..*' } } } @@ -26,13 +36,16 @@ dependencies { implementation 'io.sf.carte:css4j:4.4' implementation(group: 'io.sf.carte', name: 'css4j', version: '4.4', classifier: 'tests') implementation 'io.sf.carte:css4j-dom4j:4.2' + implementation 'io.sf.carte:echosvg-transcoder:1.2.2' + implementation 'org.apache.xmlgraphics:batik-transcoder:1.17' + implementation 'org.apache.xmlgraphics:batik-codec:1.17' implementation 'nu.validator:htmlparser:1.4.16' implementation 'org.jsoup:jsoup:1.17.1' } group = 'io.sf.carte' version = '0.6' -description = 'JMH benchmark for CSS4J' +description = 'JMH benchmark for CSS4J and EchoSVG' java.sourceCompatibility = JavaVersion.VERSION_11 sourceSets { diff --git a/pom.xml b/pom.xml index 0d8330e..de385a3 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,24 @@ test-jar compile + + io.sf.carte + echosvg-transcoder + 1.2.2 + compile + + + org.apache.xmlgraphics + batik-transcoder + 1.17 + compile + + + org.apache.xmlgraphics + batik-codec + 1.17 + compile + nu.validator htmlparser @@ -122,6 +140,12 @@ org.openjdk.jmh.Main + + + *:xml-apis + *:xml-apis-ext + + *:* @@ -130,6 +154,8 @@ overview.html META-INF/*.txt META-INF/*.MF + META-INF/LICENSE + META-INF/NOTICE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + 30 + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + 31 + 30 + 29 + 30 + + + 31 + 30 + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + 31 + 30 + 29 + 30 + + + 31 + 30 + 30 + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + 30 + 30 + 29 + + + 31 + 30 + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + 31 + 30 + 29 + 30 + + + 31 + 30 + 30 + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + 31 + + + 30 + + + 29 + + + 30 + + + + + 31 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + 31 + + + 30 + + + 29 + + + 30 + + + + + 31 + + + 30 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + + + 30 + + + 30 + + + 29 + + + + + 31 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + 31 + + + 30 + + + 29 + + + 30 + + + + + 31 + + + 30 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + 31 + + + 30 + + + 29 + + + 30 + + + + + 31 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + 31 + + + 30 + + + 29 + + + 30 + + + + + 31 + + + 30 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + + + 30 + + + 30 + + + 29 + + + + + 31 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + 31 + + + 30 + + + 29 + + + 30 + + + + + 31 + + + 30 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + 31 + + + 30 + + + 29 + + + 30 + + + + + 31 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + 31 + + + 30 + + + 29 + + + 30 + + + + + 31 + + + 30 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 31 + + + 30 + + + 30 + + + 29 + + + + + 31 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + + + 31 + + + 30 + + + 29 + + + 30 + + + + + 31 + + + 30 + + + 30 + + + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 35 + + + > We’re sending you our estimate of who’s where in the building now. [ gruntsnbystanders.locdb.streamloc ] recieved [ gruntsnbystanders.locdb ] subscribed to + projecting alternateroutes: ok + + + + + + + + + + + + + + + + + + + + + + + + thought balloon + + + + + + dialogue balloon + + + + + + Drat. + + + + + transmission + hud readout:14% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/io/sf/carte/mark/svg/pooh3.svg b/resources/io/sf/carte/mark/svg/pooh3.svg new file mode 100644 index 0000000..30036dd --- /dev/null +++ b/resources/io/sf/carte/mark/svg/pooh3.svg @@ -0,0 +1,165 @@ + + + + diff --git a/resources/io/sf/carte/mark/svg/useMultiple.svg b/resources/io/sf/carte/mark/svg/useMultiple.svg new file mode 100644 index 0000000..a6523fb --- /dev/null +++ b/resources/io/sf/carte/mark/svg/useMultiple.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + Multiple <use> + + + + + + Multiple <use> + Multiple <use> elements referencing shapes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/io/sf/carte/mark/svg/FontDecorationPainter.java b/src/io/sf/carte/mark/svg/FontDecorationPainter.java new file mode 100644 index 0000000..63b0e54 --- /dev/null +++ b/src/io/sf/carte/mark/svg/FontDecorationPainter.java @@ -0,0 +1,102 @@ +/* + + Copyright (c) 2024, contributors to EchoSVG project. + + Licensed under a BSD-style License. You can find the license here: + https://css4j.github.io/LICENSE.txt + + */ + +/* + * SPDX-License-Identifier: BSD-3-Clause + */ +package io.sf.carte.mark.svg; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.Transparency; +import java.awt.color.ICC_ColorSpace; +import java.awt.color.ICC_Profile; +import java.awt.font.TextAttribute; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.awt.image.ComponentColorModel; +import java.awt.image.DataBuffer; +import java.awt.image.WritableRaster; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Draw text with decoration attributes. + */ +public class FontDecorationPainter { + + public void paint(Graphics2D g) { + // Set anti-aliasing + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // Set a background color + Color backgroundColor = new Color(0x08081a); + g.setBackground(backgroundColor); + + // Set default font + g.setFont(new Font("sans-serif", Font.BOLD, 12)); + + // Create a font with the desired attributes, including STRIKETHROUGH + Map attributes = new HashMap<>(); + attributes.put(TextAttribute.FAMILY, "serif"); + attributes.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_EXTRABOLD); + attributes.put(TextAttribute.SIZE, 20); + Font fontS = new Font(attributes); + + // A similar font + Map attributes2 = new HashMap<>(); + attributes.put(TextAttribute.FAMILY, "sans-serif"); + Font fontSS = new Font(attributes2); + + // Set the font and a color + g.setFont(fontS); + g.setPaint(new Color(0x666699)); + // Draw a string + g.drawString("Hello!", 10, 40); + + // Embed an image + BufferedImage image = createImage(); + g.drawImage(image, 25, 60, new Color(0xcccccc), null); + + // Now draw with a different color and the other font + g.setPaint(Color.black); + g.setFont(fontSS); + g.translate(0, 30); + // Draw a new string + g.drawString("Hi!", 10, 70); + } + + private static BufferedImage createImage() { + // Create an Image + BufferedImage image = new BufferedImage(100, 75, BufferedImage.TYPE_INT_ARGB); + + Graphics2D ig = image.createGraphics(); + ig.scale(.5, .5); + ig.setPaint(new Color(128, 0, 0)); + ig.fillRect(0, 0, 100, 50); + ig.setPaint(Color.orange); + ig.fillRect(100, 0, 100, 50); + ig.setPaint(Color.yellow); + ig.fillRect(0, 50, 100, 50); + ig.setPaint(Color.red); + ig.fillRect(100, 50, 100, 50); + ig.setPaint(new Color(255, 127, 127)); + ig.fillRect(0, 100, 100, 50); + ig.setPaint(Color.black); + ig.draw(new Rectangle2D.Double(0.5, 0.5, 199, 149)); + ig.dispose(); + + return image; + } + +} diff --git a/src/io/sf/carte/mark/svg/Issue91Mark.java b/src/io/sf/carte/mark/svg/Issue91Mark.java new file mode 100644 index 0000000..a02de3e --- /dev/null +++ b/src/io/sf/carte/mark/svg/Issue91Mark.java @@ -0,0 +1,78 @@ +/* + + Copyright (c) 2017-2024, Carlos Amengual. + + SPDX-License-Identifier: BSD-3-Clause + + Licensed under a BSD-style License. You can find the license here: + https://css4j.github.io/LICENSE.txt + + */ + +package io.sf.carte.mark.svg; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; + +import io.sf.carte.echosvg.anim.dom.SVGDOMImplementation; +import io.sf.carte.echosvg.dom.util.SAXDocumentFactory; +import io.sf.carte.echosvg.transcoder.TranscoderException; +import io.sf.carte.echosvg.transcoder.TranscoderInput; +import io.sf.carte.echosvg.transcoder.TranscoderOutput; +import io.sf.carte.echosvg.transcoder.image.PNGTranscoder; +import io.sf.carte.mark.Util; + +@Fork(value = 2, warmups = 2) +@Measurement(iterations = 18) +public class Issue91Mark { + + private final static String svgImage = Util.loadFilefromClasspath("svg/issue91.svg"); + + private final static String imageURI = Issue91Mark.class.getResource("issue91.svg").toExternalForm(); + + @Benchmark + public void markIssue91() throws TranscoderException, IOException { + org.w3c.dom.DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); + SAXDocumentFactory f = new SAXDocumentFactory(impl); + Reader re = new StringReader(svgImage); + org.w3c.dom.Document document = f.createDocument(imageURI, re); + + PNGTranscoder trans = new PNGTranscoder(); + TranscoderInput input = new TranscoderInput(document); + ByteArrayOutputStream ostream = new ByteArrayOutputStream(2000); + TranscoderOutput output = new TranscoderOutput(ostream); + + trans.transcode(input, output); + + assert (ostream.size() > 2000); + } + + @Benchmark + public void markIssue91_Batik() + throws org.apache.batik.transcoder.TranscoderException, IOException { + org.w3c.dom.DOMImplementation impl = org.apache.batik.anim.dom.SVGDOMImplementation + .getDOMImplementation(); + org.apache.batik.dom.util.SAXDocumentFactory f = new org.apache.batik.dom.util.SAXDocumentFactory( + impl, null); + Reader re = new StringReader(svgImage); + org.w3c.dom.Document document = f.createDocument(imageURI, re); + + org.apache.batik.transcoder.image.PNGTranscoder trans = new org.apache.batik.transcoder.image.PNGTranscoder(); + org.apache.batik.transcoder.TranscoderInput input = new org.apache.batik.transcoder.TranscoderInput( + document); + ByteArrayOutputStream ostream = new ByteArrayOutputStream(2000); + org.apache.batik.transcoder.TranscoderOutput output = new org.apache.batik.transcoder.TranscoderOutput( + ostream); + + trans.transcode(input, output); + + assert (ostream.size() > 2000); + } + +} diff --git a/src/io/sf/carte/mark/svg/Pooh3Mark.java b/src/io/sf/carte/mark/svg/Pooh3Mark.java new file mode 100644 index 0000000..1388e82 --- /dev/null +++ b/src/io/sf/carte/mark/svg/Pooh3Mark.java @@ -0,0 +1,78 @@ +/* + + Copyright (c) 2017-2024, Carlos Amengual. + + SPDX-License-Identifier: BSD-3-Clause + + Licensed under a BSD-style License. You can find the license here: + https://css4j.github.io/LICENSE.txt + + */ + +package io.sf.carte.mark.svg; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; + +import io.sf.carte.echosvg.anim.dom.SVGDOMImplementation; +import io.sf.carte.echosvg.dom.util.SAXDocumentFactory; +import io.sf.carte.echosvg.transcoder.TranscoderException; +import io.sf.carte.echosvg.transcoder.TranscoderInput; +import io.sf.carte.echosvg.transcoder.TranscoderOutput; +import io.sf.carte.echosvg.transcoder.image.PNGTranscoder; +import io.sf.carte.mark.Util; + +@Fork(value = 2, warmups = 2) +@Measurement(iterations = 18) +public class Pooh3Mark { + + private final static String svgImage = Util.loadFilefromClasspath("svg/pooh3.svg"); + + private final static String imageURI = Pooh3Mark.class.getResource("pooh3.svg").toExternalForm(); + + @Benchmark + public void markPooh3() throws TranscoderException, IOException { + org.w3c.dom.DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); + SAXDocumentFactory f = new SAXDocumentFactory(impl); + Reader re = new StringReader(svgImage); + org.w3c.dom.Document document = f.createDocument(imageURI, re); + + PNGTranscoder trans = new PNGTranscoder(); + TranscoderInput input = new TranscoderInput(document); + ByteArrayOutputStream ostream = new ByteArrayOutputStream(2000); + TranscoderOutput output = new TranscoderOutput(ostream); + + trans.transcode(input, output); + + assert (ostream.size() > 2000); + } + + @Benchmark + public void markPooh3_Batik() + throws org.apache.batik.transcoder.TranscoderException, IOException { + org.w3c.dom.DOMImplementation impl = org.apache.batik.anim.dom.SVGDOMImplementation + .getDOMImplementation(); + org.apache.batik.dom.util.SAXDocumentFactory f = new org.apache.batik.dom.util.SAXDocumentFactory( + impl, null); + Reader re = new StringReader(svgImage); + org.w3c.dom.Document document = f.createDocument(imageURI, re); + + org.apache.batik.transcoder.image.PNGTranscoder trans = new org.apache.batik.transcoder.image.PNGTranscoder(); + org.apache.batik.transcoder.TranscoderInput input = new org.apache.batik.transcoder.TranscoderInput( + document); + ByteArrayOutputStream ostream = new ByteArrayOutputStream(2000); + org.apache.batik.transcoder.TranscoderOutput output = new org.apache.batik.transcoder.TranscoderOutput( + ostream); + + trans.transcode(input, output); + + assert (ostream.size() > 2000); + } + +} diff --git a/src/io/sf/carte/mark/svg/SVGGraphics2DMark.java b/src/io/sf/carte/mark/svg/SVGGraphics2DMark.java new file mode 100644 index 0000000..c3a5699 --- /dev/null +++ b/src/io/sf/carte/mark/svg/SVGGraphics2DMark.java @@ -0,0 +1,156 @@ +/* + + Copyright (c) 2017-2024, Carlos Amengual. + + SPDX-License-Identifier: BSD-3-Clause + + Licensed under a BSD-style License. You can find the license here: + https://css4j.github.io/LICENSE.txt + + */ + +package io.sf.carte.mark.svg; + +import java.awt.Dimension; +import java.awt.Font; +import java.io.CharArrayWriter; +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.w3c.dom.Document; +import org.w3c.dom.DocumentType; +import org.w3c.dom.Element; + +import io.sf.carte.echosvg.svggen.SVGGeneratorContext; +import io.sf.carte.echosvg.svggen.SVGGeneratorContext.GraphicContextDefaults; +import io.sf.carte.echosvg.svggen.SVGGraphics2D; +import io.sf.carte.echosvg.transcoder.TranscoderException; + +@Fork(value = 2, warmups = 2) +@Measurement(iterations = 18) +public class SVGGraphics2DMark { + + @Benchmark + public void markSVGGraphics2D() throws TranscoderException, IOException { + FontDecorationPainter painter = new FontDecorationPainter(); + + SVGGraphics2D g2d = createSVGGraphics2D(createDocument()); + + // Set some appropriate dimension + g2d.setSVGCanvasSize(new Dimension(300, 400)); + + painter.paint(g2d); + + CharArrayWriter wri = new CharArrayWriter(1900); + g2d.stream(wri); + + int len = wri.toCharArray().length; + assert (len > 1800); + } + + @Benchmark + public void markSVGGraphics2D_Batik() throws TranscoderException, IOException { + FontDecorationPainter painter = new FontDecorationPainter(); + + org.apache.batik.svggen.SVGGraphics2D g2d = createBatikSVGGraphics2D(createDocument()); + + // Set some appropriate dimension + g2d.setSVGCanvasSize(new Dimension(300, 400)); + + painter.paint(g2d); + + CharArrayWriter wri = new CharArrayWriter(1900); + g2d.stream(wri); + + int len = wri.toCharArray().length; + assert (len > 1800); + } + + /** + * Creates a Document with an SVG roots. + * + * @return the Document. + */ + private static Document createDocument() { + // We need a Document that holds an SVG root element. + // First obtain a DocumentBuilder as a way to get it. + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + + DocumentBuilder builder; + try { + builder = factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException(e); + } + + // Now the document which is what is needed + Document doc = builder.newDocument(); + + // Create a SVG DTD + DocumentType dtd = builder.getDOMImplementation().createDocumentType("svg", + "-//W3C//DTD SVG 1.1//EN", "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"); + // And the root element in the SVG namespace + Element svgRoot = doc.createElementNS("http://www.w3.org/2000/svg", "svg"); + + // Append those to the document + doc.appendChild(dtd); + doc.appendChild(svgRoot); + + return doc; + } + + /** + * Creates a SVGGraphics2D with certain defaults. + * + * @return the SVGGraphics2D. + */ + static SVGGraphics2D createSVGGraphics2D(Document doc) { + /* + * Now the document is ready: let's create some context objects and then the + * SVGGraphics2D. + */ + + // For simplicity, create a generator context with some defaults + SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(doc); + + // Create the context defaults, with a default font just in case + GraphicContextDefaults defaults = new GraphicContextDefaults(); + defaults.setFont(new Font("Arial", Font.PLAIN, 12)); + // Set the defaults + ctx.setGraphicContextDefaults(defaults); + + return new SVGGraphics2D(ctx, false); + } + + /** + * Creates a Batik SVGGraphics2D with certain defaults. + * + * @return the SVGGraphics2D. + */ + static org.apache.batik.svggen.SVGGraphics2D createBatikSVGGraphics2D(Document doc) { + /* + * Now the document is ready: let's create some context objects and then the + * SVGGraphics2D. + */ + + // For simplicity, create a generator context with some defaults + org.apache.batik.svggen.SVGGeneratorContext ctx = org.apache.batik.svggen.SVGGeneratorContext + .createDefault(doc); + + // Create the context defaults, with a default font just in case + org.apache.batik.svggen.SVGGeneratorContext.GraphicContextDefaults defaults = new org.apache.batik.svggen.SVGGeneratorContext.GraphicContextDefaults(); + defaults.setFont(new Font("Arial", Font.PLAIN, 12)); + // Set the defaults + ctx.setGraphicContextDefaults(defaults); + + return new org.apache.batik.svggen.SVGGraphics2D(ctx, false); + } + +} diff --git a/src/io/sf/carte/mark/svg/UseMultipleMark.java b/src/io/sf/carte/mark/svg/UseMultipleMark.java new file mode 100644 index 0000000..c8eaf9d --- /dev/null +++ b/src/io/sf/carte/mark/svg/UseMultipleMark.java @@ -0,0 +1,78 @@ +/* + + Copyright (c) 2017-2024, Carlos Amengual. + + SPDX-License-Identifier: BSD-3-Clause + + Licensed under a BSD-style License. You can find the license here: + https://css4j.github.io/LICENSE.txt + + */ + +package io.sf.carte.mark.svg; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; + +import io.sf.carte.echosvg.anim.dom.SVGDOMImplementation; +import io.sf.carte.echosvg.dom.util.SAXDocumentFactory; +import io.sf.carte.echosvg.transcoder.TranscoderException; +import io.sf.carte.echosvg.transcoder.TranscoderInput; +import io.sf.carte.echosvg.transcoder.TranscoderOutput; +import io.sf.carte.echosvg.transcoder.image.PNGTranscoder; +import io.sf.carte.mark.Util; + +@Fork(value = 2, warmups = 2) +@Measurement(iterations = 18) +public class UseMultipleMark { + + private final static String svgImage = Util.loadFilefromClasspath("svg/useMultiple.svg"); + + private final static String imageURI = UseMultipleMark.class.getResource("useMultiple.svg").toExternalForm(); + + @Benchmark + public void markUseMultiple() throws TranscoderException, IOException { + org.w3c.dom.DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); + SAXDocumentFactory f = new SAXDocumentFactory(impl); + Reader re = new StringReader(svgImage); + org.w3c.dom.Document document = f.createDocument(imageURI, re); + + PNGTranscoder trans = new PNGTranscoder(); + TranscoderInput input = new TranscoderInput(document); + ByteArrayOutputStream ostream = new ByteArrayOutputStream(1000); + TranscoderOutput output = new TranscoderOutput(ostream); + + trans.transcode(input, output); + + assert (ostream.size() > 1000); + } + + @Benchmark + public void markUseMultiple_Batik() + throws org.apache.batik.transcoder.TranscoderException, IOException { + org.w3c.dom.DOMImplementation impl = org.apache.batik.anim.dom.SVGDOMImplementation + .getDOMImplementation(); + org.apache.batik.dom.util.SAXDocumentFactory f = new org.apache.batik.dom.util.SAXDocumentFactory( + impl, null); + Reader re = new StringReader(svgImage); + org.w3c.dom.Document document = f.createDocument(imageURI, re); + + org.apache.batik.transcoder.image.PNGTranscoder trans = new org.apache.batik.transcoder.image.PNGTranscoder(); + org.apache.batik.transcoder.TranscoderInput input = new org.apache.batik.transcoder.TranscoderInput( + document); + ByteArrayOutputStream ostream = new ByteArrayOutputStream(1000); + org.apache.batik.transcoder.TranscoderOutput output = new org.apache.batik.transcoder.TranscoderOutput( + ostream); + + trans.transcode(input, output); + + assert (ostream.size() > 1000); + } + +} diff --git a/src/io/sf/carte/mark/svg/package-info.java b/src/io/sf/carte/mark/svg/package-info.java new file mode 100644 index 0000000..5fa29a0 --- /dev/null +++ b/src/io/sf/carte/mark/svg/package-info.java @@ -0,0 +1,4 @@ +/** + * SVG benchmarks. + */ +package io.sf.carte.mark.svg;