Skip to content

Commit

Permalink
Canvas to hold a link to its owner. Closes #50, closes #59
Browse files Browse the repository at this point in the history
  • Loading branch information
tonsky committed Nov 23, 2020
1 parent 4a7fed1 commit 593ec4d
Show file tree
Hide file tree
Showing 10 changed files with 68 additions and 25 deletions.
25 changes: 20 additions & 5 deletions examples/clojure/README.md
Original file line number Diff line number Diff line change
@@ -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
```
5 changes: 3 additions & 2 deletions examples/clojure/deps.edn
Original file line number Diff line number Diff line change
@@ -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"}}}
29 changes: 20 additions & 9 deletions examples/clojure/src/lwjgl/main.clj
Original file line number Diff line number Diff line change
@@ -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]
Expand All @@ -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)
Expand All @@ -31,17 +32,27 @@
(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)
surface (Surface/makeFromBackendRenderTarget context target SurfaceOrigin/BOTTOM_LEFT SurfaceColorFormat/RGBA_8888 (ColorSpace/getSRGB))
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)))
14 changes: 13 additions & 1 deletion examples/lwjgl/README.md
Original file line number Diff line number Diff line change
@@ -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:

`<artifactId>` | `<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

Then:

```
```sh
cd examples/lwjgl
./script/exec.sh
```
1 change: 1 addition & 0 deletions native/src/impl/Library.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
9 changes: 6 additions & 3 deletions shared/src/main/java/org/jetbrains/skija/Canvas.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/**
Expand Down Expand Up @@ -45,7 +48,7 @@ public Canvas(Bitmap bitmap) {
* @see <a href="https://fiddle.skia.org/c/@Canvas_const_SkBitmap_const_SkSurfaceProps">https://fiddle.skia.org/c/@Canvas_const_SkBitmap_const_SkSurfaceProps</a>
*/
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();
}

Expand Down
2 changes: 1 addition & 1 deletion shared/src/main/java/org/jetbrains/skija/Drawable.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
4 changes: 2 additions & 2 deletions shared/src/main/java/org/jetbrains/skija/PictureRecorder.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/**
Expand All @@ -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);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion shared/src/main/java/org/jetbrains/skija/Surface.java
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit 593ec4d

Please sign in to comment.