Quantcast
Channel: WebGPU プログラミング
Viewing all articles
Browse latest Browse all 40

Camlkit GNUstep CoreGraphics

$
0
0

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


Viewing all articles
Browse latest Browse all 40