[HarfBuzz] What is the correct usage of hb_feature_from_string()?

York Todd tjysunset at outlook.com
Fri Jul 20 18:04:37 UTC 2018


Hello everyone,

I'm trying to make a(nother) C# binding for HarfBuzz, and having some troubles with hb_feature_from_string().

Here's how I called it in C#:

```

// platform invoke<https://github.com/TJYSunset/HardFuzz/blob/d3fb178d69e8a88e616c7f3a778978b062b99c6d/HardFuzz/PlatformInvoke/Api.Shape.cs#L11>

[DllImport(HarfBuzzDll, CallingConvention = Cdecl)]
public static extern bool hb_feature_from_string(byte[] str, int length, out Feature feature);


// definition of "Feature"<https://github.com/TJYSunset/HardFuzz/blob/d3fb178d69e8a88e616c7f3a778978b062b99c6d/HardFuzz/HarfBuzz/Feature.cs>

[StructLayout(LayoutKind.Sequential)]
public struct Feature
{
    private uint _tag;
    public uint Value;
    public uint Start;
    public uint End;
}


// calling hb_feature_to_string (unit test<https://github.com/TJYSunset/HardFuzz/blob/d3fb178d69e8a88e616c7f3a778978b062b99c6d/HardFuzz.Test/ShapeTests/Tests.cs#L44> -> constructor<https://github.com/TJYSunset/HardFuzz/blob/d3fb178d69e8a88e616c7f3a778978b062b99c6d/HardFuzz/HarfBuzz/Feature.cs#L23>)

var bytes = Encoding.ASCII.GetBytes("valt");
if (!Api.hb_feature_from_string(bytes, bytes.Length, out var feature)) throw new ArgumentException();

```

then the ArgumentException was thrown<https://ci.appveyor.com/project/TJYSunset/hardfuzz/build/0.1.3/tests>, meaning hb_feature_from_string returned false. Also, calling hb_feature_to_string() on the returned `Feature` will result in a random string varying each run, as if read from a wild pointer. However, somehow the `_tag` can be successfully DETAGed as "valt".

From my experience,

  *   platform invoke definition is unlikely to blame; the `out` keyword and the usage of `byte[]` for marshaling `char *` proved to work in other API calls.
  *   maybe the definition of `struct Feature` is incorrect; I had to define hb_glyph_info_t<https://github.com/TJYSunset/HardFuzz/blob/d3fb178d69e8a88e616c7f3a778978b062b99c6d/HardFuzz/HarfBuzz/Buffer/GlyphInfo.cs#L10> and hb_glyph_position_t<https://github.com/TJYSunset/HardFuzz/blob/d3fb178d69e8a88e616c7f3a778978b062b99c6d/HardFuzz/HarfBuzz/Buffer/GlyphPosition.cs#L10> as 20-byte-long struct for them to work, even if they only have three or four uint32s. But tried Size=20 with no luck.
  *   the passed string is unlikely to be incorrect according to this third-party documentation<https://github.com/ufyTeX/luaharfbuzz/wiki/Feature-Strings> and my glance at hb-common.cc.

I'm wondering, what part of this process is wrong?

Again, thank you in advance!

Todd

--
Todd J. York (pseudonym)
zh-Hans-CN, en-US | UTC+08:00
Sent from Thunderbird
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/harfbuzz/attachments/20180720/fa35e5ca/attachment.html>


More information about the HarfBuzz mailing list