Skip to content

Commit 8b96a4b

Browse files
committed
Upgrading to iink 4.0
1 parent a9026b2 commit 8b96a4b

File tree

9 files changed

+122
-48
lines changed

9 files changed

+122
-48
lines changed

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

+6-5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.myscript.iink.GLRenderer;
2020
import com.myscript.iink.ParameterSet;
2121
import com.myscript.iink.graphics.Color;
22+
import com.myscript.iink.graphics.ExtraBrushStyle;
2223
import com.myscript.iink.graphics.FillRule;
2324
import com.myscript.iink.graphics.ICanvas;
2425
import com.myscript.iink.graphics.IPath;
@@ -481,14 +482,14 @@ public boolean isExtraBrushSupported(@NonNull String brushName)
481482

482483
@Override
483484
public void drawStrokeWithExtraBrush(@NonNull InkPoints[] vInkPoints, int temporaryPoints,
484-
float strokeWidth, @NonNull String brushName, boolean fullStroke, long id)
485+
@NonNull ExtraBrushStyle style, boolean fullStroke, long id)
485486
{
486487
Objects.requireNonNull(canvas);
487488

488-
if (!isExtraBrushSupported(brushName))
489+
if (!isExtraBrushSupported(style.brushName))
489490
return;
490491

491-
if (vInkPoints.length == 0 || vInkPoints[0].x.length == 0 || strokeWidth <= 0.f || android.graphics.Color.alpha(fillPaint.getColor()) == 0)
492+
if (vInkPoints.length == 0 || vInkPoints[0].x.length == 0 || style.strokeWidth <= 0.f || android.graphics.Color.alpha(fillPaint.getColor()) == 0)
492493
return;
493494

494495
if (!glRenderer.isInitialized())
@@ -503,14 +504,14 @@ public void drawStrokeWithExtraBrush(@NonNull InkPoints[] vInkPoints, int tempor
503504
canvas.setMatrix(null); // GLRenderer works with pixels
504505
fillPaint.setXfermode(xferModeSrcOver);
505506

506-
PointF strokeOrigin = glRenderer.drawStroke(vInkPoints, temporaryPoints, transformValues, brushName, fullStroke, id, strokeWidth, fillPaint);
507+
PointF strokeOrigin = glRenderer.drawStroke(vInkPoints, temporaryPoints, transformValues, style, fillPaint, fullStroke, id);
507508
Bitmap strokeBitmap = glRenderer.saveStroke();
508509
if (strokeBitmap != null)
509510
canvas.drawBitmap(strokeBitmap, strokeOrigin.x, strokeOrigin.y, fillPaint);
510511

511512
if (temporaryPoints > 0 && vInkPoints.length == 1)
512513
{
513-
PointF temporaryOrigin = glRenderer.drawTemporary(vInkPoints, temporaryPoints, transformValues, brushName, strokeWidth, fillPaint);
514+
PointF temporaryOrigin = glRenderer.drawTemporary(vInkPoints, temporaryPoints, transformValues, style, fillPaint);
514515
Bitmap temporaryBitmap = glRenderer.saveTemporary();
515516
if (temporaryBitmap != null)
516517
canvas.drawBitmap(temporaryBitmap, temporaryOrigin.x, temporaryOrigin.y, fillPaint);

Diff for: samples/UIReferenceImplementation/src/main/java/com/myscript/iink/uireferenceimplementation/ContextualActions.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,18 @@ public enum ContextualActions {
3636
*/
3737
EXPORT,
3838
/**
39-
* Format text.
39+
* Change Text blocks format.
4040
* @see Editor#getSupportedTextFormats(ContentSelection)
4141
*/
42-
FORMAT_TEXT
42+
FORMAT_TEXT,
43+
/**
44+
* Change selection mode.
45+
* @see Editor#getAvailableSelectionModes()
46+
*/
47+
SELECTION_MODE,
48+
/**
49+
* Change selection type.
50+
* @see Editor#getAvailableSelectionTypes(ContentSelection)
51+
*/
52+
SELECTION_TYPE
4353
}

Diff for: samples/UIReferenceImplementation/src/main/java/com/myscript/iink/uireferenceimplementation/ContextualActionsHelper.java

+9
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.myscript.iink.ContentBlock;
66
import com.myscript.iink.ContentPart;
77
import com.myscript.iink.ContentSelection;
8+
import com.myscript.iink.ContentSelectionMode;
89
import com.myscript.iink.Editor;
910

1011
import java.util.EnumSet;
@@ -37,6 +38,8 @@ public static EnumSet<ContextualActions> getAvailableActionsForBlock(@NonNull Ed
3738
boolean displayConvert = !blockIsEmpty && editor.getSupportedTargetConversionStates(block).length > 0;
3839
boolean displayExport = editor.getSupportedExportMimeTypes(block).length > 0;
3940
boolean displayFormatText = editor.getSupportedTextFormats(block).size() > 0;
41+
boolean displaySelectionMode = editor.getAvailableSelectionModes().size() > 0;
42+
boolean displaySelectionType = editor.getAvailableSelectionTypes(block).length > 0;
4043

4144
if (displayAddBlock) actions.add(ContextualActions.ADD_BLOCK);
4245
if (displayRemove) actions.add(ContextualActions.REMOVE);
@@ -45,6 +48,8 @@ public static EnumSet<ContextualActions> getAvailableActionsForBlock(@NonNull Ed
4548
if (isRootBlock) actions.add(ContextualActions.PASTE);
4649
if (displayExport) actions.add(ContextualActions.EXPORT);
4750
if (displayFormatText) actions.add(ContextualActions.FORMAT_TEXT);
51+
if (displaySelectionMode) actions.add(ContextualActions.SELECTION_MODE);
52+
if (displaySelectionType) actions.add(ContextualActions.SELECTION_TYPE);
4853
}
4954
return actions;
5055
}
@@ -57,12 +62,16 @@ public static EnumSet<ContextualActions> getAvailableActionsForSelection(@NonNul
5762
boolean displayConvert = editor.getSupportedTargetConversionStates(selection).length > 0;
5863
boolean displayExport = editor.getSupportedExportMimeTypes(selection).length > 0;
5964
boolean displayFormatText = selection != null && !editor.getSupportedTextFormats(selection).isEmpty();
65+
boolean displaySelectionMode = editor.getAvailableSelectionModes().size() > 0;
66+
boolean displaySelectionType = editor.getAvailableSelectionTypes(selection).length > 0;
6067

6168
actions.add(ContextualActions.REMOVE);
6269
if (displayConvert) actions.add(ContextualActions.CONVERT);
6370
actions.add(ContextualActions.COPY);
6471
if (displayExport) actions.add(ContextualActions.EXPORT);
6572
if (displayFormatText) actions.add(ContextualActions.FORMAT_TEXT);
73+
if (displaySelectionMode) actions.add(ContextualActions.SELECTION_MODE);
74+
if (displaySelectionType) actions.add(ContextualActions.SELECTION_TYPE);
6675

6776
return actions;
6877
}

Diff for: samples/UIReferenceImplementation/src/main/java/com/myscript/iink/uireferenceimplementation/FontMetricsProvider.java

+1
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ public synchronized GlyphMetrics[] getGlyphMetrics(Text text, TextSpan[] spans)
184184

185185
int typefaceStyle = FontUtils.getTypefaceStyle(style);
186186
int fontSize = Math.round(y_mm2px(style.getFontSize()));
187+
fontSize = Math.max(fontSize, 1);
187188
int start = text.getGlyphBeginAt(spans[i].beginPosition);
188189
int end = text.getGlyphEndAt(spans[i].endPosition - 1);
189190

Diff for: samples/UIReferenceImplementation/src/main/java/com/myscript/iink/uireferenceimplementation/InputController.java

+75-30
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,10 @@ private boolean handleOnTouchForPointer(MotionEvent event, int actionMask, int p
114114
{
115115
final int pointerId = event.getPointerId(pointerIndex);
116116
final int pointerType = event.getToolType(pointerIndex);
117+
final int historySize = event.getHistorySize();
118+
final boolean useTiltInfo = pointerType == MotionEvent.TOOL_TYPE_STYLUS;
117119

118120
int inputMode = getInputMode();
119-
120121
if (inputMode == INPUT_MODE_FORCE_PEN)
121122
{
122123
iinkPointerType = PointerType.PEN;
@@ -131,13 +132,9 @@ else if (inputMode == INPUT_MODE_FORCE_TOUCH)
131132
{
132133
case MotionEvent.TOOL_TYPE_STYLUS:
133134
if (inputMode == INPUT_MODE_ERASER)
134-
{
135135
iinkPointerType = PointerType.ERASER;
136-
}
137136
else
138-
{
139137
iinkPointerType = PointerType.PEN;
140-
}
141138
break;
142139
case MotionEvent.TOOL_TYPE_FINGER:
143140
case MotionEvent.TOOL_TYPE_MOUSE:
@@ -150,71 +147,99 @@ else if (inputMode == INPUT_MODE_FORCE_TOUCH)
150147
}
151148

152149
if (isScalingEnabled)
153-
{
154150
scaleGestureDetector.onTouchEvent(event);
155-
}
156151

157152
if (iinkPointerType == PointerType.TOUCH)
158-
{
159153
gestureDetector.onTouchEvent(event);
160-
}
161-
162-
int historySize = event.getHistorySize();
163154

164155
switch (actionMask)
165156
{
166-
// ACTION_POINTER_DOWN is "A non-primary pointer has gone down", this is called only when a pointer is already on the touch.
157+
// ACTION_POINTER_DOWN is "A non-primary pointer has gone down", only called when a pointer is already on the touchscreen.
167158
case MotionEvent.ACTION_POINTER_DOWN:
159+
{
168160
isMultiFingerTouch = true;
169161
if (previousPointerId != -1)
170162
{
171163
editor.pointerCancel(previousPointerId);
172164
previousPointerId = -1;
173165
}
174166
return true;
175-
167+
}
176168
case MotionEvent.ACTION_DOWN:
169+
{
177170
previousPointerId = pointerId;
178171
isMultiFingerTouch = false;
179172
// Request unbuffered events for tools that require low capture latency
180173
ToolController toolController = editor.getToolController();
181174
PointerTool tool = toolController.getToolForType(iinkPointerType);
182175
if (tool == PointerTool.PEN || tool == PointerTool.HIGHLIGHTER)
183176
editorView.requestUnbufferedDispatch(event);
177+
184178
try
185179
{
186-
editor.pointerDown(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
180+
if (useTiltInfo)
181+
editor.pointerDown(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(),
182+
event.getPressure(), event.getAxisValue(MotionEvent.AXIS_TILT, pointerIndex), event.getAxisValue(MotionEvent.AXIS_ORIENTATION, pointerIndex), iinkPointerType, pointerId);
183+
else
184+
editor.pointerDown(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
187185
}
188-
catch(UnsupportedOperationException e) {
186+
catch (UnsupportedOperationException e) {
189187
// Special case: pointerDown already called, discard previous and retry
190188
editor.pointerCancel(pointerId);
191-
editor.pointerDown(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
189+
if (useTiltInfo)
190+
editor.pointerDown(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(),
191+
event.getPressure(), event.getAxisValue(MotionEvent.AXIS_TILT, pointerIndex), event.getAxisValue(MotionEvent.AXIS_ORIENTATION, pointerIndex), iinkPointerType, pointerId);
192+
else
193+
editor.pointerDown(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
192194
}
193195
return true;
194-
196+
}
195197
case MotionEvent.ACTION_MOVE:
198+
{
196199
if (isMultiFingerTouch)
197200
return true;
198201

199202
if (historySize > 0)
200203
{
201204
PointerEvent[] pointerEvents = new PointerEvent[historySize + 1];
202-
for (int i = 0; i < historySize; ++i)
203-
pointerEvents[i] = new PointerEvent(PointerEventType.MOVE, event.getHistoricalX(pointerIndex, i), event.getHistoricalY(pointerIndex, i), eventTimeOffset + event.getHistoricalEventTime(i), event.getHistoricalPressure(pointerIndex, i), iinkPointerType, pointerId);
204-
pointerEvents[historySize] = new PointerEvent(PointerEventType.MOVE, event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
205+
if (useTiltInfo)
206+
{
207+
for (int i = 0; i < historySize; ++i)
208+
{
209+
pointerEvents[i] = new PointerEvent(PointerEventType.MOVE, event.getHistoricalX(pointerIndex, i), event.getHistoricalY(pointerIndex, i), eventTimeOffset + event.getHistoricalEventTime(i),
210+
event.getHistoricalPressure(pointerIndex, i), event.getHistoricalAxisValue(MotionEvent.AXIS_TILT, pointerIndex, i), event.getHistoricalAxisValue(MotionEvent.AXIS_ORIENTATION, pointerIndex, i), iinkPointerType, pointerId);
211+
}
212+
pointerEvents[historySize] = new PointerEvent(PointerEventType.MOVE, event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(),
213+
event.getPressure(), event.getAxisValue(MotionEvent.AXIS_TILT, pointerIndex), event.getAxisValue(MotionEvent.AXIS_ORIENTATION, pointerIndex), iinkPointerType, pointerId);
214+
}
215+
else
216+
{
217+
for (int i = 0; i < historySize; ++i)
218+
{
219+
pointerEvents[i] = new PointerEvent(PointerEventType.MOVE, event.getHistoricalX(pointerIndex, i), event.getHistoricalY(pointerIndex, i), eventTimeOffset + event.getHistoricalEventTime(i),
220+
event.getHistoricalPressure(pointerIndex, i), iinkPointerType, pointerId);
221+
}
222+
pointerEvents[historySize] = new PointerEvent(PointerEventType.MOVE, event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
223+
}
205224
editor.pointerEvents(pointerEvents, true);
206225
}
207-
else
226+
else // no history
208227
{
209-
editor.pointerMove(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
228+
if (useTiltInfo)
229+
editor.pointerMove(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(),
230+
event.getPressure(), event.getAxisValue(MotionEvent.AXIS_TILT, pointerIndex), event.getAxisValue(MotionEvent.AXIS_ORIENTATION, pointerIndex), iinkPointerType, pointerId);
231+
else
232+
editor.pointerMove(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
210233
}
211234
return true;
212-
213-
// ACTION_POINTER_UP is "A non-primary pointer has gone up", at least one finger is still on the touch.
235+
}
236+
// ACTION_POINTER_UP is "A non-primary pointer has gone up", at least one finger is still on the touchscreen.
214237
case MotionEvent.ACTION_POINTER_UP:
238+
{
215239
return true;
216-
240+
}
217241
case MotionEvent.ACTION_UP:
242+
{
218243
if (isMultiFingerTouch)
219244
{
220245
isMultiFingerTouch = false;
@@ -223,17 +248,37 @@ else if (inputMode == INPUT_MODE_FORCE_TOUCH)
223248
if (historySize > 0)
224249
{
225250
PointerEvent[] pointerEvents = new PointerEvent[historySize];
226-
for (int i = 0; i < historySize; ++i)
227-
pointerEvents[i] = new PointerEvent(PointerEventType.MOVE, event.getHistoricalX(pointerIndex, i), event.getHistoricalY(pointerIndex, i), eventTimeOffset + event.getHistoricalEventTime(i), event.getHistoricalPressure(pointerIndex, i), iinkPointerType, pointerId);
251+
if (useTiltInfo)
252+
{
253+
for (int i = 0; i < historySize; ++i)
254+
{
255+
pointerEvents[i] = new PointerEvent(PointerEventType.MOVE, event.getHistoricalX(pointerIndex, i), event.getHistoricalY(pointerIndex, i), eventTimeOffset + event.getHistoricalEventTime(i),
256+
event.getHistoricalPressure(pointerIndex, i), event.getHistoricalAxisValue(MotionEvent.AXIS_TILT, pointerIndex, i), event.getHistoricalAxisValue(MotionEvent.AXIS_ORIENTATION, pointerIndex, i), iinkPointerType, pointerId);
257+
}
258+
}
259+
else
260+
{
261+
for (int i = 0; i < historySize; ++i)
262+
{
263+
pointerEvents[i] = new PointerEvent(PointerEventType.MOVE, event.getHistoricalX(pointerIndex, i), event.getHistoricalY(pointerIndex, i), eventTimeOffset + event.getHistoricalEventTime(i),
264+
event.getHistoricalPressure(pointerIndex, i), iinkPointerType, pointerId);
265+
}
266+
}
228267
editor.pointerEvents(pointerEvents, true);
229268
}
230-
editor.pointerUp(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
231-
return true;
269+
if (useTiltInfo)
270+
editor.pointerUp(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(),
271+
event.getPressure(), event.getAxisValue(MotionEvent.AXIS_TILT, pointerIndex), event.getAxisValue(MotionEvent.AXIS_ORIENTATION, pointerIndex), iinkPointerType, pointerId);
272+
else
273+
editor.pointerUp(event.getX(pointerIndex), event.getY(pointerIndex), eventTimeOffset + event.getEventTime(), event.getPressure(), iinkPointerType, pointerId);
232274

275+
return true;
276+
}
233277
case MotionEvent.ACTION_CANCEL:
278+
{
234279
editor.pointerCancel(pointerId);
235280
return true;
236-
281+
}
237282
default:
238283
return false;
239284
}

Diff for: samples/UIReferenceImplementation/src/main/java/com/myscript/iink/uireferenceimplementation/SmartGuideView.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -311,12 +311,15 @@ public void setEditor(@Nullable Editor editor)
311311
Engine engine = editor.getEngine();
312312

313313
exportParams = engine.createParameterSet();
314-
exportParams.setBoolean("export.jiix.text.words", true);
315-
exportParams.setBoolean("export.jiix.strokes", false);
316314
exportParams.setBoolean("export.jiix.bounding-box", false);
317315
exportParams.setBoolean("export.jiix.glyphs", false);
318316
exportParams.setBoolean("export.jiix.primitives", false);
319-
exportParams.setBoolean("export.jiix.chars", false);
317+
exportParams.setBoolean("export.jiix.strokes", false);
318+
exportParams.setBoolean("export.jiix.text.chars", false);
319+
exportParams.setBoolean("export.jiix.text.lines", false);
320+
exportParams.setBoolean("export.jiix.text.spans", false);
321+
exportParams.setBoolean("export.jiix.text.structure", false);
322+
exportParams.setBoolean("export.jiix.text.words", true);
320323

321324
importParams = engine.createParameterSet();
322325
importParams.setString("diagram.import.jiix.action", "update");
@@ -330,7 +333,6 @@ public void setEditor(@Nullable Editor editor)
330333
fadeOutOtherDelay = configuration.getNumber("smart-guide.fade-out-delay.other", SMART_GUIDE_FADE_OUT_DELAY_OTHER_DEFAULT).intValue();
331334
removeHighlightDelay = configuration.getNumber("smart-guide.highlight-removal-delay", SMART_GUIDE_HIGHLIGHT_REMOVAL_DELAY_DEFAULT).intValue();
332335
}
333-
334336
}
335337

336338
public void setMenuListener(@Nullable MenuListener moreMenuListener)
@@ -408,7 +410,7 @@ public void contentChanged(@NonNull Editor editor, String[] blockIds)
408410
}
409411
else
410412
{
411-
return;
413+
update(null, UpdateCause.EDIT);
412414
}
413415
}
414416

Diff for: samples/build.gradle

+8-2
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,19 @@ subprojects {
3333
def resourcesURL = gradle.ext.iinkResourcesURL
3434
def sourceUrls = ["${resourcesURL}/myscript-iink-recognition-diagram.zip",
3535
"${resourcesURL}/myscript-iink-recognition-raw-content.zip",
36+
"${resourcesURL}/myscript-iink-recognition-raw-content2.zip",
3637
"${resourcesURL}/myscript-iink-recognition-math.zip",
38+
"${resourcesURL}/myscript-iink-recognition-math2.zip",
3739
"${resourcesURL}/myscript-iink-recognition-text-en_US.zip"]
3840
def targetDir = new File(proj.projectDir, "src/main/assets/")
3941
def diagramConf = new File(targetDir, "conf/diagram.conf")
4042
def rawContentConf = new File(targetDir, "conf/raw-content.conf")
43+
def rawContent2Conf = new File(targetDir, "conf/raw-content2.conf")
4144
def mathConf = new File(targetDir, "conf/math.conf")
45+
def math2Conf = new File(targetDir, "conf/math2.conf")
4246
def textConf = new File(targetDir, "conf/en_US.conf")
4347

44-
if (!diagramConf.exists() || !rawContentConf.exists() || !mathConf.exists() || !textConf.exists()) {
48+
if (!diagramConf.exists() || !rawContentConf.exists() || !rawContent2Conf.exists() || !mathConf.exists() || !math2Conf.exists() || !textConf.exists()) {
4549
def tmpAssetsDir = new File(proj.projectDir, "tmp-assets/")
4650
def zipDir = new File(tmpAssetsDir, "zips")
4751

@@ -68,10 +72,12 @@ subprojects {
6872
def targetDir = new File(proj.projectDir, "src/main/assets/")
6973
def diagramConf = new File(targetDir, "conf/diagram.conf")
7074
def rawContentConf = new File(targetDir, "conf/raw-content.conf")
75+
def rawContent2Conf = new File(targetDir, "conf/raw-content2.conf")
7176
def mathConf = new File(targetDir, "conf/math.conf")
77+
def math2Conf = new File(targetDir, "conf/math2.conf")
7278
def textConf = new File(targetDir, "conf/en_US.conf")
7379

74-
if (!diagramConf.exists() || !rawContentConf.exists() || !mathConf.exists() || !textConf.exists()) {
80+
if (!diagramConf.exists() || !rawContentConf.exists() || !rawContent2Conf.exists() || !mathConf.exists() || !math2Conf.exists() || !textConf.exists()) {
7581
def tmpAssetsDir = new File(proj.projectDir, "tmp-assets/")
7682

7783
if (!tmpAssetsDir.isDirectory())

0 commit comments

Comments
 (0)