diff --git a/.classpath b/.classpath
index edb8ddf..cd780e3 100644
--- a/.classpath
+++ b/.classpath
@@ -5,6 +5,7 @@
+
diff --git a/resources/resources/esvg/fonts/FreeMono.svg b/resources/resources/esvg/fonts/FreeMono.svg
new file mode 100644
index 0000000..88c79e9
--- /dev/null
+++ b/resources/resources/esvg/fonts/FreeMono.svg
@@ -0,0 +1,9874 @@
+
+
+
diff --git a/resources/resources/esvg/fonts/FreeMonoBold.svg b/resources/resources/esvg/fonts/FreeMonoBold.svg
new file mode 100644
index 0000000..e8009c3
--- /dev/null
+++ b/resources/resources/esvg/fonts/FreeMonoBold.svg
@@ -0,0 +1,5443 @@
+
+
+
diff --git a/resources/resources/esvg/fonts/FreeMonoBoldOblique.svg b/resources/resources/esvg/fonts/FreeMonoBoldOblique.svg
new file mode 100644
index 0000000..e1dd340
--- /dev/null
+++ b/resources/resources/esvg/fonts/FreeMonoBoldOblique.svg
@@ -0,0 +1,5198 @@
+
+
+
diff --git a/resources/resources/esvg/fonts/FreeMonoOblique.svg b/resources/resources/esvg/fonts/FreeMonoOblique.svg
new file mode 100644
index 0000000..ba8f4bc
--- /dev/null
+++ b/resources/resources/esvg/fonts/FreeMonoOblique.svg
@@ -0,0 +1,6389 @@
+
+
+
diff --git a/resources/resources/esvg/fonts/FreeSans.svg b/resources/resources/esvg/fonts/FreeSans.svg
new file mode 100644
index 0000000..efdc01e
--- /dev/null
+++ b/resources/resources/esvg/fonts/FreeSans.svg
@@ -0,0 +1,15542 @@
+
+
+
diff --git a/resources/resources/esvg/fonts/FreeSansBold.svg b/resources/resources/esvg/fonts/FreeSansBold.svg
new file mode 100644
index 0000000..d16c8bd
--- /dev/null
+++ b/resources/resources/esvg/fonts/FreeSansBold.svg
@@ -0,0 +1,8052 @@
+
+
+
diff --git a/resources/resources/esvg/fonts/FreeSansBoldOblique.svg b/resources/resources/esvg/fonts/FreeSansBoldOblique.svg
new file mode 100644
index 0000000..842491c
--- /dev/null
+++ b/resources/resources/esvg/fonts/FreeSansBoldOblique.svg
@@ -0,0 +1,7236 @@
+
+
+
diff --git a/resources/resources/esvg/fonts/FreeSansOblique.svg b/resources/resources/esvg/fonts/FreeSansOblique.svg
new file mode 100644
index 0000000..8b8c84d
--- /dev/null
+++ b/resources/resources/esvg/fonts/FreeSansOblique.svg
@@ -0,0 +1,9376 @@
+
+
+
diff --git a/resources/resources/esvg/fonts/FreeSherif.svg b/resources/resources/esvg/fonts/FreeSherif.svg
new file mode 100644
index 0000000..9f717de
--- /dev/null
+++ b/resources/resources/esvg/fonts/FreeSherif.svg
@@ -0,0 +1,34749 @@
+
+
+
diff --git a/src/module-info.java b/src/module-info.java
index 0a072de..37964fd 100644
--- a/src/module-info.java
+++ b/src/module-info.java
@@ -4,6 +4,7 @@
open module org.atriasoft.esvg {
exports org.atriasoft.esvg;
+ exports org.atriasoft.esvg.font;
exports org.atriasoft.esvg.render;
requires transitive io.scenarium.logger;
diff --git a/src/org/atriasoft/esvg/Esvg.java b/src/org/atriasoft/esvg/Esvg.java
new file mode 100644
index 0000000..29be7af
--- /dev/null
+++ b/src/org/atriasoft/esvg/Esvg.java
@@ -0,0 +1,11 @@
+package org.atriasoft.esvg;
+
+import org.atriasoft.etk.Uri;
+
+public class Esvg {
+ public static void init() {
+ Uri.addLibrary("esvg", Esvg.class, "/resources/esvg/");
+ }
+
+ private Esvg() {}
+}
diff --git a/src/org/atriasoft/esvg/EsvgDocument.java b/src/org/atriasoft/esvg/EsvgDocument.java
index bd6a7f9..3ea8748 100644
--- a/src/org/atriasoft/esvg/EsvgDocument.java
+++ b/src/org/atriasoft/esvg/EsvgDocument.java
@@ -368,6 +368,32 @@ public class EsvgDocument extends Base {
return true;
}
+ /*
+ public float[][] renderImageFloat(final Vector2i size) {
+ return renderImageFloat(size, false);
+ }
+
+ public float[][] renderImageFloat(Vector2i size, final boolean visualDebug) {
+ if (size == null) {
+ size = new Vector2i((int) this.size.x(), (int) this.size.y());
+ } else {
+ if (size.x() <= 0) {
+ size = size.withX((int) this.size.x());
+ }
+ if (size.y() <= 0) {
+ size = size.withY((int) this.size.y());
+ }
+ }
+ Log.debug("Generate size " + size);
+ Renderer renderedElement = new Renderer(size, this, visualDebug);
+ // create the first element matrix modification ...
+ Matrix2x3f basicTrans = Matrix2x3f.IDENTITY.multiply(Matrix2x3f.createScale(new Vector2f(size.x() / this.size.x(), size.y() / this.size.y())));
+ draw(renderedElement, basicTrans);
+
+ // direct return the generated data ...
+ return renderedElement.getData();
+ }
+ */
/**
* Generate Image in a specific format.
* @param size Size expected of the rendered image (value <=0 if it need to be automatic.) return the size generate
diff --git a/src/org/atriasoft/esvg/EsvgFont.java b/src/org/atriasoft/esvg/EsvgFont.java
new file mode 100644
index 0000000..cc07f39
--- /dev/null
+++ b/src/org/atriasoft/esvg/EsvgFont.java
@@ -0,0 +1,280 @@
+package org.atriasoft.esvg;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+
+import org.atriasoft.esvg.font.Glyph;
+import org.atriasoft.esvg.font.Kerning;
+import org.atriasoft.esvg.internal.Log;
+import org.atriasoft.esvg.render.PathModel;
+import org.atriasoft.esvg.render.RenderingConfig;
+import org.atriasoft.esvg.render.Weight;
+import org.atriasoft.etk.Uri;
+import org.atriasoft.etk.math.Matrix2x3f;
+import org.atriasoft.etk.math.Vector2f;
+import org.atriasoft.etk.math.Vector2i;
+import org.atriasoft.etk.util.Pair;
+import org.atriasoft.exml.Exml;
+import org.atriasoft.exml.exception.ExmlBuilderException;
+import org.atriasoft.exml.model.XmlElement;
+import org.atriasoft.exml.model.XmlNode;
+
+// https://www.w3.org/TR/SVGTiny12/fonts.html
+
+public class EsvgFont {
+
+ /**
+ * Load the file that might contain the svg
+ * @param uri File of the svg
+ * @return false : An error occured
+ * @return true : Parsing is OK
+ */
+ public static EsvgFont load(final Uri uri) {
+ EsvgFont font = new EsvgFont();
+ XmlNode doc = null;
+ try {
+ doc = Exml.parse(uri);
+ } catch (ExmlBuilderException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ return null;
+ }
+ if (!(doc instanceof XmlElement root)) {
+ Log.error("can not load the SVG font ==> wrong root node");
+ return null;
+ }
+ if (!root.existNode("svg") || !(root.getNodeNoExcept("svg") instanceof XmlElement svgNode)) {
+ Log.error("can not load Node