[MacRuby-devel] How to set up and retrieve returned buffer from CTFrameGetLineOrigins?
Laurent Sansonetti
lsansonetti at apple.com
Thu May 6 20:03:18 PDT 2010
Hi Paul,
On May 6, 2010, at 7:59 PM, Paul Howson wrote:
> I need some help with this example which arises at the boundary between MacRuby and the C Core Text framework.
>
> Consider the following Core Text function definition:
>
> void CTFrameGetLineOrigins( CTFrameRef frame, CFRange range, CGPoint origins[] )
>
> The third argument is defined as:
>
> "origins
> The buffer to which the origins are copied. The buffer must have at least as many elements as specified by range's length."
>
> Clearly origins is a buffer and a series of CGPoint structures are copied into it.
>
> How can this be handled in MacRuby? Specifically:
>
> 1. What kind of argument should be passed? Presumably something constructed using the Pointer.new_with_type() function? Documentation on this function is very hard to find.
You're right, the Pointer class must be used. Sorry about the lack of documentation. Here is a snippet that might work:
# n must be defined
origins = Pointer.new(CGPoint.type, n) # this builds a pointer to n times CGPoint
CTFrameGetLineOrigins(frame, CFRange.new(0, n), origins)
> 2. How to access the individual CGPoints in the returned buffer? This is not an Objective-C / MacRuby array object. It is just an address to a buffer. Easy to do in C, but how to do in MacRuby?
Using Pointer#[] you can simply dereference a given slot in the pointer, as in C.
n.times { |i| p origins[i] } # should print nth points
Let me know if this works or not for you.
Laurent
More information about the MacRuby-devel
mailing list