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
next prev parent 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).