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是可选项,提供视觉辅助,以方便调试,或高亮显示包含可单击选项的相关区域。 仅当节点的type为CHUNK时,属性chunkFromIndex和chunkToIndex才会与子索引有关。

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