// Copyright (c) 2018 The OTS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
for (size_t i = 0; i < this->axisValueCount; i++) {
table.set_offset(this->offsetToAxisValueOffsets + i * sizeof(uint16_t));
uint16_t axisValueOffset; if (!table.ReadU16(&axisValueOffset)) { return Drop("Failed to read axis value offset");
} // We already checked that offsetToAxisValueOffsets doesn't exceed length, // so this subtraction will not underflow. if (axisValueOffset > length - this->offsetToAxisValueOffsets) { return Drop("Invalid axis value offset");
}
table.set_offset(this->offsetToAxisValueOffsets + axisValueOffset);
uint16_t format; if (!table.ReadU16(&format)) { return Drop("Failed to read axis value format");
}
this->axisValues.emplace_back(format); auto& axisValue = axisValues[i]; switch (format) { case 1: if (!table.ReadU16(&axisValue.format1.axisIndex) ||
!table.ReadU16(&axisValue.format1.flags) ||
!table.ReadU16(&axisValue.format1.valueNameID) ||
!table.ReadS32(&axisValue.format1.value)) { return Drop("Failed to read axis value (format 1)");
} if (axisValue.format1.axisIndex >= this->designAxisCount) { return Drop("Axis index out of range");
} if ((axisValue.format1.flags & 0xFFFCu) != 0) {
Warning("Unexpected axis value flags");
axisValue.format1.flags &= ~0xFFFCu;
} if (!ValidateNameId(axisValue.format1.valueNameID)) { returntrue;
} break; case 2: if (!table.ReadU16(&axisValue.format2.axisIndex) ||
!table.ReadU16(&axisValue.format2.flags) ||
!table.ReadU16(&axisValue.format2.valueNameID) ||
!table.ReadS32(&axisValue.format2.nominalValue) ||
!table.ReadS32(&axisValue.format2.rangeMinValue) ||
!table.ReadS32(&axisValue.format2.rangeMaxValue)) { return Drop("Failed to read axis value (format 2)");
} if (axisValue.format2.axisIndex >= this->designAxisCount) { return Drop("Axis index out of range");
} if ((axisValue.format2.flags & 0xFFFCu) != 0) {
Warning("Unexpected axis value flags");
axisValue.format1.flags &= ~0xFFFCu;
} if (!ValidateNameId(axisValue.format2.valueNameID)) { returntrue;
} if (!(axisValue.format2.rangeMinValue <= axisValue.format2.nominalValue &&
axisValue.format2.nominalValue <= axisValue.format2.rangeMaxValue)) {
Warning("Bad axis value range or nominal value");
} break; case 3: if (!table.ReadU16(&axisValue.format3.axisIndex) ||
!table.ReadU16(&axisValue.format3.flags) ||
!table.ReadU16(&axisValue.format3.valueNameID) ||
!table.ReadS32(&axisValue.format3.value) ||
!table.ReadS32(&axisValue.format3.linkedValue)) { return Drop("Failed to read axis value (format 3)");
} if (axisValue.format3.axisIndex >= this->designAxisCount) { return Drop("Axis index out of range");
} if ((axisValue.format3.flags & 0xFFFCu) != 0) {
Warning("Unexpected axis value flags");
axisValue.format3.flags &= ~0xFFFCu;
} if (!ValidateNameId(axisValue.format3.valueNameID)) { returntrue;
} break; case 4: if (this->minorVersion < 2) { return Drop("Invalid table minorVersion for format 4 axis values: %d", this->minorVersion);
} if (!table.ReadU16(&axisValue.format4.axisCount) ||
!table.ReadU16(&axisValue.format4.flags) ||
!table.ReadU16(&axisValue.format4.valueNameID)) { return Drop("Failed to read axis value (format 4)");
} if (axisValue.format4.axisCount > this->designAxisCount) { return Drop("Axis count out of range");
} if ((axisValue.format4.flags & 0xFFFCu) != 0) {
Warning("Unexpected axis value flags");
axisValue.format4.flags &= ~0xFFFCu;
} if (!ValidateNameId(axisValue.format4.valueNameID)) { returntrue;
} for (unsigned j = 0; j < axisValue.format4.axisCount; j++) {
axisValue.format4.axisValues.emplace_back(); auto& v = axisValue.format4.axisValues[j]; if (!table.ReadU16(&v.axisIndex) ||
!table.ReadS32(&v.value)) { return Drop("Failed to read axis value");
} if (v.axisIndex >= this->designAxisCount) { return Drop("Axis index out of range");
}
} break; default: return Drop("Unknown axis value format");
}
}
if (this->designAxisCount > 0) { if (out->Tell() - tableStart != this->designAxesOffset) { return Error("Error computing designAxesOffset");
}
}
for (unsigned i = 0; i < this->designAxisCount; i++) { constauto& axis = this->designAxes[i]; if (!out->WriteU32(axis.axisTag) ||
!out->WriteU16(axis.axisNameID) ||
!out->WriteU16(axis.axisOrdering)) { return Error("Failed to write design axis");
}
}
if (this->axisValueCount > 0) { if (out->Tell() - tableStart != this->offsetToAxisValueOffsets) { return Error("Error computing offsetToAxisValueOffsets");
}
}
uint32_t axisValueOffset = this->axisValueCount * sizeof(uint16_t); for (unsigned i = 0; i < this->axisValueCount; i++) { constauto& value = this->axisValues[i]; if (!out->WriteU16(axisValueOffset)) { return Error("Failed to write axis value offset");
}
axisValueOffset += value.Length();
} for (unsigned i = 0; i < this->axisValueCount; i++) { constauto& value = this->axisValues[i]; if (!out->WriteU16(value.format)) { return Error("Failed to write axis value");
} switch (value.format) { case 1: if (!out->WriteU16(value.format1.axisIndex) ||
!out->WriteU16(value.format1.flags) ||
!out->WriteU16(value.format1.valueNameID) ||
!out->WriteS32(value.format1.value)) { return Error("Failed to write axis value");
} break; case 2: if (!out->WriteU16(value.format2.axisIndex) ||
!out->WriteU16(value.format2.flags) ||
!out->WriteU16(value.format2.valueNameID) ||
!out->WriteS32(value.format2.nominalValue) ||
!out->WriteS32(value.format2.rangeMinValue) ||
!out->WriteS32(value.format2.rangeMaxValue)) { return Error("Failed to write axis value");
} break; case 3: if (!out->WriteU16(value.format3.axisIndex) ||
!out->WriteU16(value.format3.flags) ||
!out->WriteU16(value.format3.valueNameID) ||
!out->WriteS32(value.format3.value) ||
!out->WriteS32(value.format3.linkedValue)) { return Error("Failed to write axis value");
} break; case 4: if (!out->WriteU16(value.format4.axisCount) ||
!out->WriteU16(value.format4.flags) ||
!out->WriteU16(value.format4.valueNameID)) { return Error("Failed to write axis value");
} for (unsigned j = 0; j < value.format4.axisValues.size(); j++) { if (!out->WriteU16(value.format4.axisValues[j].axisIndex) ||
!out->WriteS32(value.format4.axisValues[j].value)) { return Error("Failed to write axis value");
}
} break; default: return Error("Bad value format");
}
}
returntrue;
}
} // namespace ots
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.12Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.