Skip to main content

编码

Universal Ink Model被序列化为Protocol Buffers v3 message,包含在RIFF container.中 下面的章节描述了容器和protobuf序列化方案。

RIFF Container

Universal Ink Model (UIM)被序列化为RIFF container,包含在@@@中RIFF chunk UIM3. 该数据块包含两个子数据块,分别是HEAD和DATA。 HEAD数据块包含最新版的规范。 该版本使用3字节编码,定义如下:[major-version]-[minor-version]-[patch-version]

如第8.2节“Protocol Buffers序列化方案”中所述,墨水模型被序列化为Protocol Buffers消息,保存在DATA数据块中。

Logical Parts of Ink Model.

图1:RIFF 图

Ink Tree

墨水树以一般节点结构构建。 构建树时,depth属性反映树的深度。 对于树结构的序列化,采用深度优先预排序树序列化,如图3所示。

每个节点都有一个唯一标识符id,它与语义语句有关,作为主语的标识符。 index属性关联着路径或传感器数据索引。 groupBoundingBox是可选项,提供视觉辅助,以方便调试,或高亮显示包含可单击选项的相关区域。 仅当节点的typeCHUNK时,属性chunkFromIndexchunkToIndex才会与子索引有关。

Hierarchy of groups

图2:深度优先树顺序(红色):F、B、A、D、C、E、G、I、H。

数据压缩

编码

编码过程如下:

**第1步:(可选)**使用外部指定的小数精度将浮点值转换为整数值:

integerValue = floatValue * (10 ^ decimalPrecision);

Note: 第1步仅适用于不是整数的数据类型(例如,@@@UINT32, UINT64, INT32, or INT64).

**第2步:**对转换值执行增量(Delta)编码:

encodedValues[0] = integerValues[0];
for(i = 1; i < n; i++)
{
encodedValues[i] = integerValues[i] - integerValues[i - 1];
}

**注意:在浮点值和定点(整数)值之间转换时,可能会有精度损失。 如果精度对应用功能极为关键,必须予以考虑。 一个可行的解决方案是通过IEEE 754:执行转换,这种情况下,对于每个被转换的值,都应使用合适的decimalPrecision以及一个在转换过程中保持不变的近似值。

Decoding

要恢复原始值,可按照下面的方法逆转编码过程:

**第1步:**执行增量(Delta)编码,恢复整数值:

integerValues[0] = encodedValues[0];
for(i = 1; i < n; i++)
{
integerValues[i] = integerValues[i - 1] + encodedValues[i];
}

第2步:(可选) Convert integer values to floating-point values using externally-specified decimal precision:

floatValue = integerValue / (10 ^ decimalPrecision)

***注意:***第2步仅适用于不是整数的数据类型。

Protobuf序列化方案

BrushPrototype

刷子的多边形原型定义。

字段类型标签描述
coordXfloat重复刷子原型的x坐标列表。
coordYfloat重复刷子原型的y坐标列表。
coordZfloat重复刷子原型的z坐标列表[用于3D渲染]。
indicesuint32重复刷子原型的索引列表[用于3D渲染]。
shapeURIstring可选唯一标识形状多边形的URI。
sizefloat可选定义路径点的原型大小。

Brushes

用于墨水光栅化所需的刷子描述。

字段类型标签描述
vectorBrushesVectorBrush重复已定义的矢量刷子列表。
rasterBrushesRasterBrush重复已定义的光栅刷子列表。

ChannelData

数据项列表。

字段类型标签描述
sensorChannelIDstring可选通过ID引用墨水传感器通道。
valuessint32重复使用提供的精度增量编码的样本值。

Environment

环境 定义了关于输入环境的所有细节:

  • 操作系统:名称、版本等。
  • 应用程序:名称、版本等。
  • 地理信息:GPS坐标。
字段类型标签描述
idstring可选根据MD5哈希生成的MD5哈希值,符合MD5哈希值唯一标识符生成方案。
propertiesProperty重复环境属性,例如操作系统名称、操作系统版本等。

Float32

浮点值的包装器,用于避免跨平台零值问题。

字段类型标签描述
valuefloat可选消息内部包装的浮点值。

InkData

包含所有墨水数据。

字段类型标签描述
strokesStroke重复用于存储笔画的数据容器。

InkInputProvider

输入提供程序类型的定义。

字段类型标签描述
idstring可选根据MD5哈希值生成,符合MD5哈希值唯一标识符生成方案。
类型InkInputProviderType可选使用的硬件类型 - PEN、TOUCH、MOUSE、或控制器。
propertiesProperty重复InkInputProvider 属性,如 PenID。

InkObject

墨水对象作为捕获所有相关数据的基本结构。

  • 从输入传感器记录的传感器数据
  • 定义所使用的不同刷子类型的刷子配置
  • 具有墨水笔画视觉几何的墨水数据
  • 用于结构化墨水数据的墨水树
  • 描述作者、文档等的元数据
  • 具有语义的知识图
字段类型标签描述
inputDataInputData可选与墨水输入相关数据的数据容器。
inkDataInkData可选与墨水相关的墨水数据的数据容器。
刷子Brushes可选光栅化工具。
inkTreeNode重复墨水树:这是以墨水为中心的数据模型。
视图View重复基于知识图的墨水树的视图列表。
knowledgeGraphTripleStore可选知识图。
变换Matrix4可选变换是应用于所有路径的仿射变换矩阵。
propertiesProperty重复文档相关的属性,如 DOCUMENT、AUTHOR、LAST_MODIFIED等。

InputContext

捕获墨水设备的上下文,参考环境和 SensorContext。

字段类型标签描述
idstring可选根据MD5哈希值生成,符合MD5哈希值唯一标识符生成方案。
environmentIDstring可选参考环境。
sensorContextIDstring可选参考 SensorContext。

InputContextData

上下文和输入定义的容器结构。

字段类型标签描述
inputContextsInputContext重复输入上下文的列表。
inkInputProvidersInkInputProvider重复输入提供程序的列表。
inputDevicesInputDevice重复输入设备的列表。
environmentsEnvironment重复环境设置的列表。
sensorContextsSensorContext重复传感器上下文的列表。

InputData

InputData捆绑输入。

字段类型标签描述
inputContextDataInputContextData可选输入上下文数据。
sensorDataSensorData重复传感器数据的数据容器。

InputDevice

InputDevice 与其属性。

属性可以包括:

  • 通信协议: USB、BTC、BLE、SPP、WIFI
  • 通信ID:VID、PID;MAC;UID;COM_PORT
  • 设备名称: Wacom Intuos Pro M、Apple iPad 8、Samsung GalaxyTab 10
  • 序列号
  • 固件版本(MCU)
  • 次要固件版本 (BT、WIFI)-不同模块提供其自身的版本
  • 方向: PORTRAIT、LANDSCAPE、PORTRAIT_REVERSE、LANDSCAPE_REVERSE 或 0、90、180、270
  • 传感器尺寸
字段类型标签描述
idstring可选根据MD5哈希值生成,符合MD5哈希值唯一标识符生成方案。
propertiesProperty重复InputDevice 属性。

Matrix4

4x4仿射矩阵的表示

| m00 m01 m02 m03 | | m10 m11 m12 m13 | | m20 m21 m22 m23 | | m30 m31 m32 m33 |

字段类型标签描述
m00float可选
m01float可选
m02float可选
m03float可选
m10float可选
m11float可选
m12float可选
m13float可选
m20float可选
m21float可选
m22float可选
m23float可选
m30float可选
m31float可选
m32float可选
m33float可选

Node

用于定义树结构的节点消息。

字段类型标签描述
idstring可选节点唯一标识符
depthuint32可选在层次结构中的深度
indexuint32可选在InkData.paths 或 InkData.sensorData 数据持有者中的索引
TypeNodeType可选(路径和传感器数据节点仅限)节点类型
groupBoundingBoxRectangle可选边界框(仅适用于组节点)
chunkFromIndexuint32可选块的开始位置(仅限CHUNK节点)
chunkToIndexuint32可选块的结束位置(仅限CHUNK节点)

PathPointProperties

不变的管道属性。变量属性通过Stroke消息进行序列化。

字段类型标签描述
sizeFloat32可选笔刷大小
redFloat32可选红色通道的颜色值[0, 1]
greenFloat32可选绿色通道的颜色值[0, 1]
blueFloat32可选蓝色通道的颜色值[0, 1]
alphaFloat32可选alpha通道的颜色值[0, 1]
rotationFloat32可选笔刷的z轴旋转
scaleXFloat32可选笔刷的x轴缩放
scaleYFloat32可选笔刷的y轴缩放
scaleZFloat32可选笔刷的z轴缩放[用于3D渲染]
offsetXFloat32可选笔刷的x轴偏移
offsetYFloat32可选笔刷的y轴偏移
offsetZFloat32可选笔刷的z轴偏移[用于3D渲染]

Property

编码单个属性

字段类型标签描述
namestring可选属性的名称
valuestring可选属性的值

RasterBrush

使用光栅图像定义的笔刷

字段类型标签描述
namestring可选笔刷描述符。
spacingfloat可选相邻粒子之间的距离。
scatteringfloat可选沿曲线法线的散射。
rotationModeRotationMode可选笔刷的粒子旋转模式。
shapeTexturebytes重复包含形状纹理的PNG图像列表。
shapeTextureURIstring重复与形状纹理关联的URI列表。
fillTexturebytes可选包含填充纹理的PNG图像列表。
fillTextureURIstring可选标识填充纹理的URI。
fillWidthfloat可选填充瓦片的宽度。
fillHeightfloat可选填充瓦片的高度。
randomizeFillbool可选指定填充纹理是否随机位移。
blendModeBlendMode可选应用的混合模式。

Rectangle

矩形的表示形式

字段标签描述
xfloat可选
yfloat可选
widthfloat可选
heightfloat可选

SemanticTriple

语义三元组,或简称三元组,是原子数据实体数据模型。顾名思义,三元组是一组三个实体,以主谓宾表达式的形式编码了关于语义数据的陈述。

字段类型标签描述
subjectstring可选
predicatestring可选
objectstring可选

SensorChannel

关于传感器通道的信息。

支持的通道类型:

  • will:///input/3.0/channel/X
  • will:///input/3.0/channel/Y
  • will:///input/3.0/channel/Z
  • will:///input/3.0/channel/Timestamp
  • will:///input/3.0/channel/Pressure
  • will:///input/3.0/channel/RadiusX
  • will:///input/3.0/channel/RadiusY
  • will:///input/3.0/channel/Altitude
  • will:///input/3.0/channel/Azimuth
  • will:///input/3.0/channel/Rotation
字段类型标签描述
idstring可选根据MD5哈希基于MD5哈希的唯一标识符生成方案。
Typestring可选描述此通道的唯一URI。支持的类型有:
metricInkSensorMetricType可选用户定义的通道应该从用户方提供自定义含义。指示用于计算数据项分辨率的度量。
resolutiondouble可选是一个十进制数,给出数据项增量的数量。
minfloat可选每个物理单位。例如,如果物理单位是米和设备单位。/ 分辨率为100000,那么值150将为0.0015米。通道的最小值。
maxfloat可选通道的最大值。
precisionuint32可选整数编码的精度,用于编码的浮点值。

SensorChannelsContext

传感器通道上下文 SensorChannelsContext 将产生相同采样率的数据的传感器通道分组。

字段类型标签描述
idstring可选根据MD5哈希基于MD5哈希的唯一标识符生成方案。
channelsSensorChannel重复此组中的通道提供相同时间的对齐值。
samplingRateHintUint32可选通道的预期采样率的提示[可选]。
latencyUint32可选毫秒为单位的延迟测量[可选]。
inkInputProviderIDstring可选对InkInputProvider的引用。
inputDeviceIDstring可选对InputDevice的引用。

SensorContext

每个输入设备都有一个SensorContext描述设备的可用传感器。 一个文件可以包含来自两个相同类型设备的Ink数据,它们共享一个上下文。

字段类型标签描述
idstring可选根据MD5哈希基于MD5哈希的唯一标识符生成方案。
sensorChannelsContextSensorChannelsContext重复用于设备传感器通道的分组上下文。

SensorData

SensorData 是用于存储来自墨水传感器的原始数据的核心数据结构。

字段类型标签描述
idstring可选
inputContextIDstring可选通过id引用InputContext。
stateInkState可选墨水的状态。
timestampuint64可选笔画的第一个样本的时间戳,以毫秒为单位测量。
dataChannelsChannelData重复(第一次报告X和Y时的时间)。编码数据列表的数据通道。

Stroke

可视路径结构。 Stroke 最简单的形式包含一个或多个 Segments(Catmull-Rom),其中包括一系列位置点,Positions。 除了这些属性之外,数字墨水笔画还包括起始参数和结束参数作为Stroke实体的属性。

字段类型标签描述
idstring可选内部ID。
startParameterfloat可选样条起始参数[0, 1]。
endParameterfloat可选样条结束参数[0, 1]。
splineXfloat重复X轴的样条值。
splineYfloat重复Y轴的样条值。
splineZfloat重复Z轴的样条值[用于3D渲染]。
redfloat重复红色通道的颜色值[0, 1]。
greenfloat重复绿色通道的颜色值[0, 1]。
bluefloat重复蓝色通道的颜色值[0, 1]。
alphafloat重复Alpha通道的颜色值[0, 1]。
sizefloat重复笔刷大小。
rotationfloat重复笔刷旋转z轴。
scaleXfloat重复笔刷缩放x轴。
scaleYfloat重复笔刷缩放y轴。
scaleZfloat重复笔刷缩放z轴[用于3D渲染]。
offsetXfloat重复笔刷偏移x轴。
offsetYfloat重复笔刷偏移y轴。
offsetZfloat重复笔刷偏移z轴[用于3D渲染]。
sensorDataOffsetuint32可选原始路径和处理后路径之间映射点的索引。
sensorDataIDstring可选引用传感器数据。
sensorDataMappinguint32重复Stroke和SensorData索引之间的显式映射,当输入速率非常高且提供了不需要的点时使用。
styleStyle可选应用于路径的样式。

Style

用于Stroke 自定义的样式消息。

字段类型标签描述
propertiesPathPointProperties可选不针对每个路径点存在的属性的静态值
brushURIstring可选用于笔画光栅化的笔刷的引用。
particlesRandomSeeduint32可选粒子随机种子,用于粒子笔触。
renderModeURIstring可选定义笔画可视化的附加信息,例如 ERASER。

TripleStore

封装了TripleGroups 的列表。

字段类型标签描述
statementsSemanticTriple重复语义三元组的列表。

Uint32

无符号整数值的包装器,用于避免跨平台零值问题。

字段类型标签描述
valueuint32可选包装在消息中的无符号整数值。

VectorBrush

使用多边形(三维情况下为多面体)定义的笔刷。

字段类型标签描述
namestring可选笔刷描述符。
prototypeBrushPrototype重复笔刷的多边形原型。
spacingfloat可选间距值。

View

一个表示墨水树视图的消息,以另一个树的形式进行序列化。

字段类型标签描述
namestring可选视图描述符URI(在模型范围内唯一)。
treeNode重复当前视图的树结构。

BlendMode

混合模式枚举列出了可以应用于光栅笔刷的不同混合模式。

名称数字描述
SOURCE_OVER0这是默认设置,将新形状绘制在现有画布内容之上。也称为 NORMAL。
DESTINATION_OVER1新形状绘制在现有画布内容的后面。也称为 NORMAL_REVERSE。
DESTINATION_OUT2现有内容被保留在不重叠新形状的地方。也称为 ERASE。
LIGHTER3在两个形状重叠的地方,颜色通过添加颜色值来确定。也称为 ADD。
COPY4仅显示新形状。也称为 NONE。
MIN5结果是两种颜色的最小值。结果是较暗的颜色。
MAX6结果是两种颜色的最大值。结果是较亮的颜色。

InkInputProviderType

定义不同输入类型。

名称数字描述
PEN0触控笔、智能笔、笔式显示器、签字捕获设备等。
TOUCH1触控器输入:手指或被动触控笔。
MOUSE2鼠标设备。
CONTROLLER33DOF或6DOF输入设备。

InkSensorMetricType

支持的度量类型。

名称数字描述
LENGTH0底层SI单位为米。
TIME1底层SI单位为秒。
FORCE2底层SI单位为牛顿。
ANGLE3底层SI单位为弧度。
NORMALIZED4百分比,作为相对于最大-最小值的分数(1.0 = 100%)。
LOGICAL5逻辑值,真/假值。
DIMENSIONLESS6传感器未定义度量。

InkState

墨水设备状态定义了墨水设备的状态。WILL 3.0 支持不同的模式:

  • 在平面上书写
  • 在表面上悬停
  • 在空中移动(VR/AR/MR 交互)
  • 仅在空中悬停
名称数字描述
PLANE0墨水设备正在平面上书写。
HOVERING1在表面上悬停。
IN_VOLUME2在空中使用墨水设备,进行主动书写。
VOLUME_HOVERING3在空中移动笔,停用书写功能。

NodeType

定义了节点类型。

名称数字描述
PATH_GROUP0PATH_GROUP 是按层次组合笔画节点。
SENSOR_DATA_GROUP1SENSOR_DATA_GROUP 是按层次组合传感器数据节点。
PATH2PATH 是一个节点类型,其中的节点直接指向笔画。
SENSOR_DATA3SENSOR_DATA 是一个节点类型,其中的节点直接指向传感器数据样本序列。

RotationMode

旋转参数指定了粒子的旋转。

名称数字描述
NONE0表示形状不会旋转。
RANDOM1表示形状在渲染之前将随机旋转。
TRAJECTORY2表示形状将旋转以匹配路径轨迹。

标量数值类型

.proto 类型注释C++ 类型Java 类型Python 类型
doubledoubledoublefloat
floatfloatfloatfloat
int32使用可变长度编码。对于编码负数效率低 - 如果字段可能有负值,请改用 sint32。int32intint
int64使用可变长度编码。对于编码负数效率低 - 如果字段可能有负值,请改用 sint64。int64longint/long
uint32使用可变长度编码。uint32intint/long
uint64使用可变长度编码。uint64longint/long
sint32使用可变长度编码。带符号整数值。与普通 int32 相比,这些编码负数的效率更高。int32intint
sint64使用可变长度编码。带符号整数值。与普通 int64 相比,这些编码负数的效率更高。int64longint/long
fixed32总是四个字节。如果值通常大于 2^28,则比 uint32 更高效。uint32intint
fixed64总是八个字节。如果值通常大于 2^56,则比 uint64 更高效。uint64longint/long
sfixed32总是四个字节。int32intint
sfixed64总是八个字节。int64longint/long
boolboolbooleanboolean
string字符串必须始终包含 UTF-8 编码或 7 位 ASCII 文本。stringStringstr/unicode
bytes可能包含任意字节序列。stringByteStringstr