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で不必要となる文をコメントします。