[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