Camlkit GNUstep CoreGraphics
Camlkitを用いて、GNUstep CoreGraphicsにトライしてみました。
GNUstepのlibs-opalのTestsにあるpdf.mを参考にして、同様な方法でPDFContextに描画できました。
[実行結果]

(黒の長方形一つ描画している)
camlkitのv0.2.0からCoreFoundation, CoreGprahicsともに、インストールした
ライブラリから使用できます。
しかしながら、このライブラリにはGNUstepでまだインプリメントされていない
文が含まれているため、実行時にエラーが出ます。
このため、この2つのライブラリをプロジェクト内のライブラリとし、必要箇所を修正できるようにします。
プロジェクト構成
プロジェクト名: camlkitTest2
/bin dune main.m /CoreFoundation (camlkit-0.2.0からコピー CoreFoundation_fn.m, CoreFoundation_globals.mlを gnustep用に変更) /CoreGraphics (CoreFoundationと同様) camlkitTest2.opam dune-project
dune
(executable
(public_name camlkitTest2)
(name main)
(flags -ccopt -L/usr/local/GNUstep/Local/Library/Libraries -cclib -lgnustep-corebase -cclib -lopal)
(libraries
camlkit-base.runtime
CoreFoundation
CoreGraphics))main.m
open CoreFoundation
open CoreGraphics
open Runtime
open Objc
let _MyCGPDFContextCreateWithURL = Foreign.foreign "CGPDFContextCreateWithURL" ((ptr void) @-> (ptr void) @-> (ptr void) @-> returning (ptr CGContext.t))
let _MyCGPDFContextClose = Foreign.foreign "CGPDFContextClose" ((ptr CGContext.t) @-> returning void)
let _ = print_endline "Test CoreGraphics"
let str = "test.pdf"
let () =
let nsurl =
alloc NSURL.self |> NSURL.initFileURLWithPath (new_string str)
in
Printf.printf "nsurl\n";
let ctx =
_MyCGPDFContextCreateWithURL
nsurl
null
null
in
Printf.printf "context\n";
_CGContextTranslateCTM ctx 10. 10.;
_CGContextSetRGBFillColor ctx 0. 0. 0. 1.;
_CGContextFillRect ctx (CGRect.make ~x:0. ~y:300. ~width:400. ~height:100.);
_MyCGPDFContextClose ctx;CoreFoundation_fn.mの修正(一部分)
(* auto-generated, do not modify *) open Runtime open Objc let _CFXMLTreeGetNode = Foreign.foreign "CFXMLTreeGetNode" ((ptr CFTree.t) @-> returning (ptr CFXMLNode.t)) let _CFXMLTreeCreateXMLData = Foreign.foreign "CFXMLTreeCreateXMLData" ((ptr CFAllocator.t) @-> (ptr CFTree.t) @-> returning (ptr CFData.t)) ・・・ let _CFWriteStreamSetProperty = Foreign.foreign "CFWriteStreamSetProperty" ((ptr CFWriteStream.t) @-> (ptr CFString.t) @-> id @-> returning bool) (* let _CFWriteStreamSetDispatchQueue = Foreign.foreign "CFWriteStreamSetDispatchQueue" ((ptr CFWriteStream.t) @-> id @-> returning void) *) let _CFWriteStreamSetClient = Foreign.foreign "CFWriteStreamSetClient" ((ptr CFWriteStream.t) @-> ullong @-> (ptr (ptr void)) @-> (ptr CFWriteStream.t) @-> ullong @-> (ptr void) @-> (ptr CFStreamClientContext.t) @-> returning void) let _CFWriteStreamScheduleWithRunLoop = Foreign.foreign "CFWriteStreamScheduleWithRunLoop" ((ptr CFWriteStream.t) @-> (ptr CFRunLoop.t) @-> (ptr CFString.t) @-> returning void) let _CFWriteStreamOpen = Foreign.foreign "CFWriteStreamOpen" ((ptr CFWriteStream.t) @-> returning bool) let _CFWriteStreamGetTypeID = Foreign.foreign "CFWriteStreamGetTypeID" (void @-> returning ullong) let _CFWriteStreamGetStatus = Foreign.foreign "CFWriteStreamGetStatus" ((ptr CFWriteStream.t) @-> returning llong) let _CFWriteStreamGetError = Foreign.foreign "CFWriteStreamGetError" ((ptr CFWriteStream.t) @-> returning CFStreamError.t) let _CFWriteStreamCreateWithFile = Foreign.foreign "CFWriteStreamCreateWithFile" ((ptr CFAllocator.t) @-> (ptr CFURL.t) @-> returning (ptr CFWriteStream.t)) let _CFWriteStreamCreateWithBuffer = Foreign.foreign "CFWriteStreamCreateWithBuffer" ((ptr CFAllocator.t) @-> string @-> llong @-> returning (ptr CFWriteStream.t)) let _CFWriteStreamCreateWithAllocatedBuffers = Foreign.foreign "CFWriteStreamCreateWithAllocatedBuffers" ((ptr CFAllocator.t) @-> (ptr CFAllocator.t) @-> returning (ptr CFWriteStream.t)) let _CFWriteStreamCopyProperty = Foreign.foreign "CFWriteStreamCopyProperty" ((ptr CFWriteStream.t) @-> (ptr CFString.t) @-> returning id) let _CFWriteStreamCopyError = Foreign.foreign "CFWriteStreamCopyError" ((ptr CFWriteStream.t) @-> returning (ptr CFError.t)) (* let _CFWriteStreamCopyDispatchQueue = Foreign.foreign "CFWriteStreamCopyDispatchQueue" ((ptr CFWriteStream.t) @-> returning id) *) let _CFWriteStreamClose = Foreign.foreign "CFWriteStreamClose" ((ptr CFWriteStream.t) @-> returning void) let _CFWriteStreamCanAcceptBytes = Foreign.foreign "CFWriteStreamCanAcceptBytes" ((ptr CFWriteStream.t) @-> returning bool) (* let _CFUserNotificationUpdate = Foreign.foreign "CFUserNotificationUpdate" ((ptr CFUserNotification.t) @-> double @-> ullong @-> (ptr CFDictionary.t) @-> returning int) let _CFUserNotificationSecureTextField = Foreign.foreign "Camlkit_CFUserNotificationSecureTextField" (llong @-> returning ullong) ・・・ let _CFUserNotificationCancel = Foreign.foreign "CFUserNotificationCancel" ((ptr CFUserNotification.t) @-> returning int) *) let _CFUUIDGetUUIDBytes = Foreign.foreign "CFUUIDGetUUIDBytes" ((ptr CFUUID.t) @-> returning CFUUIDBytes.t)
gnustepで不必要となる文をコメントします。