From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id E2A917EEBF for ; Mon, 3 Aug 2015 20:03:49 +0200 (CEST) Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of hendrik@topoi.pooq.com) identity=pra; client-ip=69.165.131.134; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="hendrik@topoi.pooq.com"; x-sender="hendrik@topoi.pooq.com"; x-conformance=sidf_compatible Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of hendrik@topoi.pooq.com) identity=mailfrom; client-ip=69.165.131.134; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="hendrik@topoi.pooq.com"; x-sender="hendrik@topoi.pooq.com"; x-conformance=sidf_compatible Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of postmaster@april.topoi.pooq.com) identity=helo; client-ip=69.165.131.134; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="hendrik@topoi.pooq.com"; x-sender="postmaster@april.topoi.pooq.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0BbCABzrL9V/4aDpUVSCRkBAQGDUkUkvH+BYYV5AoIAAQEBAQEBgQuEIwEBAQECAScTNBALCxgJJQ8FGESIJggNylkBAQgCIIpNgQKEJAhjgxiBFAWUeYR7h08CT3hGg1qTYSaCDhyBbyIxAYJLAQEB X-IPAS-Result: A0BbCABzrL9V/4aDpUVSCRkBAQGDUkUkvH+BYYV5AoIAAQEBAQEBgQuEIwEBAQECAScTNBALCxgJJQ8FGESIJggNylkBAQgCIIpNgQKEJAhjgxiBFAWUeYR7h08CT3hGg1qTYSaCDhyBbyIxAYJLAQEB X-IronPort-AV: E=Sophos;i="5.15,603,1432591200"; d="scan'208";a="141930868" Received: from topoi.pooq.com (HELO april.topoi.pooq.com) ([69.165.131.134]) by mail3-smtp-sop.national.inria.fr with ESMTP; 03 Aug 2015 20:03:48 +0200 Received: by april.topoi.pooq.com (Postfix, from userid 1001) id 54F281A0349; Mon, 3 Aug 2015 14:03:53 -0400 (EDT) Date: Mon, 3 Aug 2015 14:03:53 -0400 From: Hendrik Boom To: caml-list@inria.fr Message-ID: <20150803180353.GA31467@topoi.pooq.com> References: <20150803014654.GA30848@topoi.pooq.com> <5EF3DBC5-DA38-44C9-AFEC-F5E009D869E8@ieee.org> <87oaiottlw.fsf@ieee.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87oaiottlw.fsf@ieee.org> User-Agent: Mutt/1.5.21 (2010-09-15) Subject: Re: [Caml-list] Using Pango with Cairo in Ocaml On Mon, Aug 03, 2015 at 09:00:11AM -0400, Ivan wrote: > Ivan Gotovchits writes: > > > > > > > > > > >> On Aug 2, 2015, at 9:46 PM, Hendrik Boom 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