Font.Builder fontBuilder = fontFactory.loadFontsForBuilding(new FileInputStream("myfont.ttf"))[0];
LocaTable.Builder locaTableBuilder = (LocaTable.Builder) fontBuilder.getTableBuilder(Tag.loca);
GlyphTable.Builder glyphTableBuilder = (GlyphTable.Builder) fontBuilder.getTableBuilder(Tag.glyf);
String x = "X";
String y = "Y";
int xI = new String(x).codePointAt(0); // 88
int yI = new String(y).codePointAt(0); // 89
ReadableFontData gRFD = glyphTableBuilder.data();
WritableFontData gWFD = WritableFontData.createWritableFontData(gRFD);
List<Integer> newLocaList = new ArrayList<Integer>();
int currOffset = 0;
for (int i = 0; i < locaTableBuilder.numGlyphs(); i++) {
newLocaList.add(currOffset);
int j = i;
if (i == xI) {
j = yI;
} else if (i == yI) {
j = xI;
}
int glyphLength = locaTableBuilder.glyphLength(j);
currOffset += glyphLength;
byte[] tmpBs = new byte[glyphLength];
gRFD.readBytes(j, tmpBs, 0, glyphLength);
gWFD.writeBytes(i, tmpBs);
}
locaTableBuilder.setLocaList(newLocaList);
glyphTableBuilder.setLoca(newLocaList);
fontBuilder.getTableBuilder(Tag.glyf).setData(gWFD);
fontBuilder.getTableBuilder(Tag.loca).setData(locaTableBuilder.data());
Font font = fontBuilder.build();