avianey / androidsvgdrawable-plugin Goto Github PK
View Code? Open in Web Editor NEWGradle plugin that generates qualified, density specific PNG drawables from SVG files at build time for your Android projects.
License: Apache License 2.0
Gradle plugin that generates qualified, density specific PNG drawables from SVG files at build time for your Android projects.
License: Apache License 2.0
Generally, error messages should say what's wrong and idealy also give a hint how to fix it.
When I define just from
and to
, all I get from the plugin is
$ gradle svgToPng
:svgToPng FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':svgToPng'.
> java.lang.NullPointerException (no error message)
By trial and error I found out when I add targetedDensities
the error changes to
$ gradle svgToPng
:svgToPng
org.apache.batik.transcoder.TranscoderException: null
Enclosed Exception:
Unable to transform src image
at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:132)
at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142)
at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)
at fr.avianey.androidsvgdrawable.SvgDrawablePlugin.transcode(SvgDrawablePlugin.java:434)
at fr.avianey.androidsvgdrawable.SvgDrawablePlugin.transcode(SvgDrawablePlugin.java:367)
at fr.avianey.androidsvgdrawable.SvgDrawablePlugin.execute(SvgDrawablePlugin.java:246)
at fr.avianey.androidsvgdrawable.gradle.SvgDrawableTask.svgToDrawable(SvgDrawableTask.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
[...]
org.apache.batik.transcoder.TranscoderException: null
Both messages are not helpful to the user.
Should ninepatch qualifiers contains all svg qualifiers or vice versa ?
Hi...Great plugin, this should be part of the android plugin!!
A suggestion for a new feature, it would be nice to be able to modify colours in the svg files when creating the icons.. For example, My icons need to be RGBA ffffffc8 which means they are impossible to see in Inkscape, so to edit I have to select all, change colour to black, and then back again..
If an option was possible, eg changeColor 0x00000000, 0xffffffc8 which would change all colours of the first to the second that would be even more awesome!
Thanks.
Anyone needs it ?
I have a project with multiple flavors and a main - most of the svg files live in main, but the main app icons are in each flavour
I create a configuration for each flavour and the main, but the plugin executes for all flavours not just the one being built..
Is there a way with this plugin to link each configuration to a flavour?
with ExecutorService
Maybe I'm missing something, but how do I create density specific png?
When you create png's usually you want to have at least 2 svg. One for mdpi and another for hdpi. This way images that have straight lines will not be blurry.
So here can be a few ways to create other densities from mdpi and hdpi files:
====== (1) ======
mdpi x1 -> mdpi
hdpi x1 -> hdpi
mdpi x2 -> xhdpi
mdpi x3 -> xxhdpi
or
====== (2) ======
mdpi x1 -> mdpi
hdpi x1 -> hdpi
mdpi x2 -> xhdpi
hdpi x2 -> xxhdpi
For now I just need to do (1) to avoid blurry image.
Right now if you use only
Stretch and content of size 1
Caused by: java.lang.IllegalArgumentException: 0.0 incompatible with org.apache.batik.transcoder.keys.LengthKey@37adabfc
at org.apache.batik.transcoder.TranscodingHints.put(TranscodingHints.java:92)
at org.apache.batik.transcoder.TranscoderSupport.addTranscodingHint(TranscoderSupport.java:58)
at fr.avianey.mojo.androidgendrawable.Gen.transcode(Gen.java:532)
at fr.avianey.mojo.androidgendrawable.Gen.transcode(Gen.java:501)
at fr.avianey.mojo.androidgendrawable.Gen.execute(Gen.java:371)
name-w36mdpi.svgmask
should generate name-(.*)-w36mdpi.svg
files but does generate name-(.*)-mdpi.svg
Allow to generate multiple time the same SVG with String variations provided by a property file
Something like :
task svgToFlavor1(type: fr.avianey.androidsvgdrawable.gradle.SvgDrawableTask) {
// specify where to pick SVG from
from = ['src/main/svg-flavor1', 'src/main/svg-flavor1-flavor2']
// ...
}
currently nothing is processed if from is empty but svgmask and masked resources defined
Most svg icons I download from internet have canvas size of about 512 pixels. Even if I specify xxxhdpi (which has factor of 4), the icon is still 128dp large, while icons on buttons normally have 24dp or so.
I know I can resize the icon in Inkscape, but this is cumbersome. Could it be possible to specify the scale factor manually, such as using "factor_6.4" in place of the density specifier?
when using to = file("path")
and no target density, it would be great to generate resources to path
without adding a -density
qualifier... USefull for RAW or PNG generation for using with LibGDX TexturePacker
Being able to generate resources when using
apply plugin: 'com.android.library'
On a 10x12 mdpi svg, setting 9patch config to :
"content" : {
"x" : [
[4, 5]
],
"y" : [
[4, 5]
]
}
Will draw only one pixel segment for x and y content area... When it should be a segment of two pixels (from 4 to 5)!
I get the following exception:
Caused by: java.lang.NullPointerException
at fr.avianey.androidsvgdrawable.SvgDrawablePlugin.execute(SvgDrawablePlugin.java:146)
at fr.avianey.androidsvgdrawable.gradle.SvgDrawableTask.svgToDrawable(SvgDrawableTask.java:67)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:579)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:562)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
... 47 more
I use the 1.0.2 version. Probably I did some configuration wrong (parameters seem to be null), but the error could be better.
Vector drawables are basically a subset of SVG, but on Android 5+ they can be used directly, instead of bitmaps. It would be nice if I could use this plugin to generate a couple of fallback bitmaps for the older Android versions.
The generated file from this SVG don't have the same dimensions ratio
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
x="0px"
y="0px"
width="512"
height="512"
id="svg378">
<metadata
id="metadata3014">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs380">
<clipPath
id="clipPath8018">
<rect
width="512"
height="512"
x="0"
y="0"
id="rect8020"
style="fill-opacity:0.67000002" />
</clipPath>
</defs>
<g
clip-path="url(#clipPath8018)"
id="flag"
style="fill-rule:evenodd">
<rect
width="730.16998"
height="512"
x="-610.60999"
y="-511.56"
transform="scale(-1,-1)"
id="rect149"
style="fill:#ffffff" />
<path
d="m 495.86,1148 a 163.79,163.79 0 1 1 -327.58,0 163.79,163.79 0 1 1 327.58,0 z"
transform="matrix(0.6869,0,0,0.6869,-88.735,-532.54)"
id="path607"
style="fill:#ffffff" />
<path
d="m 733.7,381.73 a 227.74,227.74 0 1 1 -455.48,0 227.74,227.74 0 1 1 455.48,0 z"
transform="matrix(0.63784,0,0,0.64461,-74.972,16.483)"
id="path635"
style="fill:#c70000" />
<rect
width="127.92"
height="26.201"
x="-127.97"
y="45.308998"
transform="matrix(0.65400174,-0.75649304,0.75649304,0.65400174,0,0)"
id="rect636"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="-127.97"
y="81.527"
transform="matrix(0.65400174,-0.75649304,0.75649304,0.65400174,0,0)"
id="rect637"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="-127.97"
y="45.308998"
transform="matrix(0.65400174,-0.75649304,0.75649304,0.65400174,0,0)"
id="rect638"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="-127.97"
y="45.308998"
transform="matrix(0.65400174,-0.75649304,0.75649304,0.65400174,0,0)"
id="rect639"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="-127.97"
y="118.52"
transform="matrix(0.65400174,-0.75649304,0.75649304,0.65400174,0,0)"
id="rect640"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="-127.97"
y="45.308998"
transform="matrix(0.65400174,-0.75649304,0.75649304,0.65400174,0,0)"
id="rect641"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="-127.97"
y="45.308998"
transform="matrix(0.65400174,-0.75649304,0.75649304,0.65400174,0,0)"
id="rect643"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="320.64999"
y="-330.34"
transform="matrix(0.64886,0.7609,-0.7609,0.64886,0,0)"
id="rect644"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="320.64999"
y="-257.13"
transform="matrix(0.64886,0.7609,-0.7609,0.64886,0,0)"
id="rect645"
style="stroke-width:1pt" />
<path
d="m 417.55,133.19 78.602,-67.814 14.641,16.953 -83.996,75.519 -9.2471,-24.659 z"
id="path649"
style="fill:#ffffff" />
<rect
width="125.1"
height="25.643999"
x="-42.832001"
y="-633.04999"
transform="matrix(-0.64282,0.76602,-0.76881,-0.63948,0,0)"
id="rect646"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="320.64999"
y="-294.12"
transform="matrix(0.64886,0.7609,-0.7609,0.64886,0,0)"
id="rect642"
style="stroke-width:1pt" />
<rect
width="125.1"
height="25.643999"
x="-42.832001"
y="-668.48999"
transform="matrix(-0.64282,0.76602,-0.76881,-0.63948,0,0)"
id="rect647"
style="stroke-width:1pt" />
<rect
width="125.1"
height="25.643999"
x="-42.832001"
y="-596.84003"
transform="matrix(-0.64282,0.76602,-0.76881,-0.63948,0,0)"
id="rect648"
style="stroke-width:1pt" />
<path
d="m 104.6,236.68 c 4.5919,36.974 11.297,78.175 68.199,82.455 21.328,1.2776 62.817,-5.0735 77.061,-63.19 18.688,-55.829 74.975,-71.88 113.28,-41.613 21.718,14.166 27.727,36.666 29.283,53.557 -1.7386,54.243 -32.874,101.2 -72.823,122.14 -45.93,27.3 -109.56,27.87 -165.3,-13.49 -25.12,-23.57 -60.219,-67.02 -49.7,-139.86 z"
id="path653"
style="fill:#3d5897" />
<path
d="m 435.91,370.59 78.734,67.661 -14.591,16.997 -87.156,-71.851 23.013,-12.807 z"
id="path654"
style="fill:#ffffff" />
<rect
width="127.92"
height="26.201"
x="270.57001"
y="233.21001"
transform="matrix(0.64886,0.7609,-0.7609,0.64886,0,0)"
id="rect658"
style="stroke-width:1pt" />
<path
d="m -16.188,437.25 78.602,-67.814 14.641,16.953 -83.996,75.519 -9.2471,-24.659 z"
id="path657"
style="fill:#ffffff;stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="270.57001"
y="196.99001"
transform="matrix(0.64886,0.7609,-0.7609,0.64886,0,0)"
id="rect655"
style="stroke-width:1pt" />
<rect
width="127.92"
height="26.201"
x="270.57001"
y="270.20001"
transform="matrix(0.64886,0.7609,-0.7609,0.64886,0,0)"
id="rect656"
style="stroke-width:1pt" />
</g>
</svg>
I would like to use the plugin to generate the images in the build directory. It's almost working but the output directory is not created by the plugin.
to
option to build/generated-sources/res
build.gradle
file:android.sourceSets {
main.res.srcDirs = ['src/main/res', 'build/generated-sources/res']
}
Then when I run the build with gradle, the image files are not created and I get a compilation error since the resource ids cannot be found. If I manually create the build/generated-sources/res
directory, the files are generated and the build completes without error.
Build fails under openjdk as JpegCodec class used by batik is not present in openjdk 1.7.
This is fixed on the Batik trunk.
force the viewport attribute on masked svg to match the computed bounding box :
<svg viewport="x y width height"
It would be a great idea to add an option that could enable us to convert SVG into WebP format.
Is this possible technically ? If yes I could step up and try to implement it and send a PR.
should be converted to canonical path
The Android Lint now shows a warning when putting bitmap in the densityless folder. It would be great when you can disable the fallbackDensity feature completely.
The plugin does not seem to work with the 2.0.0-alpha9 of the android gradle plugin.
When I use buildToolsVersion '23.0.2'
and classpath 'com.android.tools.build:gradle:2.0.0-alpha9'
I get errors like these:
Error:(47, 26) No resource found that matches the given name (at 'src' with value '@drawable/ic_my_icon').
My task definition looks like this:
final String generatedResourcesDir = 'src/main/res-generated'
task svgToPng(type: SvgDrawableTask) {
from = files('src/main/svg-png')
to = file(generatedResourcesDir)
createMissingDirectories = true
overwriteMode = 'always'
targetedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi', 'xxxhdpi']
outputFormat = 'PNG'
}
clean.doFirst {
delete fileTree(dir: generatedResourcesDir, include: '**/*.png').getFiles()
}
The error can be reproduced using the current canary version of Android Studio 2.0.
This SVG creates just a transparent image โ I'd expect a grey600 'H' and a grey600 circle around it. I cross-tested generation with batik-rasterizer.jar 1.7.1 and 1.8 โ both render the SVG as expected.
FWIW, the filename is "ic_oeffi_stations_grey600_36dp-hdpi.svg".
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="72px" height="72px" viewBox="-32 -32 1088 1088">
<!-- background -->
<path
d="M 512,512 m -464,0 a 464,464 0 1,0 928,0 a 464,464 0 1,0 -928,0
M 512,512 m -368,0 a 368,368 0 1,1 736,0 a 368,368 0 1,1 -736,0"
fill="#757575" />
<!-- H -->
<path d="M 370,760 v -500 m 0,240 h 280 m 0,260 v -500" style="fill:none;stroke:#757575;stroke-width:96" />
</svg>
Error:Execution failed for task ':app:lint'.
com.google.common.io.Files.newOutputStreamSupplier(Ljava/io/File;)Lcom/google/common/io/OutputSupplier;
This is my first try at the plugin, trying to create a 9patch which is an underline for a text header..
The plugin is crashing with a null pointer error.
My 9patch.json is
[
{
"name" : "header_underline",
"stretch" : {
"x" : [
[0, 13],
],
"y" : [
[0, 63]
]
},
"content" : {
"x" : [
[0,13]
],
"y" : [
[64, 65]
]
}
}
]
the header_underline-xhdpi.svg is
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="14"
height="66"
id="svg2"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="header_underline-xhdpi.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="12.939394"
inkscape:cx="-6.0222482"
inkscape:cy="33"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-page="true"
inkscape:window-width="1920"
inkscape:window-height="1031"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-750.14288,-756.50507)">
<path
style="stroke:#ff00ff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none"
d="m 751.33599,821.50507 c 6.7848,0 5.16639,0 11.9512,0"
id="path3052"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
</svg>
What am I doing wrong?
Allow the use of .svgmask files that will be used to generate other .svg files.
something-mdpi.svgmask :
<image x="10" y="20" width="80" height="80" xlink:href="${pattern}" />
where ${pattern} is a regexp pointing to .svg files to use as a reference...
If you rename an input SVG image, it will remain in the to
folder. This will not reveal omitted references, until you clean the project. The plugin should delete all outstanding files in the to
directory, that have no counterpart in the from
directory.
For backward compatibility, the feature should be turned on with a parameter and be off by default.
task svgToPng(type: fr.avianey.androidsvgdrawable.gradle.SvgDrawableTask) {
from = files('graphics')
to = file('res')
targetedDensities = ['hdpi', 'xhdpi', 'xxhdpi']
outputFormat = 'PNG'
outputType = 'mipmap'
}
My graphics
folder contains three files:
graphics/ic_oeffi_directions_color_48dp-mdpi.svg
graphics/ic_oeffi_plans_color_48dp-mdpi.svg
graphics/ic_oeffi_stations_color_48dp-mdpi.svg
I removed all of the generated images. Then ran
$ gradle svgToPng
Incremental java compilation is an incubating feature.
:oeffi:svgToPng UP-TO-DATE
BUILD SUCCESSFUL
And if I try to build my whole project the launcher icons are missing and the build fails. I assume that's a bug in the plugin. When I try to switch res
to res2
it generates the images there no prob.
More info:
$ gradle --version
------------------------------------------------------------
Gradle 2.10
------------------------------------------------------------
Build time: 2016-01-26 15:17:49 UTC
Build number: none
Revision: UNKNOWN
Groovy: 2.4.5
Ant: Apache Ant(TM) version 1.9.6 compiled on July 8 2015
JVM: 1.8.0_91 (Oracle Corporation 25.91-b14)
OS: Linux 4.4.0-31-generic amd64
Configured
android{
sourceSets{
main.res.srcDirs = [main.res.srcDirs,"build/generated/res/main"]
}
}
// create a task to convert SVG to PNG
task svgToPng(type: SvgDrawableTask) {
from = file('src/main/svg-png')
// specify the android res folder
to = file('build/generated/res/main')
// create qualified directories if missing
createMissingDirectories = true
// override files only if necessary
overrideMode = 'ifModified'
// the /res/drawable directory will contains mdpi resources
// fallbackDensity = 'mdpi'
// let generate PNG for the following densities only
targetedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi']
// relative path of the file specifying nine patch specs
ninePatchConfig = file('src/main/svg-png/9patch.json')
// output format of the generated resources
outputFormat = 'PNG'
to.mkdirs()
}
When a release build is done (i do this in jenkins ci) I add clean as the first task, the png files are generated under the correct directory, then at some stage further down the build the directories are cleared, then the build fails as it cant find the drawables.
I couldn't find the task that was doing this, removing the "clean" stopped the files from being cleared.
This is probably not an issue associated with the androidsvgdrawable-plugin, but with an extension for inkscape (https://github.com/ray-hplus/inkscape-animation). Several layer in a single svg-file are batch exported into separate svg-files. In principle everything looks fine, but somehow the androidsvgdrawable-plugin does not create the desired pngs. The problem can be fixed by saving each svg individually, yet for long animations this is quite bothersome. I don't know what is wrong with the batch created svg-files, in order to fix the extension for inkscape.
I attached two svgs. If someone has the insight and time to check this issue, that would be really great. Thanks a lot.
When targeted final resources in /res folder are absent and svgmask, mask svg and svg masked resources exists and are up to date, the final resources are not re-generated. It's necessary to check if the final resource exists and is up to date!
When a style attribute contain a vendor specific style, batik fails to evaluate properly the entire style attribute :
<path
inkscape:connector-curvature="0"
id="path2990-2"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:awards;-inkscape-font-specification:awards;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
d="m -558.64901,514.55271 c -0.79754,3e-5 -1.48114,0.28487 -2.05078,0.85449 -0.56967,0.56969 -0.85451,1.25329 -0.8545,2.05078 l 0,7.31446 c -10e-6,1.02541 0.36457,1.8913 1.09375,2.59765 l 3.17872,3.17871 c -1.11656,1.02541 -1.98814,2.23309 -2.61476,3.62305 -0.62663,1.38998 -0.93994,2.8711 -0.93993,4.44336 -10e-6,3.00781 1.07095,5.58269 3.21289,7.72461 2.14191,2.14192 4.71677,3.21289 7.72461,3.21289 3.00779,0 5.58265,-1.07097 7.72461,-3.21289 2.14189,-2.14192 3.21286,-4.7168 3.21289,-7.72461 -3e-5,-1.57226 -0.31335,-3.05338 -0.93995,-4.44336 -0.62665,-1.38996 -1.49823,-2.59764 -2.61474,-3.62305 l 3.17871,-3.17871 c 0.72914,-0.70635 1.09372,-1.57224 1.09375,-2.59765 l 0,-7.31446 c -3e-5,-0.79749 -0.28486,-1.48109 -0.85449,-2.05078 -0.56969,-0.56962 -1.25328,-0.85446 -2.05078,-0.85449 z m 8.20312,18.62793 c 0.0911,-0.27343 0.27342,-0.41015 0.54688,-0.41016 0.27341,10e-6 0.45571,0.13673 0.54687,0.41016 l 1.33301,3.24707 3.38379,0 c 0.15948,10e-6 0.2962,0.0684 0.41016,0.20508 0.1139,0.13673 0.17086,0.27345 0.17089,0.41015 -3e-5,0.20509 -0.0797,0.35321 -0.23925,0.44434 l -2.8711,1.94824 c 0.61522,2.30144 0.93422,3.48633 0.95704,3.55469 0.0227,0.0456 0.0341,0.10248 0.0341,0.1709 -2e-5,0.15951 -0.057,0.29053 -0.1709,0.39306 -0.11396,0.10259 -0.25067,0.15381 -0.41015,0.15381 -0.13675,0 -0.25068,-0.0456 -0.3418,-0.13672 l -2.80274,-2.15332 -2.80273,2.15332 c -0.0911,0.0911 -0.2051,0.13672 -0.3418,0.13672 -0.15952,0 -0.29624,-0.0513 -0.41015,-0.15381 -0.11395,-0.10248 -0.17092,-0.23355 -0.1709,-0.39306 -2e-5,-0.0684 0.0114,-0.12532 0.0341,-0.1709 0.63801,-2.23307 0.95701,-3.40657 0.95703,-3.52051 l -2.87109,-1.98242 c -0.15952,-0.0911 -0.23927,-0.23925 -0.23926,-0.44434 -1e-5,-0.1367 0.057,-0.27342 0.1709,-0.41015 0.11391,-0.13671 0.25063,-0.20507 0.41016,-0.20508 l 3.38379,0 1.333,-3.24707 z m -4.5459,-13.53516 0,5.12696 c -2e-5,0.38739 -0.14242,0.72349 -0.42725,1.00829 -0.28484,0.28486 -0.63233,0.42727 -1.04247,0.42725 -0.41017,2e-5 -0.75766,-0.14239 -1.04249,-0.42725 -0.28483,-0.2848 -0.42725,-0.6209 -0.42724,-1.00829 l 0,-5.12696 c -10e-6,-0.38734 0.14241,-0.72344 0.42724,-1.0083 0.28483,-0.28481 0.63232,-0.42721 1.04249,-0.42724 0.41014,3e-5 0.75763,0.14243 1.04247,0.42724 0.28483,0.28486 0.42723,0.62096 0.42725,1.0083 z m 6.56251,0 0,6.5625 c -3e-5,0.41018 -0.14244,0.75768 -0.42726,1.04248 -0.28484,0.28485 -0.63234,0.42727 -1.04247,0.42725 -0.41018,2e-5 -0.75767,-0.1424 -1.04249,-0.42725 -0.28484,-0.2848 -0.42726,-0.6323 -0.42724,-1.04248 l 0,-6.5625 c -2e-5,-0.38734 0.1424,-0.72344 0.42724,-1.0083 0.28482,-0.28481 0.63231,-0.42721 1.04249,-0.42724 0.41013,3e-5 0.75763,0.14243 1.04247,0.42724 0.28482,0.28486 0.42723,0.62096 0.42726,1.0083 z m 6.5625,0 0,5.12696 c -4e-5,0.38739 -0.14245,0.72349 -0.42726,1.00829 -0.28485,0.28486 -0.63235,0.42727 -1.04247,0.42725 -0.41019,2e-5 -0.75768,-0.14239 -1.04249,-0.42725 -0.28485,-0.2848 -0.42726,-0.6209 -0.42724,-1.00829 l 0,-5.12696 c -2e-5,-0.38734 0.14239,-0.72344 0.42724,-1.0083 0.28481,-0.28481 0.6323,-0.42721 1.04249,-0.42724 0.41012,3e-5 0.75762,0.14243 1.04247,0.42724 0.28481,0.28486 0.42722,0.62096 0.42726,1.0083 z" />
The -inkscape-font-specification:awards
prevents the fill color to be applied...
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.