Skip to main content

Manipulation of Digital Ink

ベクトルインクとラスターインクでは、加工時の処理が異なります。 ラスターイレーサがストロークを単に「誇張して」描くのに対し、ベクトル加工は生成された形状を修正します。

Raster Ink

これまでのところ、ラスターインクには部分的なイレーサ機能のみが提供されています。

消しゴム

イレーサは、ブラシと同様にツールとして設定されています。 このツールは特定の混合モードBlendMode.DESTINATION_OUTを使用して、ストロークを重ねることによって消去します。

import com.wacom.ink.Calculator
import com.wacom.ink.PathPoint
import com.wacom.ink.PathPointLayout
import com.wacom.ink.rendering.BlendMode
...

class EraserRasterTool(context: Context) : RasterTool(context) {

companion object {
val uri = URIBuilder.getToolURI("raster", "eraser")
}

override var brush = BrushPalette.eraser(context)

override fun getLayout(): PathPointLayout {
return PathPointLayout(
PathPoint.Property.X,
PathPoint.Property.Y,
PathPoint.Property.SIZE,
PathPoint.Property.RED,
PathPoint.Property.GREEN,
PathPoint.Property.BLUE,
PathPoint.Property.ALPHA
)
}

override val touchCalculator: Calculator = { previous, current, next ->
// Use the following to compute size based on speed:
var size = current.computeValueBasedOnSpeed(
previous,
next,
minValue = 8f,
maxValue = 112f,
minSpeed = 720f,
maxSpeed = 3900f
)
if (size == null) size = 8f

PathPoint(current.x, current.y, size = size,
red = 1f, green = 1f, blue = 1f, alpha = 1f)
}

override val stylusCalculator: Calculator = { previous, current, next ->
// Use the following to compute size based on speed:
var size = current.computeValueBasedOnSpeed(
previous,
next,
minValue = 8f,
maxValue = 112f,
minSpeed = 720f,
maxSpeed = 3900f
)
if (size == null) size = 8f

PathPoint(current.x, current.y, size = size,
red = 1f, green = 1f, blue = 1f, alpha = 1f)
}

override fun getBlendMode(): BlendMode {
return BlendMode.DESTINATION_OUT
}

}

注意: Strokeはモデルから削除されず、単に上書きされます。

Vector Ink

ベクトルインクでは、次のようにストロークを加工できる機能がより多く提供されています。

  • 部分ストロークイレーサ
  • 全ストロークイレーサ
  • 加工オプション

部分消しゴム / スプリッタ

イレーサツールは、ブラシツールと同様の方法で機能します。 そのため、その計算機を定義することが必要です。 つまり、圧力の増加や速度の上昇によってイレーサの幅を変化させるかどうかを決定します。 また、指やスタイラスでの入力に対しては、異なる挙動を定義できます。

class EraserVectorTool : VectorTool() {

companion object {
val uri = "tool@erase_vector"
}

override var brush = BrushPalette.circle()

override fun getLayout(): PathPointLayout {
return PathPointLayout(
PathPoint.Property.X,
PathPoint.Property.Y,
PathPoint.Property.SIZE,
PathPoint.Property.RED,
PathPoint.Property.GREEN,
PathPoint.Property.BLUE
)
}

override var drawingMode = DrawingMode.ERASING_PARTIAL_STROKE

override val touchCalculator: Calculator = { previous, current, next ->
// Use the following to compute size based on speed:
var size = current.computeValueBasedOnSpeed(
previous,
next,
minValue = 8f,
maxValue = 112f,
minSpeed = 720f,
maxSpeed = 3900f
)
if (size == null) size = 1.0f
PathPoint(current.x, current.y, size = size, red = 1f, green = 1f, blue = 1f, alpha = 0.5f)
}

override val stylusCalculator: Calculator = { previous, current, next ->
// Use the following to compute size based on speed:
var size = current.computeValueBasedOnSpeed(
previous,
next,
minValue = 8f,
maxValue = 112f,
minSpeed = 720f,
maxSpeed = 3900f
)
if (size == null) size = 1.0f
PathPoint(current.x, current.y, size = size, red = 1f, green = 1f, blue = 1f)
}
}

全ストローク消しゴム


class EraserWholeStrokeTool : VectorTool() {

companion object {
val uri = URIBuilder.getToolURI("vector", "eraser_whole_stroke")
}

override var brush = BrushPalette.basic()

override fun getLayout(): PathPointLayout {
return PathPointLayout(
PathPoint.Property.X,
PathPoint.Property.Y,
PathPoint.Property.SIZE
)
}

override var drawingMode = DrawingMode.ERASING_WHOLE_STROKE

override val touchCalculator: Calculator = { previous, current, next ->
//Use the following to compute size based on speed:
PathPoint(current.x, current.y, size = 3f)
}

override val stylusCalculator: Calculator = { previous, current, next ->
//Use the following to compute size based on speed:
PathPoint(current.x, current.y, size = 3f)
}
}

選択

次のような操作でインクストロークを加工する必要がある場合、

  • 平行移動
  • 回転
  • 倍率変更

主に投げ縄ツールを使用して、ストロークの一部または全部を選択します。 当社ではこのテクノロジーにより、ストロークの部分選択と全選択を区別しています。

部分選択

この場合にも、ツールの定義が必要です。

class SelectorPartialStrokeTool : VectorTool() {

companion object {
val uri = "tool@selector_parcial_stroke"
}

override var brush = BrushPalette.basic()

override fun getLayout(): PathPointLayout {
return PathPointLayout(
PathPoint.Property.X,
PathPoint.Property.Y,
PathPoint.Property.SIZE,
PathPoint.Property.RED,
PathPoint.Property.GREEN,
PathPoint.Property.BLUE
)
}

override var drawingMode = DrawingMode.SELECTING_PARTIAL_STROKE

override val touchCalculator: Calculator = { previous, current, next ->
// Use the following to compute size based on speed:
PathPoint(current.x, current.y, size = 3f, red = 1f, green = 1f, blue = 1f)
}

override val stylusCalculator: Calculator = { previous, current, next ->
// Use the following to compute size based on speed:
PathPoint(current.x, current.y, size = 3f, red = 1f, green = 1f, blue = 1f)
}
}

全ストロークセレクタ

class SelectorWholeStrokeTool : VectorTool() {

companion object {
val uri = "tool@selector_whole_stroke"
}

override var brush = BrushPalette.basic()

override fun getLayout(): PathPointLayout {
return PathPointLayout(
PathPoint.Property.X,
PathPoint.Property.Y,
PathPoint.Property.SIZE,
PathPoint.Property.RED,
PathPoint.Property.GREEN,
PathPoint.Property.BLUE
)
}

override var drawingMode = DrawingMode.SELECTING_WHOLE_STROKE

override val touchCalculator: Calculator = { previous, current, next ->
//Use the following to compute size based on speed:
PathPoint(current.x, current.y, size = 3f, red = 1f, green = 1f, blue = 1f)
}

override val stylusCalculator: Calculator = { previous, current, next ->
//Use the following to compute size based on speed:
PathPoint(current.x, current.y, size = 3f, red = 1f, green = 1f, blue = 1f)
}
}