Skip to content

Commit 73986fb

Browse files
committed
Updating to iink 3.1
1 parent d394513 commit 73986fb

File tree

11 files changed

+234
-59
lines changed

11 files changed

+234
-59
lines changed

samples/UIReferenceImplementation/src/main/java/com/myscript/iink/uireferenceimplementation/Canvas.java

Lines changed: 129 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,44 @@
66
import android.graphics.DashPathEffect;
77
import android.graphics.Matrix;
88
import android.graphics.Paint;
9+
import android.graphics.PointF;
910
import android.graphics.PorterDuff;
1011
import android.graphics.PorterDuffXfermode;
1112
import android.graphics.Rect;
1213
import android.graphics.RectF;
1314
import android.graphics.Typeface;
14-
15-
import androidx.annotation.ColorInt;
16-
import androidx.annotation.NonNull;
17-
import androidx.annotation.Nullable;
18-
import androidx.core.graphics.ColorUtils;
19-
15+
import android.graphics.Xfermode;
2016
import android.text.TextPaint;
2117
import android.util.Log;
2218

19+
import com.myscript.iink.GLRenderer;
20+
import com.myscript.iink.ParameterSet;
2321
import com.myscript.iink.graphics.Color;
2422
import com.myscript.iink.graphics.FillRule;
2523
import com.myscript.iink.graphics.ICanvas;
2624
import com.myscript.iink.graphics.IPath;
25+
import com.myscript.iink.graphics.InkPoints;
2726
import com.myscript.iink.graphics.LineCap;
2827
import com.myscript.iink.graphics.LineJoin;
29-
import com.myscript.iink.graphics.Point;
3028
import com.myscript.iink.graphics.Style;
3129
import com.myscript.iink.graphics.Transform;
3230

33-
import java.util.List;
3431
import java.util.ArrayList;
32+
import java.util.Collections;
33+
import java.util.List;
3534
import java.util.Map;
3635
import java.util.Objects;
3736

37+
import androidx.annotation.ColorInt;
38+
import androidx.annotation.NonNull;
39+
import androidx.annotation.Nullable;
40+
import androidx.core.graphics.ColorUtils;
41+
3842
public class Canvas implements ICanvas
3943
{
4044

4145
private static final Style DEFAULT_SVG_STYLE = new Style();
46+
private static final PorterDuffXfermode xferModeSrcOver = new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER);
4247

4348
@Nullable
4449
private android.graphics.Canvas canvas;
@@ -77,6 +82,9 @@ public class Canvas implements ICanvas
7782
@Nullable
7883
private final ImageLoader imageLoader;
7984
private final OfflineSurfaceManager offlineSurfaceManager;
85+
@Nullable
86+
private GLRenderer glRenderer;
87+
private boolean keepGLRenderer = false;
8088

8189
private boolean clearOnStartDraw = true;
8290

@@ -85,7 +93,7 @@ public class Canvas implements ICanvas
8593
private final Map<String, Typeface> typefaceMap;
8694

8795
private float[] dashArray;
88-
private int dashOffset = 0;
96+
private float dashOffset = 0;
8997

9098
private final float xdpi;
9199
private final float ydpi;
@@ -95,7 +103,37 @@ public class Canvas implements ICanvas
95103
@NonNull
96104
private final Matrix pointScaleMatrix;
97105

98-
public Canvas(@Nullable android.graphics.Canvas canvas, Map<String, Typeface> typefaceMap, ImageLoader imageLoader, @Nullable OfflineSurfaceManager offlineSurfaceManager, float xdpi, float ydpi)
106+
public static class ExtraBrushConfig
107+
{
108+
@NonNull
109+
public final String baseName;
110+
@NonNull
111+
public final Bitmap stampBitmap;
112+
@Nullable
113+
public final Bitmap backgroundBitmap;
114+
@NonNull
115+
public final ParameterSet config;
116+
117+
public ExtraBrushConfig(@NonNull String baseName, @NonNull Bitmap stampBitmap, @Nullable Bitmap backgroundBitmap, @NonNull ParameterSet config)
118+
{
119+
this.baseName = baseName;
120+
this.stampBitmap = stampBitmap;
121+
this.backgroundBitmap = backgroundBitmap;
122+
this.config = config;
123+
}
124+
}
125+
126+
public Canvas(@Nullable android.graphics.Canvas canvas, Map<String, Typeface> typefaceMap, ImageLoader imageLoader, float xdpi, float ydpi)
127+
{
128+
this(canvas, Collections.emptyList(), typefaceMap, imageLoader, null, xdpi, ydpi);
129+
}
130+
131+
public Canvas(@Nullable android.graphics.Canvas canvas, @NonNull List<ExtraBrushConfig> extraBrushConfigs, Map<String, Typeface> typefaceMap, ImageLoader imageLoader, float xdpi, float ydpi)
132+
{
133+
this(canvas, extraBrushConfigs, typefaceMap, imageLoader, null, xdpi, ydpi);
134+
}
135+
136+
public Canvas(@Nullable android.graphics.Canvas canvas, @NonNull List<ExtraBrushConfig> extraBrushConfigs, Map<String, Typeface> typefaceMap, ImageLoader imageLoader, @Nullable OfflineSurfaceManager offlineSurfaceManager, float xdpi, float ydpi)
99137
{
100138
this.canvas = canvas;
101139
this.typefaceMap = typefaceMap;
@@ -104,7 +142,14 @@ public Canvas(@Nullable android.graphics.Canvas canvas, Map<String, Typeface> ty
104142
this.xdpi = xdpi;
105143
this.ydpi = ydpi;
106144

107-
clips = new ArrayList<String>();
145+
if (!extraBrushConfigs.isEmpty() && GLRenderer.isDeviceSupported())
146+
{
147+
glRenderer = new GLRenderer();
148+
for (ExtraBrushConfig config : extraBrushConfigs)
149+
glRenderer.configureBrush(config.baseName, config.stampBitmap, config.backgroundBitmap, config.config);
150+
}
151+
152+
clips = new ArrayList<>();
108153

109154
strokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
110155
strokePaint.setStyle(Paint.Style.STROKE);
@@ -138,9 +183,13 @@ public Canvas(@Nullable android.graphics.Canvas canvas, Map<String, Typeface> ty
138183
applyStyle(DEFAULT_SVG_STYLE);
139184
}
140185

141-
public Canvas(@Nullable android.graphics.Canvas canvas, Map<String, Typeface> typefaceMap, ImageLoader imageLoader, float xdpi, float ydpi)
186+
public void destroy()
142187
{
143-
this(canvas, typefaceMap, imageLoader, null, xdpi, ydpi);
188+
if (glRenderer != null)
189+
{
190+
glRenderer.destroy();
191+
glRenderer = null;
192+
}
144193
}
145194

146195
public void setCanvas(@NonNull android.graphics.Canvas canvas)
@@ -153,6 +202,11 @@ public void setClearOnStartDraw(boolean clearOnStartDraw)
153202
this.clearOnStartDraw = clearOnStartDraw;
154203
}
155204

205+
public void setKeepGLRenderer(boolean keepGLRenderer)
206+
{
207+
this.keepGLRenderer = keepGLRenderer;
208+
}
209+
156210
private void applyStyle(@NonNull Style style)
157211
{
158212
setStrokeColor(style.getStrokeColor());
@@ -279,6 +333,7 @@ public void setStrokeDashArray(float[] strokeDashArray)
279333
@Override
280334
public void setStrokeDashOffset(float strokeDashOffset)
281335
{
336+
dashOffset = strokeDashOffset;
282337
if (dashArray != null)
283338
strokePaint.setPathEffect(new DashPathEffect(dashArray, dashOffset));
284339
else
@@ -347,6 +402,12 @@ public void startDraw(int x, int y, int width, int height)
347402
@Override
348403
public void endDraw()
349404
{
405+
if (!keepGLRenderer && glRenderer != null)
406+
{
407+
glRenderer.destroy();
408+
glRenderer = null;
409+
}
410+
350411
Objects.requireNonNull(canvas);
351412
canvas.restore();
352413
}
@@ -412,6 +473,61 @@ public void drawPath(@NonNull IPath ipath)
412473
}
413474
}
414475

476+
@Override
477+
public boolean isExtraBrushSupported(@NonNull String brushName)
478+
{
479+
return glRenderer != null && glRenderer.isBrushSupported(brushName);
480+
}
481+
482+
@Override
483+
public void drawStrokeWithExtraBrush(@NonNull InkPoints inkPoints, int temporaryPoints,
484+
float strokeWidth, @NonNull String brushName, boolean fullStroke, long id)
485+
{
486+
Objects.requireNonNull(canvas);
487+
488+
if (!isExtraBrushSupported(brushName))
489+
return;
490+
491+
if (inkPoints.x.length == 0 || strokeWidth <= 0.f || android.graphics.Color.alpha(fillPaint.getColor()) == 0)
492+
return;
493+
494+
if (!glRenderer.isInitialized())
495+
{
496+
glRenderer.initialize(keepGLRenderer, canvas.getWidth(), canvas.getHeight(), xdpi, ydpi);
497+
}
498+
499+
Xfermode xfm = fillPaint.getXfermode();
500+
501+
try
502+
{
503+
canvas.setMatrix(null); // GLRenderer works with pixels
504+
fillPaint.setXfermode(xferModeSrcOver);
505+
506+
PointF strokeOrigin = glRenderer.drawStroke(inkPoints, temporaryPoints, transformValues, brushName, fullStroke, id, strokeWidth, fillPaint);
507+
Bitmap strokeBitmap = glRenderer.saveStroke();
508+
if (strokeBitmap != null)
509+
canvas.drawBitmap(strokeBitmap, strokeOrigin.x, strokeOrigin.y, fillPaint);
510+
511+
if (temporaryPoints > 0)
512+
{
513+
PointF temporaryOrigin = glRenderer.drawTemporary(inkPoints, temporaryPoints, transformValues, brushName, strokeWidth, fillPaint);
514+
Bitmap temporaryBitmap = glRenderer.saveTemporary();
515+
if (temporaryBitmap != null)
516+
canvas.drawBitmap(temporaryBitmap, temporaryOrigin.x, temporaryOrigin.y, fillPaint);
517+
}
518+
}
519+
catch (Exception e)
520+
{
521+
Log.e("Canvas", "Error trying to draw stroke with extra brush: " + e.getMessage(), e);
522+
}
523+
finally
524+
{
525+
// restore
526+
fillPaint.setXfermode(xfm);
527+
canvas.setMatrix(transformMatrix);
528+
}
529+
}
530+
415531
@Override
416532
public void drawRectangle(float x, float y, float width, float height)
417533
{

samples/UIReferenceImplementation/src/main/java/com/myscript/iink/uireferenceimplementation/EditorBinding.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ private void bindEditor(@NonNull EditorView editorView, @Nullable Editor editor)
4848
}
4949

5050
@NonNull
51-
public final EditorData openEditor(@Nullable EditorView editorView)
51+
public EditorData openEditor(@Nullable EditorView editorView)
5252
{
5353
Editor editor = null;
5454
Renderer renderer = null;

samples/UIReferenceImplementation/src/main/java/com/myscript/iink/uireferenceimplementation/EditorData.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
package com.myscript.iink.uireferenceimplementation;
44

5-
import androidx.annotation.Nullable;
6-
75
import com.myscript.iink.Editor;
86
import com.myscript.iink.Renderer;
97

8+
import androidx.annotation.Nullable;
9+
1010
public final class EditorData
1111
{
1212
@Nullable
@@ -17,19 +17,19 @@ public final class EditorData
1717
private final InputController inputController;
1818

1919
@Nullable
20-
public final Editor getEditor()
20+
public Editor getEditor()
2121
{
2222
return this.editor;
2323
}
2424

2525
@Nullable
26-
public final Renderer getRenderer()
26+
public Renderer getRenderer()
2727
{
2828
return this.renderer;
2929
}
3030

3131
@Nullable
32-
public final InputController getInputController()
32+
public InputController getInputController()
3333
{
3434
return this.inputController;
3535
}

samples/UIReferenceImplementation/src/main/java/com/myscript/iink/uireferenceimplementation/EditorView.java

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@
1010
import android.view.View;
1111
import android.widget.FrameLayout;
1212

13-
import androidx.annotation.NonNull;
14-
import androidx.annotation.Nullable;
15-
1613
import com.myscript.iink.Editor;
1714
import com.myscript.iink.IRenderTarget;
1815
import com.myscript.iink.Renderer;
1916
import com.myscript.iink.graphics.ICanvas;
2017
import com.myscript.iink.graphics.Point;
2118

19+
import java.util.Collections;
2220
import java.util.EnumSet;
2321
import java.util.HashMap;
22+
import java.util.List;
2423
import java.util.Map;
2524

25+
import androidx.annotation.NonNull;
26+
import androidx.annotation.Nullable;
27+
2628
public class EditorView extends FrameLayout implements IRenderTarget, InputController.ViewListener
2729
{
2830
private int viewWidth;
@@ -40,17 +42,17 @@ public class EditorView extends FrameLayout implements IRenderTarget, InputContr
4042
private LayerView layerView;
4143

4244
private Map<String, Typeface> typefaceMap = new HashMap<>();
45+
@NonNull
46+
private List<Canvas.ExtraBrushConfig> extraBrushConfigs = Collections.emptyList();
4347

4448
public EditorView(Context context)
4549
{
46-
super(context);
47-
offlineSurfaceManager = new OfflineSurfaceManager();
50+
this(context, null, 0);
4851
}
4952

5053
public EditorView(Context context, @Nullable AttributeSet attrs)
5154
{
52-
super(context, attrs);
53-
offlineSurfaceManager = new OfflineSurfaceManager();
55+
this(context, attrs, 0);
5456
}
5557

5658
public EditorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
@@ -127,6 +129,31 @@ public Renderer getRenderer()
127129
return renderer;
128130
}
129131

132+
public void setExtraBrushConfigs(@NonNull List<Canvas.ExtraBrushConfig> extraBrushConfigs)
133+
{
134+
if (editor != null)
135+
{
136+
throw new IllegalStateException("Please set the extra brush configs of the EditorView before binding the editor (through EditorView.setEngine() or EditorView.setEditor())");
137+
}
138+
139+
this.extraBrushConfigs = extraBrushConfigs;
140+
for (int i = 0, count = getChildCount(); i < count; ++i)
141+
{
142+
View view = getChildAt(i);
143+
if (view instanceof LayerView)
144+
{
145+
LayerView layerView = (LayerView) view;
146+
layerView.setExtraBrushConfigs(extraBrushConfigs);
147+
}
148+
}
149+
}
150+
151+
@NonNull
152+
public List<Canvas.ExtraBrushConfig> getExtraBrushConfigs()
153+
{
154+
return extraBrushConfigs;
155+
}
156+
130157
public void setImageLoader(ImageLoader imageLoader)
131158
{
132159
this.imageLoader = imageLoader;
@@ -138,6 +165,12 @@ public void setImageLoader(ImageLoader imageLoader)
138165
}
139166
}
140167

168+
@Nullable
169+
public ImageLoader getImageLoader()
170+
{
171+
return imageLoader;
172+
}
173+
141174
public void setTypefaces(@NonNull Map<String, Typeface> typefaceMap)
142175
{
143176
if (editor != null)
@@ -162,12 +195,6 @@ public Map<String, Typeface> getTypefaces()
162195
return typefaceMap;
163196
}
164197

165-
@Nullable
166-
public ImageLoader getImageLoader()
167-
{
168-
return imageLoader;
169-
}
170-
171198
@Override
172199
protected void onSizeChanged(int newWidth, int newHeight, int oldWidth, int oldHeight)
173200
{
@@ -263,7 +290,7 @@ public ICanvas createOffscreenRenderCanvas(int offscreenID)
263290
if (offlineBitmap == null)
264291
return null;
265292
android.graphics.Canvas canvas = new android.graphics.Canvas(offlineBitmap);
266-
return new Canvas(canvas, typefaceMap, imageLoader, offlineSurfaceManager, renderer.getDpiX(), renderer.getDpiY());
293+
return new Canvas(canvas, extraBrushConfigs, typefaceMap, imageLoader, offlineSurfaceManager, renderer.getDpiX(), renderer.getDpiY());
267294
}
268295

269296
@Override

0 commit comments

Comments
 (0)