RFR: 8318364: Add an FFM-based implementation of harfbuzz OpenType layout

Maurizio Cimadamore mcimadamore at openjdk.org
Wed Oct 18 23:58:48 UTC 2023


On Tue, 29 Aug 2023 22:04:40 GMT, Phil Race <prr at openjdk.org> wrote:

> 8318364: Add an FFM-based implementation of harfbuzz OpenType layout

src/java.desktop/share/classes/sun/font/HBShaper.java line 110:

> 108: 
> 109:     private static VarHandle getVarHandle(StructLayout struct, String name) {
> 110:         VarHandle h = struct.varHandle(PathElement.groupElement(name));

Note that, strictly speaking, these combiners are _not_ required. If you just call `MemoryLayout::varHandle`, you get back a var handle that takes a `MemorySegment` and a `long` offset. So, you can, if you want, adapt the var handle so that the offset parameter becomes something else. But you could also just leave the var handle as is. Then, in the loop that is doing the access, you can do this:


for (int i = 0 ; i < limit ; i++) {
   x_offsetHandle.get(segment, PositionLayout.scale(0, i));
   y_offsetHandle.get(segment, PositionLayout.scale(0, i));
   ...
}

That is, use the offset hole to your advantage, to pass the struct base offset (obtained by scaling the enclosing struct layout by the value of the loop induction variable).

(That said, I understand that working with logical indices is a common operation, and that this is made a bit harder by the recent API changes. We should consider, as @JornVernee mentioned, adding back a more general `MemoryLayout::arrayElementVarHandle` which will give you the var handle you need - with coordinates `MemorySegment` and `long` - a logical index, not an offset).

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/15476#discussion_r1364702729


More information about the core-libs-dev mailing list