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

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.

> 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.



First, though, I'll restrict myself to gtk and make both a Cairo 
context and a Pango context from a gtk window, and hope they will work 
together.  That's a workaround that leaves out the possibility of 
making pdf's.  But I'll have *something* working.


I've noticed a numer of functions that ask if the Cairo context has 
changed that belongs to a Pango context, which suggests that they 
do need  to be connected.  Maybe there's a way to get a Cairo context 
from a Pango context.  That's a workaround.  Might not work if I ever 
need multipls Pango contexts to work with one Cairo same context, which 
I believe *is* part of the intended usage of Pango.

> 
> Or you can create an issue on a cairo2 issue tracker. 

Where do I find the issue tracker?

-- hendrik

  reply	other threads:[~2015-08-03 18:03 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 [this message]
2015-08-03 18:46       ` Ivan

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=20150803180353.GA31467@topoi.pooq.com \
    --to=hendrik@topoi.pooq.com \
    --cc=caml-list@inria.fr \
    /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).