diff --git a/src/pixie/fontformats/opentype.nim b/src/pixie/fontformats/opentype.nim
index 536b89b..24e8814 100644
--- a/src/pixie/fontformats/opentype.nim
+++ b/src/pixie/fontformats/opentype.nim
@@ -495,10 +495,10 @@ proc parseHheaTable(buf: string, offset: int): HheaTable =
   result.caretSlopeRise = buf.readInt16(offset + 18).swap()
   result.caretSlopeRun = buf.readInt16(offset + 20).swap()
   result.caretOffset = buf.readInt16(offset + 22).swap()
-  discard buf.readUint16(offset + 24).swap() # Reserved, discard
-  discard buf.readUint16(offset + 26).swap() # Reserved, discard
-  discard buf.readUint16(offset + 28).swap() # Reserved, discard
-  discard buf.readUint16(offset + 30).swap() # Reserved, discard
+  # discard buf.readUint16(offset + 24).swap() # Reserved
+  # discard buf.readUint16(offset + 26).swap() # Reserved
+  # discard buf.readUint16(offset + 28).swap() # Reserved
+  # discard buf.readUint16(offset + 30).swap() # Reserved
   result.metricDataFormat = buf.readInt16(offset + 32).swap()
   if result.metricDataFormat != 0:
     failUnsupported()
@@ -848,8 +848,8 @@ proc parseCoverage(buf: string, offset: int): Coverage =
 
       result.rangeRecords.setLen(result.rangeCount.int)
       for j in 0 ..< result.rangeCount.int:
-        result.rangeRecords[j] =
-          parseRangeRecord(buf, i + j * sizeof(RangeRecord))
+        result.rangeRecords[j] = parseRangeRecord(buf, i)
+        i += 6
 
       for rangeRecord in result.rangeRecords:
         var ci = rangeRecord.startCoverageIndex.int
@@ -860,10 +860,13 @@ proc parseCoverage(buf: string, offset: int): Coverage =
     else:
       failUnsupported()
 
+proc valueFormatSize(valueFormat: uint16): int {.inline.} =
+  countSetBits(valueFormat) * 2
+
 proc parseValueRecord(
   buf: string, offset: int, valueFormat: uint16
 ): ValueRecord =
-  buf.eofCheck(offset + countSetBits(valueFormat) * 2)
+  buf.eofCheck(offset + valueFormatSize(valueFormat))
 
   var i = offset
   if (valueFormat and 0b1) != 0:
@@ -902,8 +905,8 @@ proc parsePairValueRecord(
   i += 2
 
   result.valueRecord1 = parseValueRecord(buf, i, valueFormat1)
-  result.valueRecord2 =
-    parseValueRecord(buf, i + countSetBits(valueFormat1) * 2, valueFormat2)
+  i += valueFormatSize(valueFormat1)
+  result.valueRecord2 = parseValueRecord(buf, i, valueFormat2)
 
 proc parsePairSet(
   buf: string, offset: int, valueFormat1, valueFormat2: uint16
@@ -916,41 +919,37 @@ proc parsePairSet(
   i += 2
 
   let pairValueRecordSize =
-      2 + (countSetBits(valueFormat1) + countSetBits(valueFormat2)) * 2
+    2 + valueFormatSize(valueFormat1) + valueFormatSize(valueFormat2)
 
   result.pairValueRecords.setLen(result.pairValueCount.int)
   for j in 0 ..< result.pairValueCount.int:
-    result.pairValueRecords[j] = parsePairValueRecord(
-      buf, i, valueFormat1, valueFormat2
-    )
+    result.pairValueRecords[j] =
+      parsePairValueRecord(buf, i, valueFormat1, valueFormat2)
     i += pairValueRecordSize
 
 proc parseClass2Record(
   buf: string, offset: int, valueFormat1, valueFormat2: uint16
 ): Class2Record =
-  let class2RecordSize = (
-    countSetBits(valueFormat1) + countSetBits(valueFormat2)
-  ) * 2
-  buf.eofCheck(offset + class2RecordSize)
-  result.valueRecord1 = parseValueRecord(buf, offset, valueFormat1)
-  result.valueRecord2 = parseValueRecord(
-    buf, offset + countSetBits(valueFormat1) * 2, valueFormat2
+  var i = offset
+
+  buf.eofCheck(
+    i + valueFormatSize(valueFormat1) + valueFormatSize(valueFormat2)
   )
 
+  result.valueRecord1 = parseValueRecord(buf, i, valueFormat1)
+  i += valueFormatSize(valueFormat1)
+  result.valueRecord2 = parseValueRecord(buf, i, valueFormat2)
+
 proc parseClass1Record(
   buf: string, offset: int, valueFormat1, valueFormat2, class2Count: uint16
 ): Class1Record =
   var i = offset
 
-  let class2RecordSize = (
-    countSetBits(valueFormat1) + countSetBits(valueFormat2)
-  ) * 2
-
   result.class2Records.setLen(class2Count.int)
   for j in 0 ..< class2Count.int:
     result.class2Records[j] =
       parseClass2Record(buf, i, valueFormat1, valueFormat2)
-    i += class2RecordSize
+    i += valueFormatSize(valueFormat1) + valueFormatSize(valueFormat2)
 
 proc parseClassRangeRecord(buf: string, offset: int): ClassRangeRecord =
   buf.eofCheck(offset + 6)
@@ -987,7 +986,7 @@ proc parseClassDef(buf: string, offset: int): ClassDef =
       result.classRangeRecords.setLen(result.classRangeCount.int)
       for j in 0 ..< result.classRangeCount.int:
         result.classRangeRecords[j] = parseClassRangeRecord(buf, i)
-        i += sizeof(ClassRangeRecord)
+        i += 6
     else:
       failUnsupported()
 
@@ -1066,9 +1065,9 @@ proc parsePairPos(buf: string, offset: int): PairPos =
 
       i += 14
 
-      let class2RecordSize = (
-        countSetBits(result.valueFormat1) + countSetBits(result.valueFormat2)
-      ) * 2
+      let class2RecordSize =
+        valueFormatSize(result.valueFormat1) +
+        valueFormatSize(result.valueFormat2)
 
       result.class1Records.setLen(result.class1Count.int)
       for j in 0 ..< result.class1Count.int:
@@ -1196,7 +1195,7 @@ proc parseGposTable(buf: string, offset: int): GPOSTable =
   result.lookupList =
     parseLookupList(buf, offset + result.lookupListOffset.int, result)
 
-proc getGlyphId(opentype: OpenType, rune: Rune): uint16 =
+proc getGlyphId(opentype: OpenType, rune: Rune): uint16 {.inline.} =
   if rune in opentype.cmap.runeToGlyphId:
     result = opentype.cmap.runeToGlyphId[rune]
   else:
@@ -1455,7 +1454,7 @@ proc parseGlyph(opentype: OpenType, glyphId: uint16): Path =
   else:
     parseGlyphPath(opentype.buf, i, numberOfContours)
 
-proc parseGlyph(opentype: OpenType, rune: Rune): Path =
+proc parseGlyph(opentype: OpenType, rune: Rune): Path {.inline.} =
   opentype.parseGlyph(opentype.getGlyphId(rune))
 
 proc getGlyphPath*(opentype: OpenType, rune: Rune): Path =