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
_______________________________________________
HarfBuzz mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to