caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Ivan <ivg@ieee.org>
To: Hendrik Boom <hendrik@topoi.pooq.com>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Using Pango with Cairo in Ocaml
Date: Mon, 03 Aug 2015 14:46:04 -0400	[thread overview]
Message-ID: <87k2tctdlf.fsf@ieee.org> (raw)
In-Reply-To: <20150803180353.GA31467@topoi.pooq.com> (Hendrik Boom's message of "Mon, 3 Aug 2015 14:03:53 -0400")

Hendrik Boom <hendrik@topoi.pooq.com> writes:

> On Mon, Aug 03, 2015 at 09:00:11AM -0400, Ivan wrote:
>> Ivan Gotovchits <ivg@ieee.org> writes:
>> 
>> >  
>> >
>> >
>> >
>> >> On Aug 2, 2015, at 9:46 PM, Hendrik Boom <hendrik@topoi.pooq.com> wrote:
>> >> 
>> >> I'm writing here because I seem to have exhausted the wisdom of the 
>> >> ocam-beginners mailing list.  If there's a better place for me to have 
>> >> sent this, and there probably is, please let me know.
>> >> 
>> >> 
>> >> I'm trying to use Pango with Cairo, and to do it in OCaml.
>> >> 
>> >> I have an example written in C, that draws a multicoloured wheel of 
>> >> copies of the word "text".  I got it from
>> >> https://developer.gnome.org/pango/stable/pango-Cairo-Rendering.html
>> >> 
>> >> It works fine in C.
>> >> 
>> >> But I'm running into a snag with the OCaml conversion.
>> >> 
>> >> To make a layout, Pango wants to use a value of type Pango.context, and 
>> >> all I have from Cairo is a value of type Cairo.context.
>> >> 
>> >> There seems to be no way to obtain a Pango context from a Cairo 
>> >> context.
>> >> 
>> >> The obvious thing would seem to be to look at the C code to see what it 
>> >> did, and look for the corresponding function in the OCaml library 
>> >> source.
>> >> 
>> >> But it turns out the C code just uses the Cairo context as a Pango 
>> >> context without any conversion at all.  Pango, apparently, will just 
>> >> talk to a Cairo context as if it were a Pango context.  Presumably 
>> >> that's the normal way to use Cairo in C.
>> >> 
>> >> Now I'm not just saying that in the working C code, the Pango context 
>> >> and the Cairo context are the same type; that would be meaningless 
>> >> because both aree of the general-purpose gobject type.  I'm saying they 
>> >> are the same *value*, i.e., the same pointer, pointing to the same 
>> >> thing.
>> >> 
>> >> My immediate question is thus, how to I get Pango.context from a 
>> >> Cairo.context.  I seem to want a type change in OCaml without a change 
>> >> in value.
>> >
>> > There is an unsafe way to do this, that you should only do, if you
>> > understand, what you're doing. It is a typecasting in fact:
>> >
>> >     external pango_of_cairo : Cairo.context -> Pango.context = "%identity"
>> >
>> > This will define a function that will create (typecast) pango context from a cairo. 
>> >
>> > If underneath they're different type, then at best you will get segfault. 
>> 
>> I checked the source code, and it looks to me, that the types are
>> different, so it wouldn't be safe to use this conversion.
>
> So even though the same pointer works in C, the OCaml binding makes a 
> distinction, presumably in the direction of sanity, stability, and 
> readability of code.  I've heard C programmers curse GTK's statically 
> typeless object system as worse thann even C's pretence of static 
> typing.  Maybe that's relevant.

Yep, underneath the hood, this two libraries just store different data
structures. 

>> Looks like, that currently cairo library doesn't support this
>> functionality, i.e., there is no way to get pango context from cairo.
>> 
>> You can fix this, by stubbing `pango_cairo_create_context` function
>> directly or using OCaml cstubs library.
>
> I don't yet understand enough about OCaml, Pango, and Cairo to do this 
> myself.  More study definitely needed.  For example, I still don't 
> undersand the declaration
>
> type context
>
> I found on line 100 of cairo2.0.4.6/src/cairo.ml.
> It seems to me that a type declaration should, for exapmle, say what 
> the type is.  Such a thing might make sense in an interface definition 
> where you want to hide the details from the programmer....
> Evidently I still have much to learn.
>

That's part is easy.

type void 

declares an uninhabited type. That means, that it is impossible to
create a regular ocaml value of that type (if we forget about bottom
type of expressions that don't terminate normally, e.g., exceptions).

It is a pretty normal OCaml declaration, and is useful, for example, to
declare phantom types.

But it is also used when one binds foreign code (written not in OCaml).
When you introduce an external function to OCaml, it has no other
choices but to believe, that the function has the type, that you've
specified. For example,

type context

external create_context : unit -> context = "my_c_stub"

declares, that my_c_stub is a C-stub function, that accepts an OCaml
value of type unit, and return an OCaml value of type context. Even,
since it declared as uninhabited, it is indeed inhabited with some C
data type, like `GObject *`. 

>> 
>> Or you can create an issue on a cairo2 issue tracker. 
>
> Where do I find the issue tracker?

I suspect this is a good place to start:
http://cairo.forge.ocamlcore.org/

Not sure whether it is alive. 

You can also try to contact library authors:

Christophe Troestler <Christophe.Troestler@umons.ac.be>, 
Pierre Hauweele <antegallya@gmail.com>


      reply	other threads:[~2015-08-03 18:44 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-03  1:46 Hendrik Boom
2015-08-03 10:52 ` Ivan Gotovchits
2015-08-03 13:00   ` Ivan
2015-08-03 18:03     ` Hendrik Boom
2015-08-03 18:46       ` Ivan [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87k2tctdlf.fsf@ieee.org \
    --to=ivg@ieee.org \
    --cc=caml-list@inria.fr \
    --cc=hendrik@topoi.pooq.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).