Unverified Commit 030fea30 authored by Nikolay Igotti's avatar Nikolay Igotti Committed by GitHub

Fix SVG rendering. (#238)

parent 8cde16e1
......@@ -41,16 +41,14 @@ class SVGDOM internal constructor(ptr: NativePointer) : RefCnt(ptr) {
reachabilityBarrier(this)
}
fun setContainerSize(width: Float, height: Float): SVGDOM {
fun setContainerSize(width: Float, height: Float) {
Stats.onNativeCall()
SVGDOM_nSetContainerSize(_ptr, width, height)
return this
}
fun setContainerSize(size: Point): SVGDOM {
fun setContainerSize(size: Point) {
Stats.onNativeCall()
SVGDOM_nSetContainerSize(_ptr, size.x, size.y)
return this
}
// sk_sp<SkSVGNode>* findNodeById(const char* id);
......@@ -65,7 +63,6 @@ class SVGDOM internal constructor(ptr: NativePointer) : RefCnt(ptr) {
}
}
@ExternalSymbolName("org_jetbrains_skia_svg_SVGDOM__1nMakeFromData")
private external fun SVGDOM_nMakeFromData(dataPtr: NativePointer): NativePointer
......
......@@ -6,27 +6,18 @@ class SVGLength(val value: Float, val unit: SVGLengthUnit) {
constructor(value: Float) : this(value, SVGLengthUnit.NUMBER) {}
override fun equals(o: Any?): Boolean {
if (o === this) return true
if (o !is SVGLength) return false
val other = o
if (!other.canEqual(this as Any)) return false
override fun equals(other: Any?): Boolean {
if (other === this) return true
if (other !is SVGLength) return false
if (value.compareTo(other.value) != 0) return false
val `this$_unit`: Any = unit
val `other$_unit`: Any = other.unit
return `this$_unit` == `other$_unit`
}
protected fun canEqual(other: Any?): Boolean {
return other is SVGLength
return unit == other.unit
}
override fun hashCode(): Int {
val PRIME = 59
var result = 1
result = result * PRIME + value.toBits()
val `$_unit`: Any = unit
result = result * PRIME + (`$_unit`.hashCode())
result = result * PRIME + unit.hashCode()
return result
}
......
......@@ -10,26 +10,20 @@ class SVGPreserveAspectRatio(align: SVGPreserveAspectRatioAlign, scale: SVGPrese
SVGPreserveAspectRatioScale.values()[scale]
)
constructor() : this(SVGPreserveAspectRatioAlign.XMID_YMID, SVGPreserveAspectRatioScale.MEET) {}
constructor(align: SVGPreserveAspectRatioAlign) : this(align, SVGPreserveAspectRatioScale.MEET) {}
constructor(scale: SVGPreserveAspectRatioScale) : this(SVGPreserveAspectRatioAlign.XMID_YMID, scale) {}
constructor() : this(SVGPreserveAspectRatioAlign.XMID_YMID, SVGPreserveAspectRatioScale.MEET)
constructor(align: SVGPreserveAspectRatioAlign) : this(align, SVGPreserveAspectRatioScale.MEET)
constructor(scale: SVGPreserveAspectRatioScale) : this(SVGPreserveAspectRatioAlign.XMID_YMID, scale)
val align: SVGPreserveAspectRatioAlign
get() = _align
val scale: SVGPreserveAspectRatioScale
get() = _scale
override fun equals(o: Any?): Boolean {
if (o === this) return true
if (o !is SVGPreserveAspectRatio) return false
val other = o
if (!other.canEqual(this as Any)) return false
val `this$_align`: Any = align
val `other$_align`: Any = other.align
if (`this$_align` != `other$_align`) return false
val `this$_scale`: Any = scale
val `other$_scale`: Any = other.scale
return `this$_scale` == `other$_scale`
override fun equals(other: Any?): Boolean {
if (other === this) return true
if (other !is SVGPreserveAspectRatio) return false
if (align != other.align) return false
return scale == other.scale
}
protected fun canEqual(other: Any?): Boolean {
......@@ -39,10 +33,8 @@ class SVGPreserveAspectRatio(align: SVGPreserveAspectRatioAlign, scale: SVGPrese
override fun hashCode(): Int {
val PRIME = 59
var result = 1
val `$_align`: Any = align
result = result * PRIME + (`$_align`.hashCode())
val `$_scale`: Any = scale
result = result * PRIME + (`$_scale`.hashCode())
result = result * PRIME + align.hashCode()
result = result * PRIME + scale.hashCode()
return result
}
......
......@@ -6,7 +6,7 @@
#include "SkSVGDOM.h"
#include "SkSVGSVG.h"
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_nMakeFromData
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_1nMakeFromData
(JNIEnv* env, jclass jclass, jlong dataPtr) {
SkData* data = reinterpret_cast<SkData*>(static_cast<uintptr_t>(dataPtr));
SkMemoryStream stream(sk_ref_sp(data));
......@@ -14,7 +14,7 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_n
return reinterpret_cast<jlong>(instance.release());
}
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_nGetRoot
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_1nGetRoot
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSVGDOM* instance = reinterpret_cast<SkSVGDOM*>(static_cast<uintptr_t>(ptr));
SkSVGSVG* root = instance->getRoot();
......@@ -22,20 +22,20 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_n
return reinterpret_cast<jlong>(root);
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_nGetContainerSize
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_1nGetContainerSize
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSVGDOM* instance = reinterpret_cast<SkSVGDOM*>(static_cast<uintptr_t>(ptr));
const SkSize& size = instance->containerSize();
return skija::Point::make(env, size.fWidth, size.fHeight);
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt__1nSetContainerSize
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_1nSetContainerSize
(JNIEnv* env, jclass jclass, jlong ptr, jfloat width, jfloat height) {
SkSVGDOM* instance = reinterpret_cast<SkSVGDOM*>(static_cast<uintptr_t>(ptr));
instance->setContainerSize(SkSize{width, height});
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_nRender
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGDOMKt_SVGDOM_1nRender
(JNIEnv* env, jclass jclass, jlong ptr, jlong canvasPtr) {
SkSVGDOM* instance = reinterpret_cast<SkSVGDOM*>(static_cast<uintptr_t>(ptr));
SkCanvas* canvas = reinterpret_cast<SkCanvas*>(static_cast<uintptr_t>(canvasPtr));
......
......@@ -2,7 +2,7 @@
#include "../interop.hh"
#include "SkSVGNode.h"
extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_svg_SVGNodeKt_SVGNode_nGetTag
extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_svg_SVGNodeKt_SVGNode_1nGetTag
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSVGNode* instance = reinterpret_cast<SkSVGNode*>(static_cast<uintptr_t>(ptr));
return static_cast<jint>(instance->tag());
......
......@@ -4,44 +4,44 @@
#include "SkSVGSVG.h"
#include "SkSVGRenderContext.h"
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nGetX
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nGetX
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
return skija::svg::SVGLength::toJava(env, instance->getX());
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nGetY
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nGetY
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
return skija::svg::SVGLength::toJava(env, instance->getY());
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nGetWidth
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nGetWidth
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
return skija::svg::SVGLength::toJava(env, instance->getWidth());
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nGetHeight
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nGetHeight
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
return skija::svg::SVGLength::toJava(env, instance->getHeight());
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nGetPreserveAspectRatio
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nGetPreserveAspectRatio
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
return skija::svg::SVGPreserveAspectRatio::toJava(env, instance->getPreserveAspectRatio());
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nGetViewBox
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nGetViewBox
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
SkTLazy<SkSVGViewBoxType> viewBox = instance->getViewBox();
return viewBox.isValid() ? skija::Rect::fromSkRect(env, *viewBox.get()) : nullptr;
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nGetIntrinsicSize
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nGetIntrinsicSize
(JNIEnv* env, jclass jclass, jlong ptr, float width, float height, float dpi) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
SkSVGLengthContext lc({width, height}, dpi);
......@@ -49,42 +49,42 @@ extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG
return skija::Point::fromSkPoint(env, {size.width(), size.height()});
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nSetX
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nSetX
(JNIEnv* env, jclass jclass, jlong ptr, float value, int unit) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
SkSVGLength lenght(value, static_cast<SkSVGLength::Unit>(unit));
instance->setX(lenght);
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nSetY
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nSetY
(JNIEnv* env, jclass jclass, jlong ptr, float value, int unit) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
SkSVGLength lenght(value, static_cast<SkSVGLength::Unit>(unit));
instance->setY(lenght);
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nSetWidth
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nSetWidth
(JNIEnv* env, jclass jclass, jlong ptr, float value, int unit) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
SkSVGLength lenght(value, static_cast<SkSVGLength::Unit>(unit));
instance->setWidth(lenght);
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nSetHeight
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nSetHeight
(JNIEnv* env, jclass jclass, jlong ptr, float value, int unit) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
SkSVGLength lenght(value, static_cast<SkSVGLength::Unit>(unit));
instance->setHeight(lenght);
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nSetPreserveAspectRatio
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nSetPreserveAspectRatio
(JNIEnv* env, jclass jclass, jlong ptr, jint align, jint scale) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
instance->setPreserveAspectRatio(SkSVGPreserveAspectRatio { static_cast<SkSVGPreserveAspectRatio::Align>(align),
static_cast<SkSVGPreserveAspectRatio::Scale>(scale) });
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_nSetViewBox
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_svg_SVGSVGKt_SVGSVG_1nSetViewBox
(JNIEnv* env, jclass jclass, jlong ptr, float l, float t, float r, float b) {
SkSVGSVG* instance = reinterpret_cast<SkSVGSVG*>(static_cast<uintptr_t>(ptr));
instance->setViewBox(SkRect::MakeLTRB(l, t, r, b));
......
package org.jetbrains.skiko
import org.jetbrains.skia.Color4f
import org.jetbrains.skia.ColorFilter
import org.jetbrains.skia.ColorSpace
import org.jetbrains.skia.*
import org.jetbrains.skia.svg.SVGDOM
import org.jetbrains.skia.svg.SVGLengthContext
import org.jetbrains.skia.svg.SVGLengthUnit
import org.jetbrains.skia.svg.SVGTag
import org.junit.Test
class SkiaTest {
......@@ -19,4 +21,37 @@ class SkiaTest {
val table = ColorFilter.makeTableARGB(array, array, array, array)
assert(table._ptr != 0L)
}
@Test
fun `svg smoke`() {
val svgText = """
<svg version="1.1"
width="300" height="200"
xmlns="http://www.w3.org/2000/svg">
<rect width="100%" height="100%" fill="red" />
<circle cx="150" cy="100" r="80" fill="green" />
<text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text>
</svg>
""".trimIndent()
val data = Data.makeFromBytes(svgText.encodeToByteArray())
val dom = SVGDOM(data)
assert(!dom.isClosed)
dom.setContainerSize(Point(100f, 100f))
dom.setContainerSize(101f, 101f)
assert(dom.root != null)
val e = dom.root!!
assert(e.x.unit == SVGLengthUnit.NUMBER)
assert(e.y.unit == SVGLengthUnit.NUMBER)
assert(e.width.unit == SVGLengthUnit.NUMBER)
assert(e.height.unit == SVGLengthUnit.NUMBER)
assert(e.viewBox == null)
assert(e.tag == SVGTag.SVG)
// e.viewBox = Rect(0f, 1f, 100f, 200f)
// assert(e.viewBox!!.top == 1f)
assert(e.getIntrinsicSize(SVGLengthContext(100f, 100f)).x == 300f)
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment