-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
35 changed files
with
13,985 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
|
||
|
||
|
||
MODULE_SRC= mlx_image.swift mlx_window.swift mlx_init.swift | ||
MODULE_OBJ=$(MODULE_SRC:.swift=.swiftmodule) | ||
|
||
SRC= interface.swift $(MODULE_SRC) | ||
OBJ=$(SRC:.swift=.o) | ||
|
||
C_SRC= mlx_xpm.c mlx_png.c mlx_string_put.c | ||
C_OBJ=$(C_SRC:.c=.o) | ||
CFLAGS=-O3 | ||
|
||
NAME=libmlx.dylib | ||
|
||
INC=-I. | ||
#OPTI=-Ounchecked | ||
|
||
all: $(NAME) | ||
|
||
$(NAME): $(MODULE_OBJ) $(OBJ) $(C_OBJ) | ||
swiftc $(OPTI) $(INC) -o $(NAME) -emit-library $(OBJ) $(C_OBJ) -lz | ||
|
||
|
||
|
||
%.o: %.swift | ||
swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@ | ||
|
||
%.swiftmodule: %.swift | ||
swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@ -emit-module -module-name $(patsubst %.swift,%,$<) -module-link-name $(patsubst %.swift,%,$<) | ||
|
||
clean: | ||
rm -f $(NAME) $(OBJ) $(MODULE_OBJ) $(C_OBJ) *.swiftdoc *~ | ||
|
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,292 @@ | ||
|
||
import Cocoa | ||
|
||
import mlx_window | ||
import mlx_image | ||
import mlx_init | ||
|
||
|
||
|
||
func _mlx_bridge<T : AnyObject>(obj : T) -> UnsafeRawPointer { | ||
return UnsafeRawPointer(Unmanaged.passUnretained(obj).toOpaque()) | ||
} | ||
|
||
func _mlx_bridge_retained<T : AnyObject>(obj : T) -> UnsafeRawPointer { | ||
return UnsafeRawPointer(Unmanaged.passRetained(obj).toOpaque()) | ||
} | ||
|
||
func _mlx_bridge<T : AnyObject>(ptr : UnsafeRawPointer) -> T { | ||
return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue() | ||
} | ||
|
||
func _mlx_bridge_transfer<T : AnyObject>(ptr : UnsafeRawPointer) -> T { | ||
return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue() | ||
} | ||
|
||
|
||
let MLX_SYNC_IMAGE_WRITABLE = Int32(1) | ||
let MLX_SYNC_WIN_FLUSH_CMD = Int32(2) | ||
let MLX_SYNC_WIN_CMD_COMPLETED = Int32(3) | ||
|
||
|
||
|
||
/// C decl | ||
|
||
|
||
@_cdecl("mlx_init") | ||
public func mlx_init_swift() -> UnsafeRawPointer | ||
{ | ||
let mm = MlxMain() | ||
return (_mlx_bridge_retained(obj:mm)) | ||
} | ||
|
||
|
||
@_cdecl("mlx_loop") | ||
public func mlx_loop_swift(_ mlxptr:UnsafeRawPointer) | ||
{ | ||
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
mlx.inLoop = true | ||
NSApp.run() | ||
} | ||
|
||
|
||
@_cdecl("mlx_new_window") | ||
public func mlx_new_window_swift(_ mlxptr:UnsafeRawPointer, Width w:UInt32, Height h:UInt32, Title t:UnsafePointer<CChar>) -> UnsafeRawPointer | ||
{ | ||
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
let mw = MlxWin(device: mlx.device, width: Int(w), height: Int(h), title: String(cString: t)) | ||
mw.setNotifs() | ||
mw.initMetal() | ||
mlx.addWinToList(mw) | ||
return (_mlx_bridge_retained(obj:mw)) | ||
} | ||
|
||
|
||
|
||
@_cdecl("mlx_key_hook") | ||
public func mlx_key_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
win.addHook(index: 3, fct: fctptr, param: paramptr) | ||
return (Int32(0)); | ||
} | ||
|
||
|
||
@_cdecl("mlx_mouse_hook") | ||
public func mlx_mouse_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
win.addHook(index: 4, fct: fctptr, param: paramptr) | ||
return (Int32(0)); | ||
} | ||
|
||
|
||
@_cdecl("mlx_hook") | ||
public func mlx_hook_swift(_ winptr:UnsafeRawPointer, _ xevent:Int32, _ xmask:Int32, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
win.addHook(index: Int(xevent), fct: fctptr, param: paramptr) | ||
return (Int32(0)); | ||
} | ||
|
||
|
||
@_cdecl("mlx_expose_hook") | ||
public func mlx_expose_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
win.addHook(index: 12, fct: fctptr, param: paramptr) | ||
return (Int32(0)); | ||
} | ||
|
||
@_cdecl("mlx_loop_hook") | ||
public func mlx_loop_hook_swift(_ mlxptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32 | ||
{ | ||
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
mlx.addLoopHook(fctptr, paramptr) | ||
return (Int32(0)); | ||
} | ||
|
||
|
||
@_cdecl("mlx_do_key_autorepeatoff") | ||
public func mlx_do_key_autorepeatoff_swift(_ mlxptr:UnsafeRawPointer) | ||
{ | ||
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
mlx.winList.forEach{ $0.setKeyRepeat(0) } | ||
} | ||
|
||
|
||
@_cdecl("mlx_do_key_autorepeaton") | ||
public func mlx_do_key_autorepeatoon_swift(_ mlxptr:UnsafeRawPointer) | ||
{ | ||
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
mlx.winList.forEach{ $0.setKeyRepeat(1) } | ||
} | ||
|
||
|
||
@_cdecl("mlx_clear_window") | ||
public func mlx_clear_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer) | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
win.clearWin() | ||
} | ||
|
||
|
||
@_cdecl("mlx_pixel_put") | ||
public func mlx_pixel_put_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32, _ color:UInt32) | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
win.pixelPut(x, y, color) | ||
} | ||
|
||
|
||
@_cdecl("mlx_get_color_value") | ||
public func mlx_get_color_value(_ mlxptr:UnsafeRawPointer, _ color:UInt32) -> UInt32 | ||
{ | ||
return color | ||
} | ||
|
||
|
||
@_cdecl("mlx_new_image") | ||
public func mlx_new_image(_ mlxptr:UnsafeRawPointer, _ width:Int32, _ height:Int32) -> UnsafeRawPointer | ||
{ | ||
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
let img = MlxImg(d:mlx.device, w:Int(width), h:Int(height)) | ||
mlx.addImgToList(img) | ||
/// print(CFGetRetainCount(img)) | ||
return (_mlx_bridge_retained(obj:img)) | ||
|
||
} | ||
|
||
@_cdecl("mlx_get_data_addr") | ||
public func mlx_get_data_addr_swift(_ imgptr:UnsafeRawPointer, _ bpp:UnsafeMutablePointer<Int32>, _ sizeline:UnsafeMutablePointer<Int32>, _ endian:UnsafeMutablePointer<Int32>) -> UnsafeMutablePointer<UInt32> | ||
{ | ||
let img:MlxImg = _mlx_bridge(ptr:imgptr) | ||
bpp.pointee = 32 | ||
sizeline.pointee = Int32(img.texture_sizeline) | ||
endian.pointee = Int32(0) | ||
return img.texture_data | ||
} | ||
|
||
@_cdecl("mlx_put_image_to_window") | ||
public func mlx_put_image_to_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32 | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
let img:MlxImg = _mlx_bridge(ptr:imgptr) | ||
win.putImage(image:img, x:x, y:y) | ||
return Int32(0) | ||
} | ||
|
||
@_cdecl("mlx_put_image_to_window_scale") | ||
public func mlx_put_image_to_window_scale_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ sx:Int32, _ sy:Int32, _ sw:Int32, _ sh:Int32, _ dx:Int32, _ dy:Int32, _ dw:Int32, _ dh:Int32, _ color:UInt32) -> Int32 | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
let img:MlxImg = _mlx_bridge(ptr:imgptr) | ||
win.putImageScale(image:img, sx:sx, sy:sy, sw:sw, sh:sh, dx:dx, dy:dy, dw:dw, dh:dh, c:color) | ||
return Int32(0) | ||
} | ||
|
||
@_cdecl("mlx_do_sync") | ||
public func mlx_do_sync_swift(_ mlxptr:UnsafeRawPointer) -> Int32 | ||
{ | ||
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
mlx.winList.forEach { $0.flushImages() } | ||
mlx.winList.forEach { $0.waitForGPU() } | ||
return Int32(0) | ||
} | ||
|
||
@_cdecl("mlx_sync") | ||
public func mlx_sync_swift(_ what:Int32, _ param:UnsafeRawPointer) -> Int32 | ||
{ | ||
switch what | ||
{ | ||
case MLX_SYNC_IMAGE_WRITABLE: | ||
let img:MlxImg = _mlx_bridge(ptr:param); while img.onGPU > 0 {} | ||
case MLX_SYNC_WIN_FLUSH_CMD: | ||
let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages() | ||
case MLX_SYNC_WIN_CMD_COMPLETED: | ||
let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages(); win.waitForGPU() | ||
default: | ||
break | ||
} | ||
return Int32(0) | ||
} | ||
|
||
@_cdecl("mlx_destroy_window") | ||
public func mlx_destroy_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer) -> Int32 | ||
{ | ||
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
/// bridge_transfer to get the retain, at end of this func should release the MlxWin object, because no ref anymore. | ||
let win:MlxWin = _mlx_bridge_transfer(ptr:winptr) | ||
win.delNotifs() | ||
win.flushImages() | ||
win.waitForGPU() | ||
win.destroyWinE() | ||
mlx.winList.removeAll(where: { $0 === win} ) | ||
return Int32(0) | ||
} | ||
|
||
@_cdecl("mlx_destroy_image") | ||
public func mlx_destroy_image_swift(_ mlxptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer) -> Int32 | ||
{ | ||
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
/// bridge_transfer to get the retain, at end of this func should release the MlxImg object, because no ref anymore. | ||
let img:MlxImg = _mlx_bridge_transfer(ptr:imgptr) | ||
mlx.winList.forEach { $0.flushImages() } | ||
while img.onGPU > 0 {} | ||
mlx.imgList.removeAll(where: { $0 === img} ) | ||
return Int32(0) | ||
} | ||
|
||
|
||
@_cdecl("mlx_get_screen_size") | ||
public func mlx_get_screen_size_swift(_ mlxptr:UnsafeRawPointer, _ sizex:UnsafeMutablePointer<Int32>, _ sizey:UnsafeMutablePointer<Int32>) -> Int32 | ||
{ | ||
/// let mlx:MlxMain = _mlx_bridge(ptr:mlxptr) | ||
sizex.pointee = Int32(NSScreen.main!.frame.size.width) | ||
sizey.pointee = Int32(NSScreen.main!.frame.size.height) | ||
return Int32(0) | ||
} | ||
|
||
|
||
@_cdecl("mlx_mouse_hide") | ||
public func mlx_mouse_hide_swift() -> Int32 | ||
{ | ||
NSCursor.hide() | ||
return Int32(0) | ||
} | ||
|
||
@_cdecl("mlx_mouse_show") | ||
public func mlx_mouse_show_swift() -> Int32 | ||
{ | ||
NSCursor.unhide() | ||
return Int32(0) | ||
} | ||
|
||
|
||
@_cdecl("mlx_mouse_move") | ||
public func mlx_mouse_move_swift(_ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32 | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
let frame = win.getWinEFrame() | ||
/// let sframe = win.getScreenFrame() | ||
var pt = CGPoint() | ||
pt.x = frame.origin.x + CGFloat(x) | ||
/// pt.y = sframe.size.y - frame.size.y - frame.origin.y + 1 + y | ||
pt.y = frame.origin.y + frame.size.height - 1.0 - CGFloat(y) | ||
CGWarpMouseCursorPosition(pt) | ||
CGAssociateMouseAndMouseCursorPosition(UInt32(1)) | ||
return Int32(0); | ||
} | ||
|
||
|
||
|
||
@_cdecl("mlx_mouse_get_pos") | ||
public func mlx_mouse_get_pos_swift(_ winptr:UnsafeRawPointer, _ x:UnsafeMutablePointer<Int32>, _ y:UnsafeMutablePointer<Int32>) -> Int32 | ||
{ | ||
let win:MlxWin = _mlx_bridge(ptr:winptr) | ||
let frame = win.getWinEFrame() | ||
let point = win.getMouseLoc() | ||
x.pointee = Int32(point.x) | ||
y.pointee = Int32(frame.size.height - 1.0 - point.y) | ||
return Int32(0) | ||
} |
Oops, something went wrong.