diff --git a/examples/clojure/README.md b/examples/clojure/README.md index 614ad2b7..8f10c4f2 100644 --- a/examples/clojure/README.md +++ b/examples/clojure/README.md @@ -1,24 +1,39 @@ -## About: Demonstration of Skija APIs from Clojure. -## Pre-requisite: +## Pre-requisite - JDK 11 - Clojure 1.10.1 - `clojure` command-line tool 1.10.1.727 or later -## Up & Running: +## Configuring Skija dependency + +Clojure example requires latest master build of Skija installed locally: + +```sh +./script/install.sh +``` + +If you want to use pre-built Skija, in `deps.edn` replace `org.jetbrains.skija/skija-native {:mvn/version "0.0.0-SNAPSHOT"}` with one of: + +Artifact ID | `mvn/version` +--------------------|------------- +`skija-macos` | ![version](https://img.shields.io/badge/dynamic/xml?style=flat-square&label=latest&color=success&url=https%3A%2F%2Fpackages.jetbrains.team%2Fmaven%2Fp%2Fskija%2Fmaven%2Forg%2Fjetbrains%2Fskija%2Fskija-macos%2Fmaven-metadata.xml&query=//release) +`skija-linux` | ![version](https://img.shields.io/badge/dynamic/xml?style=flat-square&label=latest&color=success&url=https%3A%2F%2Fpackages.jetbrains.team%2Fmaven%2Fp%2Fskija%2Fmaven%2Forg%2Fjetbrains%2Fskija%2Fskija-linux%2Fmaven-metadata.xml&query=//release) +`skija-windows` | ![version](https://img.shields.io/badge/dynamic/xml?style=flat-square&label=latest&color=success&url=https%3A%2F%2Fpackages.jetbrains.team%2Fmaven%2Fp%2Fskija%2Fmaven%2Forg%2Fjetbrains%2Fskija%2Fskija-windows%2Fmaven-metadata.xml&query=//release) + +## Running From CLI run the below command: Windows/Linux: -``` +```sh clj -M -m lwjgl.main ``` macOS: -``` +```sh clj -J-XstartOnFirstThread -M -m lwjgl.main ``` diff --git a/examples/clojure/deps.edn b/examples/clojure/deps.edn index 3d65902c..75558550 100644 --- a/examples/clojure/deps.edn +++ b/examples/clojure/deps.edn @@ -1,8 +1,9 @@ -{:deps {org.jetbrains.skija/skija-macos {:mvn/version "0.6.6"} +{:deps {org.jetbrains.skija/skija-native {:mvn/version "0.0.0-SNAPSHOT"} org.lwjgl/lwjgl {:mvn/version "3.2.3"} org.lwjgl/lwjgl$natives-macos {:mvn/version "3.2.3"} org.lwjgl/lwjgl-glfw {:mvn/version "3.2.3"} org.lwjgl/lwjgl-glfw$natives-macos {:mvn/version "3.2.3"} org.lwjgl/lwjgl-opengl {:mvn/version "3.2.3"} - org.lwjgl/lwjgl-opengl$natives-macos {:mvn/version "3.2.3"}} + org.lwjgl/lwjgl-opengl$natives-macos {:mvn/version "3.2.3"} + nrepl/nrepl {:mvn/version "0.8.3"}} :mvn/repos {"space-maven" {:url "https://packages.jetbrains.team/maven/p/skija/maven"}}} \ No newline at end of file diff --git a/examples/clojure/src/lwjgl/main.clj b/examples/clojure/src/lwjgl/main.clj index 2c60566c..b7b2088e 100644 --- a/examples/clojure/src/lwjgl/main.clj +++ b/examples/clojure/src/lwjgl/main.clj @@ -1,4 +1,6 @@ (ns lwjgl.main + (:require + [nrepl.server :as nrepl]) (:import [org.jetbrains.skija BackendRenderTarget Canvas ColorSpace DirectContext FramebufferFormat Paint Rect Surface SurfaceColorFormat SurfaceOrigin] [org.lwjgl.glfw GLFW] @@ -10,14 +12,13 @@ (defn color [^long l] (.intValue (Long/valueOf l))) +(def *rect-color (atom (color 0xFFCC3333))) + (defn draw [^Canvas canvas] - (.clear canvas (color 0xFFFFFFFF)) - (let [layer (.save canvas) - paint (doto (Paint.) (.setColor (color 0xFFCC3333)))] + (let [paint (doto (Paint.) (.setColor @*rect-color))] (.translate canvas 320 240) (.rotate canvas (mod (/ (System/currentTimeMillis) 10) 360)) - (.drawRect canvas (Rect/makeXYWH -50 -50 100 100) paint) - (.restoreToCount canvas layer))) + (.drawRect canvas (Rect/makeXYWH -50 -50 100 100) paint))) (defn -main [& args] (GLFW/glfwInit) @@ -31,6 +32,12 @@ (GLFW/glfwShowWindow window) (GL/createCapabilities) + (doto (Thread. #(clojure.main/main)) + (.start)) + + (nrepl/start-server :port 7888) + (println "nREPL server started at locahost:7888") + (let [context (DirectContext/makeGL) fb-id (GL11/glGetInteger 0x8CA6) target (BackendRenderTarget/makeGL width height 0 8 fb-id FramebufferFormat/GR_GL_RGBA8) @@ -38,10 +45,14 @@ canvas (.getCanvas surface)] (loop [] (when (not (GLFW/glfwWindowShouldClose window)) - (draw canvas) - + (.clear canvas (color 0xFFFFFFFF)) + (let [layer (.save canvas)] + (draw canvas) + (.restoreToCount canvas layer)) (.flush context) (GLFW/glfwSwapBuffers window) (GLFW/glfwPollEvents) - (recur))) - ))) + (recur)))))) + +(comment + (reset! lwjgl.main/*rect-color (lwjgl.main/color 0xFF33CC33))) \ No newline at end of file diff --git a/examples/lwjgl/README.md b/examples/lwjgl/README.md index 899a3a72..0370a00e 100644 --- a/examples/lwjgl/README.md +++ b/examples/lwjgl/README.md @@ -1,14 +1,26 @@ This demo displays most of the Skia/Skija APIs and is an excellent learning resource. +## Configuring Skija dependency + LWJGL example requires latest master build of Skija installed locally: ```sh ./script/install.sh ``` +Alternatively, you can use pre-built Skija. In `pom.xml` replace skija-native dependency with: + +`` | `` +--------------------|------------- +`skija-macos` | ![version](https://img.shields.io/badge/dynamic/xml?style=flat-square&label=latest&color=success&url=https%3A%2F%2Fpackages.jetbrains.team%2Fmaven%2Fp%2Fskija%2Fmaven%2Forg%2Fjetbrains%2Fskija%2Fskija-macos%2Fmaven-metadata.xml&query=//release) +`skija-linux` | ![version](https://img.shields.io/badge/dynamic/xml?style=flat-square&label=latest&color=success&url=https%3A%2F%2Fpackages.jetbrains.team%2Fmaven%2Fp%2Fskija%2Fmaven%2Forg%2Fjetbrains%2Fskija%2Fskija-linux%2Fmaven-metadata.xml&query=//release) +`skija-windows` | ![version](https://img.shields.io/badge/dynamic/xml?style=flat-square&label=latest&color=success&url=https%3A%2F%2Fpackages.jetbrains.team%2Fmaven%2Fp%2Fskija%2Fmaven%2Forg%2Fjetbrains%2Fskija%2Fskija-windows%2Fmaven-metadata.xml&query=//release) + +## Running + Then: -``` +```sh cd examples/lwjgl ./script/exec.sh ``` diff --git a/native/src/impl/Library.cc b/native/src/impl/Library.cc index 7eab27de..d27dcaaf 100644 --- a/native/src/impl/Library.cc +++ b/native/src/impl/Library.cc @@ -13,6 +13,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skija_impl_Library__1nAfterLoad (JNIEnv* env, jclass jclass) { + env->EnsureLocalCapacity(64); java::onLoad(env); skija::onLoad(env); skija::shaper::onLoad(env); diff --git a/shared/src/main/java/org/jetbrains/skija/Canvas.java b/shared/src/main/java/org/jetbrains/skija/Canvas.java index 6757e5b3..951ac255 100644 --- a/shared/src/main/java/org/jetbrains/skija/Canvas.java +++ b/shared/src/main/java/org/jetbrains/skija/Canvas.java @@ -5,11 +5,14 @@ public class Canvas extends Managed { static { Library.staticLoad(); } - @ApiStatus.Internal - public Canvas(long ptr, boolean managed) { + public final Object _owner; + + @ApiStatus.Internal + public Canvas(long ptr, boolean managed, Object owner) { super(ptr, _FinalizerHolder.PTR, managed); + this._owner = owner; } /** @@ -45,7 +48,7 @@ public Canvas(Bitmap bitmap) { * @see https://fiddle.skia.org/c/@Canvas_const_SkBitmap_const_SkSurfaceProps */ public Canvas(Bitmap bitmap, SurfaceProps surfaceProps) { - this(_nMakeFromBitmap(Native.getPtr(bitmap), surfaceProps.getFlags(), surfaceProps.getPixelGeometry().ordinal()), true); + this(_nMakeFromBitmap(Native.getPtr(bitmap), surfaceProps.getFlags(), surfaceProps.getPixelGeometry().ordinal()), true, bitmap); Stats.onNativeCall(); } diff --git a/shared/src/main/java/org/jetbrains/skija/Drawable.java b/shared/src/main/java/org/jetbrains/skija/Drawable.java index b19d30bf..a94bcc4f 100644 --- a/shared/src/main/java/org/jetbrains/skija/Drawable.java +++ b/shared/src/main/java/org/jetbrains/skija/Drawable.java @@ -108,7 +108,7 @@ public Drawable notifyDrawingChanged() { @ApiStatus.Internal public void _onDraw(long canvasPtr) { - onDraw(new Canvas(canvasPtr, false)); + onDraw(new Canvas(canvasPtr, false, this)); } @ApiStatus.Internal public static native long _nMake(); diff --git a/shared/src/main/java/org/jetbrains/skija/PaintFilterCanvas.java b/shared/src/main/java/org/jetbrains/skija/PaintFilterCanvas.java index 5f02e4ab..69c267e9 100644 --- a/shared/src/main/java/org/jetbrains/skija/PaintFilterCanvas.java +++ b/shared/src/main/java/org/jetbrains/skija/PaintFilterCanvas.java @@ -13,7 +13,7 @@ public abstract class PaintFilterCanvas extends Canvas { * @param unrollDrawable if needed to filter nested drawable content using this canvas (for drawables there is no paint to filter) */ public PaintFilterCanvas(@NotNull Canvas canvas, boolean unrollDrawable) { - super(_nMake(Native.getPtr(canvas), unrollDrawable), true); + super(_nMake(Native.getPtr(canvas), unrollDrawable), true, canvas); Stats.onNativeCall(); _nAttachToJava(_ptr); Stats.onNativeCall(); diff --git a/shared/src/main/java/org/jetbrains/skija/PictureRecorder.java b/shared/src/main/java/org/jetbrains/skija/PictureRecorder.java index 85c4b713..fb4bff8e 100644 --- a/shared/src/main/java/org/jetbrains/skija/PictureRecorder.java +++ b/shared/src/main/java/org/jetbrains/skija/PictureRecorder.java @@ -31,7 +31,7 @@ public static class _FinalizerHolder { */ public Canvas beginRecording(Rect bounds) { Stats.onNativeCall(); - return new Canvas(_nBeginRecording(_ptr, bounds._left, bounds._top, bounds._right, bounds._bottom), false); + return new Canvas(_nBeginRecording(_ptr, bounds._left, bounds._top, bounds._right, bounds._bottom), false, this); } /** @@ -41,7 +41,7 @@ public Canvas beginRecording(Rect bounds) { public Canvas getRecordingCanvas() { Stats.onNativeCall(); long ptr = _nGetRecordingCanvas(_ptr); - return ptr == 0 ? null : new Canvas(ptr, false); + return ptr == 0 ? null : new Canvas(ptr, false, this); } /** diff --git a/shared/src/main/java/org/jetbrains/skija/Surface.java b/shared/src/main/java/org/jetbrains/skija/Surface.java index d75e26c9..03c49aea 100644 --- a/shared/src/main/java/org/jetbrains/skija/Surface.java +++ b/shared/src/main/java/org/jetbrains/skija/Surface.java @@ -20,7 +20,7 @@ public static Surface makeRasterN32Premul(int width, int height) { public Canvas getCanvas() { Stats.onNativeCall(); - return new Canvas(_nGetCanvas(_ptr), false); + return new Canvas(_nGetCanvas(_ptr), false, this); } public Image makeImageSnapshot() {