Usage with Freetype, wrong values returned

Jorn Vernee jorn.vernee at oracle.com
Mon Nov 13 11:17:21 UTC 2023


P.S. FWIW, jextract should generate an FT_CharMap layout in freetype_h 
as well that you could use instead of POINTER:

         // Let's now iterate over the structs and print the encoding 
(which is problematic)
         MemorySegment arrPointer = FT_FaceRec.charmaps$get(faceMemory);
         arrPointer
             .reinterpret(FT_CharMap.byteSize() * num) // it's an array 
of FT_CharMap
             .elements(FT_CharMap) // the elements are FT_CharMaps
             .map(s -> s.get(FT_CharMap, 0)) // 's' is a slice of the 
array. Get an FT_CharMapfrom the array
             .forEach(Test::printCharMap);

Jorn

On 13/11/2023 11:59, Jorn Vernee wrote:
>
> Hey Alessandro,
>
> I think there is a bug in this section of your code:
>
>         // Let's now iterate over the structs and print the encoding 
> (which is problematic)
>         MemorySegment arrPointer = FT_FaceRec.charmaps$get(faceMemory);
>         arrPointer.get(POINTER, 0)
>             .reinterpret(FT_CharMapRec_.$LAYOUT().byteSize() * num)
>             .elements(FT_CharMapRec_.$LAYOUT())
>             .forEach(Test::printCharMap);
>
> Looking at the documentation: [1], [2]. The 'charmaps' field of a face 
> is an array of _pointers_ to FT_CharMapRec_ (note that FT_CharMap is a 
> pointer to a FT_CharMapRec_), not an array of FT_CharMapRec_. Your 
> code, however, is getting the pointer to the first struct from the 
> array, and then reinterpreting that pointer as an array of structs, 
> while it's actually just a pointer to a single FT_CharMapRec_ struct 
> (not an array). That explains why the first element looks valid, but 
> the second doesn't.
>
> Treating the array as an array of pointers instead, I think this 
> should work:
>
>         // Let's now iterate over the structs and print the encoding 
> (which is problematic)
>         MemorySegment arrPointer = FT_FaceRec.charmaps$get(faceMemory);
>         arrPointer
>             .reinterpret(POINTER.byteSize() * num) // it's an array of 
> pointers
>             .elements(POINTER) // the elements are pointers
>             .map(s -> s.get(POINTER, 0)) // 's' is a slice of the 
> array. Get a pointer to a struct from the array
>             .forEach(Test::printCharMap);
>
> HTH,
> Jorn
>
> [1]: 
> https://freetype.org/freetype2/docs/reference/ft2-face_creation.html#ft_facerec
> [2]: 
> https://freetype.org/freetype2/docs/reference/ft2-character_mapping.html#ft_charmap
>
> On 13/11/2023 11:11, Alessandro Parisi wrote:
>> Hello everyone,
>> In the recent weeks, I've been experimenting with Project Panama on 
>> JDK 21. I'm trying to create a wrapper for the Freetype font library 
>> written in C, but I'm having some issues, probably because I still 
>> don't understand very well the FFM API.
>> While using the code generated by JExtract, I noticed that it fails 
>> to parse the /charmaps/ array from the FT_FaceRec 
>> <https://freetype.org/freetype2/docs/reference/ft2-face_creation.html#ft_facerec> struct. 
>> With the TTF font, I'm testing, there are two /charmaps/, the values 
>> of the first one are the same printed by the native code too, but for 
>> the second, the values are completely randomic
>> Here is a little reproducer: FreetypeMRE 
>> <https://www.dropbox.com/scl/fi/gitugnyxe3kyomm4m0pke/FreetypeMRE.zip?rlkey=tvnrsb5ernwasmxj6cgrjyqqq&dl=0>
>> Running the Test class will print the two /charmaps/. There is also a 
>> little .exe I built to check the output of native code, it's located 
>> in the src/native directory (there is also the C src code)
>> Am I doing something wrong, or is this a bug?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20231113/abbfcf3c/attachment-0001.htm>


More information about the panama-dev mailing list