razrfalcon / resvg-test-suite Goto Github PK
View Code? Open in Web Editor NEWresvg test suite
Home Page: https://razrfalcon.github.io/resvg-test-suite/svg-support-table.html
License: MIT License
resvg test suite
Home Page: https://razrfalcon.github.io/resvg-test-suite/svg-support-table.html
License: MIT License
foundation is too heavy.
You might know that you have two duplicates in your test suite.
more infos: https://commons.wikimedia.org/wiki/Category:Rendersvg_test_suite
I think the two tests in this repository are outdated/wrong.
In the case of orient=auto-on-M-C-C-4
, the marker at the top is in the wrong direction I think.
The reference file for this repository
The reference file in the resvg repository
In the case of marker-on-rounded-rect
, the markers are completely missing.
The reference file for this repository
The reference file in the resvg repository
The svg is as follows:
<svg id="svg1" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<title>`rotate-at-position`</title>
<!-- should be covered -->
<path id="path1" d="M 99,14.14 L 183.8,99 L 99,183.85 L 14.14,99 Z" fill="red"/>
<g id="g1" transform="rotate(45, 100, 50)">
<rect id="rect1" x="75" y="25" width="120" height="120" fill="green"/>
</g>
<!-- image frame -->
<rect id="frame" x="1" y="1" width="198" height="198" fill="none" stroke="black"/>
</svg>
It says that the red path should be covered, but even in the resvg reference pictures it is not completely covered:
Same applies to when opening the svg directly in Chrome/Firefox.
Is there something wrong with the description or am I missing something else?
This test is validating focal point correction, but that was changed in SVG2, from https://www.w3.org/TR/SVG2/pservers.html#RadialGradientNotes:
f the start circle defined by ‘fx’, ‘fy’ and ‘fr’ lies outside the end circle defined by ‘cx’, ‘cy’, and ‘r’, effectively a cone is created, touched by the two circles. Areas outside the cone stay untouched by the gradient (transparent black).
So instead of correcting the focal point, it now draws a cone. Based on that, I believe the test should render as follows:
However, the golden in the test suite renders as follows:
Chrome appears to render in the same way with a cone, so I think that the results of the test suite are backwards.
The spec appears to be worded without mentioning backwards compatibility, should the SVG2 behavior be used for all files?
If I run vdiff
with this settings:
Process 'home/jokalliau/prgm/batik-1.14/batik-rasterizer-1.14.jar' finished with an invalid exit code: 1 invalid file (bad magic number: Exec format error
It might be related with this issue: https://stackoverflow.com/a/29139336/6747994 or https://stackoverflow.com/a/42646713/6747994
cd home/jokalliau/prgm
wget https://mirror.klaus-uwe.me/apache//xmlgraphics/batik/binaries/batik-bin-1.14.zip
unzip batik-bin-1.14.zip
java -jar ~/prgm/batik-1.14/batik-rasterizer-1.14.jar "$file" -d "${file%.svg}_batik.png"
works
Do I have to choose the *.jar-file or an executable-file?
OS: Fedora 33
Batik: 1.14
Inkscape1 (not officially released) has a slightly different command line than 0.92.4
Instead of
inkscape filename.svg --export-png=filename.png
Inkscape1 uses
inkscape filename.svg --export-type="png" -w 250
or
inkscape --without-gui --actions="PNGFilename.png; export-do" filename.svg
more infos can be found at https://wiki.inkscape.org/wiki/index.php/Using_the_Command_Line
If you do not want to implement it: Maybe I can edit the souce-code and recompile?
When I try to render with wxSVG it fails because it does not find libwxsvg.so.3
I downloaded https://sourceforge.net/projects/wxsvg/files/ and builded it in /home/jkalliau/prgm/wxsvg-1.5.22
.\INSTALL
.\configure
.\INSTALL
make
make install
sudo make install
I found it in /home/jkalliau/prgm/wxsvg-1.5.22/src/.libs/libwxsvg.so.3
.
I think I could copy it to /usr/lib
. But I think that might mess up my system?
Can I tell vdiff to use /home/jkalliau/prgm/wxsvg-1.5.22/src/.libs/libwxsvg.so.3
for wxsvg?
https://www.w3.org/TR/filter-effects-1/#element-attrdef-feblend-no-composite
Either no one supports it or I'm missing something.
Trying to create a styling file that be linked (where possible) or dynamically embedded in the SVG test files for consistent results. Does the following CSS captures the styling required by the tests? (Inkscape results later shows it can make a difference):
NOTE: Some of the font families like NotoSans-Medium.ttf are not currently included in the fonts directory.
* {
font-family: "Noto Sans"
}
.serif {
font-family: "Noto Serif", serif;
}
.sansserif {
font-family: "Noto Sans", sans-serif;
}
.monospace {
font-family: "Noto Mono", monospace;
}
.cursive {
font-family: "Yellowtail", cursive;
}
.fantasy {
font-family: "Sedgwick Ave Display", fantasy;
}
.emoji {
font-family: "Noto Color Emoji", "Noto Emoji", emoji;
}
.math {
font-family: math;
}
.fangsong {
font-family: fangsong;
}
@font-face {
font-family: "Noto Serif";
font-style: normal;
font-weight: 400;
src: url(../fonts/NotoSerif-Regular.ttf) format('truetype');
}
@font-face {
font-family: "Noto Sans";
font-style: normal;
font-weight: 100;
src: url(../fonts/NotoSans-Thin.ttf) format('truetype');
}
@font-face {
font-family: "Noto Sans";
font-style: normal;
font-weight: 200;
src: url(../fonts/NotoSans-Light.ttf) format('truetype');
}
@font-face {
font-family: "Noto Sans";
font-style: normal;
font-weight: 300;
src: url(../fonts/NotoSans-DemiLight.ttf) format('truetype');
}
@font-face {
font-family: "Noto Sans";
font-style: normal;
font-weight: 400;
src: url(../fonts/NotoSans-Regular.ttf) format('truetype');
}
@font-face {
font-family: "Noto Sans";
font-style: normal;
font-weight: 500;
src: url(../fonts/NotoSans-Medium.ttf) format('truetype');
}
@font-face {
font-family: "Noto Sans";
font-style: normal;
font-weight: 700;
src: url(../fonts/NotoSans-Bold.ttf) format('truetype');
}
@font-face {
font-family: "Noto Sans";
font-style: normal;
font-weight: 900;
src: url(../fonts/NotoSans-Black.ttf) format('truetype');
}
@font-face {
font-family: Yellowtail;
font-style: normal;
font-weight: 400;
src: url(../fonts/Yellowtail-Regular.ttf) format('truetype');
}
@font-face {
font-family: "Sedgwick Ave Display";
font-style: normal;
font-weight: 400;
src: url(../fonts/SedgwickAveDisplay-Regular.ttf) format('truetype');
}
@font-face {
font-family: "Source Sans Pro";
font-style: normal;
font-weight: 400;
src: url(../fonts/SourceSansPro-Regular.ttf) format('truetype');
}
@font-face {
font-family: "Noto Color Emoji";
font-style: normal;
font-weight: 400;
src: url(../fonts/NotoColorEmoji.ttf) format('truetype');
}
@font-face {
font-family: "Noto Emoji";
font-style: normal;
font-weight: 400;
src: url(../fonts/NotoEmoji-Regular.ttf) format('truetype');
}
@font-face {
font-family: Amiri;
font-style: normal;
font-weight: 400;
src: url(../fonts/Amiri-Regular.ttf) format('truetype');
}
@font-face {
font-family: MPLUS1p;
font-style: normal;
font-weight: 400;
src: url(../fonts/MPLUS1p-Regular.ttf) format('truetype');
}
Update 1: Added missing @font-face
definition for Noto Serif
.
The following are the results generated by exporting a-alignment-baseline-001.svg with Inkscape (command line)
Without Styling (current default) | With Styling (above css embedded) |
---|---|
This test has a viewbox of 10x10, which would lead me to believe that the output resolution should also be 10x10 (and if I run this exact svg through resvg it also outputs an image with the dimensions 10x10), but the reference image has a resolution of 300x300. Am I missing something here?
filter="url(commonfilters.svg#filter)"
The current stable version is 120.
Chrome 119 has upgraded clip-path. The following cases are now supported:
Circle shorthand with
stroke-box (SVG 2)
Circle shorthand with
view-box (SVG 2)
https://razrfalcon.github.io/resvg-test-suite/svg-support-table.html#_masking
Your Readme linking to svg-net/SVG#614 is a bit unclear.
I installed https://github.com/wieslawsoltes/SVG/tree/SampleConsoleApplication/Samples/SvgConsole
I tried
cd /home/jkalliau/Documents/GitHub/resvg-test-suite/tools/svgnetrender
./SvgConsole -f filename.svg
According to https://github.com/RazrFalcon/resvg-test-suite/blob/master/tools/vdiff/README.md#dependencies vdiff depends on Qt5, but is Qt6 also supported?
sudo dnf install /usr/bin/qmake
sudo dnf install inkscape qt6-qtbase-devel qt6-qtsvg-devel wxsvg wxsvg-devel
cd /home/jkalliau/Documents/GitHub/resvg-test-suite/tools/vdiff
cd ../chrome-svgrender
npm i puppeteer
cd ../qtsvgrender
qmake
make #returns `make: Nothing to be done for 'first'.`
cd ../wxsvgrender
qmake
make #returns `fatal error: wx/wx.h: No such file or directory`
./build #returns `fatal error: wx/wx.h: No such file or directory`
cd ../vdiff
qmake
make # that is the problematic step
the last make
-command returns:
g++ -c -pipe -O2 -Wall -Wextra -D_REENTRANT -fPIC -DSRCDIR=\"/home/jkalliau/Documents/GitHub/resvg-test-suite/tools/vdiff/\" -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CONCURRENT_LIB -DQT_SQL_LIB -DQT_CORE_LIB -I. -I/usr/include/qt6 -I/usr/include/qt6/QtWidgets -I/usr/include/qt6/QtGui -I/usr/include/qt6/QtConcurrent -I/usr/include/qt6/QtSql -I/usr/include/qt6/QtCore -I. -I. -I/../lib64/qt6/mkspecs/linux-g++ -o tests.o src/tests.cpp
src/tests.cpp:12:37: error: ‘QStringRef’ does not name a type; did you mean ‘QStringView’?
12 | static TestState stateFormStr(const QStringRef &str)
| ^~~~~~~~~~
| QStringView
src/tests.cpp: In function ‘TestState stateFormStr(const int&)’:
src/tests.cpp:15:25: error: request for member ‘toInt’ in ‘str’, which is of non-class type ‘const int’
15 | const int idx = str.toInt(&ok);
| ^~~~~
src/tests.cpp:18:57: error: request for member ‘toString’ in ‘str’, which is of non-class type ‘const int’
18 | throw QString("Invalid state ID: '%1'").arg(str.toString());
| ^~~~~~~~
src/tests.cpp: In function ‘QString parseTitle(const QString&)’:
src/tests.cpp:43:34: error: conversion from ‘const char [6]’ to ‘QChar’ is ambiguous
43 | if (reader.name() == "title") {
| ^~~~~~~
In file included from /usr/include/qt6/QtCore/qstring.h:50,
from /usr/include/qt6/QtCore/qobject.h:47,
from /usr/include/qt6/QtCore/qiodevice.h:46,
from /usr/include/qt6/QtCore/qfiledevice.h:43,
from /usr/include/qt6/QtCore/qfile.h:44,
from /usr/include/qt6/QtCore/QFile:1,
from src/tests.cpp:1:
/usr/include/qt6/QtCore/qchar.h:125:45: note: candidate: ‘constexpr QChar::QChar(char)’ (near match)
125 | QT_ASCII_CAST_WARN constexpr Q_IMPLICIT QChar(char c) noexcept : ucs(uchar(c)) { }
| ^~~~~
/usr/include/qt6/QtCore/qchar.h:125:45: note: conversion of argument 1 would be ill-formed:
src/tests.cpp:43:34: error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]
43 | if (reader.name() == "title") {
| ^~~~~~~
| |
| const char*
In file included from /usr/include/qt6/QtCore/qstring.h:50,
from /usr/include/qt6/QtCore/qobject.h:47,
from /usr/include/qt6/QtCore/qiodevice.h:46,
from /usr/include/qt6/QtCore/qfiledevice.h:43,
from /usr/include/qt6/QtCore/qfile.h:44,
from /usr/include/qt6/QtCore/QFile:1,
from src/tests.cpp:1:
/usr/include/qt6/QtCore/qchar.h:118:26: note: candidate: ‘constexpr QChar::QChar(char16_t)’ (near match)
118 | constexpr Q_IMPLICIT QChar(char16_t ch) noexcept : ucs(ch) {}
| ^~~~~
/usr/include/qt6/QtCore/qchar.h:118:26: note: conversion of argument 1 would be ill-formed:
src/tests.cpp:43:34: error: invalid conversion from ‘const char*’ to ‘char16_t’ [-fpermissive]
43 | if (reader.name() == "title") {
| ^~~~~~~
| |
| const char*
In file included from /usr/include/qt6/QtCore/qstring.h:50,
from /usr/include/qt6/QtCore/qobject.h:47,
from /usr/include/qt6/QtCore/qiodevice.h:46,
from /usr/include/qt6/QtCore/qfiledevice.h:43,
from /usr/include/qt6/QtCore/qfile.h:44,
from /usr/include/qt6/QtCore/QFile:1,
from src/tests.cpp:1:
/usr/include/qt6/QtCore/qchar.h:113:26: note: candidate: ‘constexpr QChar::QChar(short int)’ (near match)
113 | constexpr Q_IMPLICIT QChar(short rc) noexcept : ucs(char16_t(rc)) {}
| ^~~~~
/usr/include/qt6/QtCore/qchar.h:113:26: note: conversion of argument 1 would be ill-formed:
src/tests.cpp:43:34: error: invalid conversion from ‘const char*’ to ‘short int’ [-fpermissive]
43 | if (reader.name() == "title") {
| ^~~~~~~
| |
| const char*
In file included from /usr/include/qt6/QtCore/qstring.h:50,
from /usr/include/qt6/QtCore/qobject.h:47,
from /usr/include/qt6/QtCore/qiodevice.h:46,
from /usr/include/qt6/QtCore/qfiledevice.h:43,
from /usr/include/qt6/QtCore/qfile.h:44,
from /usr/include/qt6/QtCore/QFile:1,
from src/tests.cpp:1:
/usr/include/qt6/QtCore/qchar.h:111:26: note: candidate: ‘constexpr QChar::QChar(ushort)’ (near match)
111 | constexpr Q_IMPLICIT QChar(ushort rc) noexcept : ucs(rc) {}
| ^~~~~
/usr/include/qt6/QtCore/qchar.h:111:26: note: conversion of argument 1 would be ill-formed:
src/tests.cpp:43:34: error: invalid conversion from ‘const char*’ to ‘ushort’ {aka ‘short unsigned int’} [-fpermissive]
43 | if (reader.name() == "title") {
| ^~~~~~~
| |
| const char*
In file included from /usr/include/qt6/QtCore/qchar.h:665,
from /usr/include/qt6/QtCore/qstring.h:50,
from /usr/include/qt6/QtCore/qobject.h:47,
from /usr/include/qt6/QtCore/qiodevice.h:46,
from /usr/include/qt6/QtCore/qfiledevice.h:43,
from /usr/include/qt6/QtCore/qfile.h:44,
from /usr/include/qt6/QtCore/QFile:1,
from src/tests.cpp:1:
/usr/include/qt6/QtCore/qstringview.h:412:51: note: initializing argument 2 of ‘bool operator==(QStringView, QChar)’
412 | friend bool operator==(QStringView lhs, QChar rhs) noexcept { return lhs == QStringView(&rhs, 1); }
| ~~~~~~^~~
src/tests.cpp: In static member function ‘static Tests Tests::load(TestSuite, const QString&, const QString&)’:
src/tests.cpp:70:16: error: ‘QStringRef’ does not name a type; did you mean ‘QStringView’?
70 | for (const QStringRef &line : text.splitRef('\n')) {
| ^~~~~~~~~~
| QStringView
src/tests.cpp:110:6: error: expected ‘;’ before ‘return’
110 | }
| ^
| ;
111 |
112 | return tests;
| ~~~~~~
src/tests.cpp:112:5: error: expected primary-expression before ‘return’
112 | return tests;
| ^~~~~~
src/tests.cpp:110:6: error: expected ‘;’ before ‘return’
110 | }
| ^
| ;
111 |
112 | return tests;
| ~~~~~~
src/tests.cpp:112:5: error: expected primary-expression before ‘return’
112 | return tests;
| ^~~~~~
src/tests.cpp:110:6: error: expected ‘)’ before ‘return’
110 | }
| ^
| )
111 |
112 | return tests;
| ~~~~~~
src/tests.cpp:70:9: note: to match this ‘(’
70 | for (const QStringRef &line : text.splitRef('\n')) {
| ^
src/tests.cpp:69:9: warning: unused variable ‘row’ [-Wunused-variable]
69 | int row = 1;
| ^~~
src/tests.cpp:54:35: warning: unused parameter ‘testSuite’ [-Wunused-parameter]
54 | Tests Tests::load(const TestSuite testSuite, const QString &path, const QString &testsPath)
| ~~~~~~~~~~~~~~~~^~~~~~~~~
src/tests.cpp:54:82: warning: unused parameter ‘testsPath’ [-Wunused-parameter]
54 | Tests Tests::load(const TestSuite testSuite, const QString &path, const QString &testsPath)
| ~~~~~~~~~~~~~~~^~~~~~~~~
src/tests.cpp: In static member function ‘static void Tests::resync(const Settings&)’:
src/tests.cpp:199:16: error: ‘QStringRef’ does not name a type; did you mean ‘QStringView’?
199 | for (const QStringRef &line : text.splitRef('\n')) {
| ^~~~~~~~~~
| QStringView
src/tests.cpp:215:6: error: expected ‘;’ before ‘newTests’
215 | }
| ^
| ;
216 |
217 | newTests.save(settings.resultsPath());
| ~~~~~~~~
src/tests.cpp:217:18: error: could not convert ‘newTests.Tests::save(Settings::resultsPath() const())’ from ‘void’ to ‘bool’
217 | newTests.save(settings.resultsPath());
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
| |
| void
src/tests.cpp:218:1: error: expected primary-expression before ‘}’ token
218 | }
| ^
src/tests.cpp:217:43: error: expected ‘)’ before ‘}’ token
217 | newTests.save(settings.resultsPath());
| ^
| )
218 | }
| ~
src/tests.cpp:199:9: note: to match this ‘(’
199 | for (const QStringRef &line : text.splitRef('\n')) {
| ^
src/tests.cpp:218:1: error: expected primary-expression before ‘}’ token
218 | }
| ^
src/tests.cpp: In static member function ‘static Tests Tests::load(TestSuite, const QString&, const QString&)’:
src/tests.cpp:113:1: warning: control reaches end of non-void function [-Wreturn-type]
113 | }
| ^
src/tests.cpp: At global scope:
src/tests.cpp:32:16: warning: ‘QString parseTitle(const QString&)’ defined but not used [-Wunused-function]
32 | static QString parseTitle(const QString &path)
| ^~~~~~~~~~
src/tests.cpp:12:18: warning: ‘TestState stateFormStr(const int&)’ defined but not used [-Wunused-function]
12 | static TestState stateFormStr(const QStringRef &str)
| ^~~~~~~~~~~~
make: *** [Makefile:529: tests.o] Error 1
Operating System: Fedora 34 (Workstation Edition)
Kernel: Linux 5.12.13-300.fc34.x86_64
$ qmake --version
QMake version 3.1
Using Qt version 6.1.1 in /usr/lib64
$ make --version
GNU Make 4.3
Built for x86_64-redhat-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
I don't know why inkscape.x86_64 1.2.2-7.fc38
works on KDE and Xfce, but not on Gnome
Gnome | Gnome on Xorg | Plasma (Wayland) | Plasma(X11) | Xfce |
---|---|---|---|---|
hostnamectl
Static hostname: lws84.imws.tuwien.ac.at
Icon name: computer-laptop
Chassis: laptop 💻
Machine ID: 96434f58f7644401a3f9d69da903899d
Boot ID: 1113ece2f1854fcb992bc27461a9d177
Operating System: Fedora Linux 38 (Workstation Edition)
CPE OS Name: cpe:/o:fedoraproject:fedora:38
OS Support End: Tue 2024-05-14
OS Support Remaining: 11month 2w 6d
Kernel: Linux 6.2.15-300.fc38.x86_64
Architecture: x86-64
Hardware Vendor: Lenovo
Hardware Model: ThinkPad P15 Gen 1
Firmware Version: N30ET49W (1.32 )
Firmware Date: Wed 2022-12-14
lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: Fedora
Description: Fedora release 38 (Thirty Eight)
Release: 38
Codename: ThirtyEight
I did not find any image with a-textLength in the test-suite, did I miss it/them?
relating issues:
This is a fantastic test suite! Have you considered writing future tests that are compatible with WPT reftests (link) and upstreaming them to wpt? WPT tests are bi-directionally synced into Chromium/Webkit/Gecko's repositories, and by sharing tests, we can improve interoperability between implementations.
An example test is svg/text/reftests/no-background.svg and svg/text/reftests/no-background-ref.svg. I have been committing SVG WPT tests in .html
format, but wouldn't mind switching to .svg
if it would help non-browser implementations.
How valid are the test results?
The expected result for the file a-font-family-011.svg, for instance, is not valid when you read the file and manually observe the results.
<svg id="svg1" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<title>Bold `sans-serif`</title>
<text id="text1" x="100" y="100" text-anchor="middle"
font-family="sans-serif" font-weight="bold" font-size="40">Text</text>
<!-- image frame -->
<rect id="frame" x="1" y="1" width="198" height="198" fill="none" stroke="black"/>
</svg>
The expected result, a-font-family-011.png, does not seems to be rendered with sans-serif. Am I missing something?
Blocked by: mozilla/geckodriver#1278
I would like to make a minimal working example (for reducing work of the developers), therfore I would like to rerender the current file. (Everytime I overwrite the file, or add an upload-bottom.)
I would like to render several images in a folder automatic, and export a screenshot of the rendering. For something like https://commons.wikimedia.org/wiki/User:JoKalliauer/SVG_test_suites/w3c_details
I try to use Firefox, but it does not work out.
I closed all Firefox-sessions.
I use /usr/lib/firefox/firefox
for firefox, see
I can open firefox using /usr/lib/firefox/firefox
.
I get the information "Invalid Image: /home/jkalliau/Documents/GitHub/resvg-test-suite/tools/vdiff/firefox.png"
But this file /home/jkalliau/Documents/GitHub/resvg-test-suite/tools/vdiff/firefox.png
does not exist, but however if I copy "screnshot.png" to "firefox.png" and refresh with ctrl
& r
it shows this image.
But if I refresh again with ctrl
& r
I do not see any image again.
Might it be that the image get rendered at a different place?
I use librsvg 2.50.3 and the following librsvg-results might be outdated (maybe I have overseen something)
I know it is difficult to keep them up-to-date, so I understand if you do not want to update to each version.
edit:
Update to resvg 0.14
update chrome:
edit batik
update Inkscape
update wxSVG
In the SVG2 spec, there is the following sentence in https://www.w3.org/TR/SVG2/pservers.html#RadialGradientNotes:
If the start circle fully overlaps with the end circle, no gradient is drawn. The area stays untouched (transparent black).
In the e-radialGradient-044.svg
test, that condition appears to be met:
<radialGradient id="rg1" fr="0.7">
<stop offset="0" stop-color="black"/>
<stop offset="1" stop-color="white"/>
</radialGradient>
The default value of r="0.5"
, so the start circle radius is 0.7 and the end circle radius is 0.5. Since that fully overlaps, no gradient should be drawn.
Is that correct, or am I missing some wording?
I tried
cd ~/Documents/GitHub/resvg-test-suite/tools/qtsvgrender
g++ main.cpp
and got
main.cpp:1:10: fatal error: QGuiApplication: No such file or directory
#include <QGuiApplication>
^~~~~~~~~~~~~~~~~
compilation terminated.
lib | pic |
---|---|
svg | |
ink | |
resvg | |
rsvg | |
chrome |
source https://commons.wikimedia.org/wiki/File:Diagram_Damage_to_Cancer_Wiki_300dpi.svg
author Bernstein0275
license https://creativecommons.org/licenses/by-sa/3.0/deed.de
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.