* [Caml-list] Coherent Graphics Product Updates
@ 2012-07-12 13:04 John Whitington
2012-07-12 15:51 ` David MENTRE
0 siblings, 1 reply; 5+ messages in thread
From: John Whitington @ 2012-07-12 13:04 UTC (permalink / raw)
To: caml-list
Hi,
1. A new version of our PDF editor for OS X (PDF manipulation in OCaml,
interface in Objective C):
http://www.coherentpdf.com/proview.html
Should be on the Apple App Store within the next couple of weeks.
2. The latest versions of our PDF command line tools from last year
(/almost/ pure OCaml):
http://www.coherentpdf.com/
3. Not really OCaml-related, but I wrote a book about PDF:
http://shop.oreilly.com/product/0636920021483.do
Also available in Portuguese!
http://novatec.com.br/livros/pdf/
There should be new releases of the command line tools and CamlPDF later
in the year. Our OCaml codebase just exceeded 100,000 lines - not that
that's necessarily a good sign :-)
Thanks,
--
John Whitington
Director, Coherent Graphics Ltd
http://www.coherentpdf.com/
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Caml-list] Coherent Graphics Product Updates
2012-07-12 13:04 [Caml-list] Coherent Graphics Product Updates John Whitington
@ 2012-07-12 15:51 ` David MENTRE
2012-07-12 16:27 ` John Whitington
0 siblings, 1 reply; 5+ messages in thread
From: David MENTRE @ 2012-07-12 15:51 UTC (permalink / raw)
To: John Whitington; +Cc: caml-list
Hello,
2012/7/12 John Whitington <john@coherentgraphics.co.uk>:
> 1. A new version of our PDF editor for OS X (PDF manipulation in OCaml,
> interface in Objective C):
An architectural question: how your backend OCaml part and your
Objective C GUI are communicating between each other?
Sincerely yours,
david
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Caml-list] Coherent Graphics Product Updates
2012-07-12 15:51 ` David MENTRE
@ 2012-07-12 16:27 ` John Whitington
2012-07-12 16:44 ` David MENTRE
0 siblings, 1 reply; 5+ messages in thread
From: John Whitington @ 2012-07-12 16:27 UTC (permalink / raw)
To: David MENTRE; +Cc: caml-list
Hi,
David MENTRE wrote:
> Hello,
>
> 2012/7/12 John Whitington<john@coherentgraphics.co.uk>:
>> 1. A new version of our PDF editor for OS X (PDF manipulation in OCaml,
>> interface in Objective C):
>
> An architectural question: how your backend OCaml part and your
> Objective C GUI are communicating between each other?
It's entirely one-way. Objective C calls OCaml. OCaml never calls
Objective C.
Here's the makefile for the library - this method is straight out of the
OCaml manual.
mklib:
ocamlc.opt cpdfstrftime.mli;
ocamlopt.opt -c -I . unix.cmxa str.cmxa bigarray.cmxa cgutil.cmxa
camlpdf.cmxa cpdfstrftime.ml;
ocamlc.opt cpdf.mli;
ocamlopt.opt -c -I . unix.cmxa str.cmxa bigarray.cmxa cgutil.cmxa
camlpdf.cmxa cpdf.ml;
ocamlc.opt cpdflib.mli;
ocamlopt.opt -c -I . unix.cmxa str.cmxa bigarray.cmxa cgutil.cmxa
camlpdf.cmxa cpdf.cmx cpdflib.ml;
ocamlc.opt cpdflibwrapper.c;
ocamlopt.opt -output-obj -o cpdflib.o unix.cmxa bigarray.cmxa
cgutil.cmxa camlpdf.cmxa cpdfstrftime.cmx cpdf.cmx cpdflib.cmx;
cp /usr/local/lib/ocaml/libasmrun.a cpdflib.a;
ar r cpdflib.a cpdflib.o cpdflibwrapper.o
test: zlibstubs.o cpdflib.a cpdflibc-test.c
cc -c cpdflibc-test.c -o cpdflibc-test.o; \
cc -L'/usr/local/lib/ocaml' -lunix -lbigarray -lz -o test
cpdflibc-test.o zlibstubs.o cpdflib.a
For example, for a single function 'fromFile' to load a PDF from disc:
cpdflib.ml (Wraps up functionality from our command line tools imperatively)
==============================================================
(* Read a file, no attempt at decryption, unless it's the blank user
password. *)
let fromFile filename =
try
new_pdf (Pdfread.pdf_of_file (Some "") None filename)
with
e -> handle_error "fromFile" e; err_int
let _ = Callback.register "fromFile" fromFile
cpdflibwrapper.c (the foreign function interface)
=================================================
int fromFile(char* filename)
{
CAMLparam0 ();
CAMLlocal3(fromfile_v, filename_v, result_v);
fromfile_v = *caml_named_value("fromFile");
filename_v = caml_copy_string(filename);
result_v = caml_callback(fromfile_v, filename_v);
updateLastError ();
CAMLreturnT(int, Int_val(result_v));
}
PDFDocument.m (Objective C)
===========================
...
clearError ();
const char* in_c = [[[self fileURL] path] UTF8String];
int pdf = fromFile((char*) in_c);
if (lastError != 0) return NO;
...
Functions like handle_error, updateLastError(), clearError() etc.
provide a simple flat system for dealing with errors without exceptions
crossing the C/OCaml boundary. This is very old fashioned, but seems to
work. C code checks the error code after each callback to Ocaml, and can
extract extra information about the error.
Similarly, no complicated OCaml data structures cross the boundary -
it's all direct ints, floats, strings, and the occasional void*. The
possibility for programmer error in building big OCaml data structures
directly in C seems to outweigh the annoyance of a slightly flat
interface, at least for this particular application. FFI Masters may
disagree :-)
The multiple PDF files representing different undo/redo states of a
document are held in memory in OCaml (with most of the data shared
between them automatically, of course). When the PDF is updated or
undone/redone, it's flattened to disk, and the PDFKit component in Cocoa
picks it up and renders it - surprisingly, this is quick enough - it's
all in the memory cache rather than the actual disk usually, of course.
PDFKit (The cocoa PDF component) is only used for rendering - almost
every other piece of functionality is dealt with by CamlPDF via the FFI.
Thanks,
--
John Whitington
Director, Coherent Graphics Ltd
http://www.coherentpdf.com/
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Caml-list] Coherent Graphics Product Updates
2012-07-12 16:27 ` John Whitington
@ 2012-07-12 16:44 ` David MENTRE
2012-07-13 0:27 ` Francois Berenger
0 siblings, 1 reply; 5+ messages in thread
From: David MENTRE @ 2012-07-12 16:44 UTC (permalink / raw)
To: John Whitington; +Cc: caml-list
Hello,
2012/7/12 John Whitington <john@coherentgraphics.co.uk>:
> It's entirely one-way. Objective C calls OCaml. OCaml never calls Objective
> C.
[...]
> Similarly, no complicated OCaml data structures cross the boundary - it's
> all direct ints, floats, strings, and the occasional void*. The possibility
> for programmer error in building big OCaml data structures directly in C
> seems to outweigh the annoyance of a slightly flat interface, at least for
> this particular application. FFI Masters may disagree :-)
OK, thanks. I immediately thought at more complicated things (e.g. two
processes with a protocol between them) and I did not thought at
OCaml's C interface.
> The multiple PDF files representing different undo/redo states of a document
> are held in memory in OCaml (with most of the data shared between them
> automatically, of course). When the PDF is updated or undone/redone, it's
> flattened to disk, and the PDFKit component in Cocoa picks it up and renders
> it - surprisingly, this is quick enough - it's all in the memory cache
> rather than the actual disk usually, of course.
That's an interesting way to bypass simple FFI approach.
> PDFKit (The cocoa PDF component) is only used for rendering - almost every
> other piece of functionality is dealt with by CamlPDF via the FFI.
Thank you for your detailed and quick answer,
Best regards,
david
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Caml-list] Coherent Graphics Product Updates
2012-07-12 16:44 ` David MENTRE
@ 2012-07-13 0:27 ` Francois Berenger
0 siblings, 0 replies; 5+ messages in thread
From: Francois Berenger @ 2012-07-13 0:27 UTC (permalink / raw)
To: caml-list
On 07/13/2012 01:44 AM, David MENTRE wrote:
> Hello,
>
> 2012/7/12 John Whitington <john@coherentgraphics.co.uk>:
>> It's entirely one-way. Objective C calls OCaml. OCaml never calls Objective
>> C.
> [...]
>> Similarly, no complicated OCaml data structures cross the boundary - it's
>> all direct ints, floats, strings, and the occasional void*. The possibility
>> for programmer error in building big OCaml data structures directly in C
>> seems to outweigh the annoyance of a slightly flat interface, at least for
>> this particular application. FFI Masters may disagree :-)
>
> OK, thanks. I immediately thought at more complicated things (e.g. two
> processes with a protocol between them) and I did not thought at
> OCaml's C interface.
Can't you generate the bindings to C code automatically?
Aren't there tools for this?
>> The multiple PDF files representing different undo/redo states of a document
>> are held in memory in OCaml (with most of the data shared between them
>> automatically, of course). When the PDF is updated or undone/redone, it's
>> flattened to disk, and the PDFKit component in Cocoa picks it up and renders
>> it - surprisingly, this is quick enough - it's all in the memory cache
>> rather than the actual disk usually, of course.
>
> That's an interesting way to bypass simple FFI approach.
>
>> PDFKit (The cocoa PDF component) is only used for rendering - almost every
>> other piece of functionality is dealt with by CamlPDF via the FFI.
>
> Thank you for your detailed and quick answer,
> Best regards,
> david
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-07-13 0:27 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-12 13:04 [Caml-list] Coherent Graphics Product Updates John Whitington
2012-07-12 15:51 ` David MENTRE
2012-07-12 16:27 ` John Whitington
2012-07-12 16:44 ` David MENTRE
2012-07-13 0:27 ` Francois Berenger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox