Skip to content

Commit

Permalink
I added basic support for the window resize event in Morphic.
Browse files Browse the repository at this point in the history
  • Loading branch information
ronsaldo committed Nov 26, 2023
1 parent b4e5305 commit bc1f9c1
Show file tree
Hide file tree
Showing 13 changed files with 201 additions and 52 deletions.
4 changes: 2 additions & 2 deletions include/sysbvm/type.h
Expand Up @@ -103,10 +103,10 @@ typedef enum sysbvm_typeFlags_e
SYSBVM_TYPE_FLAGS_TEMPORARY_REFERENCE_TYPE_FLAGS = SYSBVM_TYPE_FLAGS_VALUE | SYSBVM_TYPE_FLAGS_FINAL | SYSBVM_TYPE_FLAGS_TEMPORARY_REFERENCE_VALUE,

SYSBVM_TYPE_FLAGS_VALUE_TYPE_DEFAULT_FLAGS = SYSBVM_TYPE_FLAGS_VALUE,
SYSBVM_TYPE_FLAGS_PRIMITIVE_VALUE_TYPE_DEFAULT_FLAGS = SYSBVM_TYPE_FLAGS_VALUE | SYSBVM_TYPE_FLAGS_IMMEDIATE | SYSBVM_TYPE_FLAGS_FINAL,
SYSBVM_TYPE_FLAGS_PRIMITIVE_VALUE_TYPE_DEFAULT_FLAGS = SYSBVM_TYPE_FLAGS_VALUE | SYSBVM_TYPE_FLAGS_IMMEDIATE | SYSBVM_TYPE_FLAGS_BYTES | SYSBVM_TYPE_FLAGS_FINAL,
SYSBVM_TYPE_FLAGS_PRIMITIVE_VALUE_TYPE_METATYPE_FLAGS = SYSBVM_TYPE_FLAGS_METATYPE_REQUIRED_FLAGS | SYSBVM_TYPE_FLAGS_FINAL,

SYSBVM_TYPE_FLAGS_ABSTRACT_PRIMITIVE_VALUE_TYPE_DEFAULT_FLAGS = SYSBVM_TYPE_FLAGS_VALUE | SYSBVM_TYPE_FLAGS_IMMEDIATE,
SYSBVM_TYPE_FLAGS_ABSTRACT_PRIMITIVE_VALUE_TYPE_DEFAULT_FLAGS = SYSBVM_TYPE_FLAGS_VALUE | SYSBVM_TYPE_FLAGS_IMMEDIATE | SYSBVM_TYPE_FLAGS_BYTES,
SYSBVM_TYPE_FLAGS_ABSTRACT_PRIMITIVE_VALUE_TYPE_METATYPE_FLAGS = SYSBVM_TYPE_FLAGS_METATYPE_REQUIRED_FLAGS,
} sysbvm_typeFlags_t;

Expand Down
17 changes: 17 additions & 0 deletions include/sysmel/pal-window.h
Expand Up @@ -7,6 +7,21 @@ typedef struct sysmel_pal_window_s sysmel_pal_window_t;
typedef struct sysmel_pal_windowRenderer_s sysmel_pal_windowRenderer_t;
typedef struct sysmel_pal_windowRendererTexture_s sysmel_pal_windowRendererTexture_t;

typedef enum sysmel_pal_windowCreationFlags_e
{
SYSMEL_PAL_WINDOW_CREATION_FLAGS_NONE = 0,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_ALLOW_HIGH_DPI = 1<<0,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_ALWAYS_ON_TOP = 1<<1,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_BORDERLESS = 1<<2,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_FULLSCREEN = 1<<3,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_FULLSCREEN_DESKTOP = 1<<4,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_HIDDEN = 1<<5,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_POPUP = 1<<6,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_RESIZABLE = 1<<7,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_TOOLTIP = 1<<8,
SYSMEL_PAL_WINDOW_CREATION_FLAGS_UTILITY = 1<<9,
} sysmel_pal_windowCreationFlags_t;

typedef enum sysmel_pal_window_event_type_e
{
SYSMEL_PAL_WINDOW_EVENT_TYPE_UNKNOWN = 0,
Expand Down Expand Up @@ -112,12 +127,14 @@ SYSMEL_PAL_EXTERN_C sysmel_pal_window_t *sysmel_pal_window_create(size_t titleSi
SYSMEL_PAL_EXTERN_C void sysmel_pal_window_show(sysmel_pal_window_t *window);
SYSMEL_PAL_EXTERN_C void sysmel_pal_window_hide(sysmel_pal_window_t *window);
SYSMEL_PAL_EXTERN_C void sysmel_pal_window_raise(sysmel_pal_window_t *window);
SYSMEL_PAL_EXTERN_C void sysmel_pal_window_getSize(sysmel_pal_window_t *window, int *outWidth, int *outHeight);
SYSMEL_PAL_EXTERN_C void sysmel_pal_window_destroy(sysmel_pal_window_t *window);

SYSMEL_PAL_EXTERN_C bool sysmel_pal_window_pollEvent(sysmel_pal_window_event_t *event);
SYSMEL_PAL_EXTERN_C bool sysmel_pal_window_waitEvent(sysmel_pal_window_event_t *event);

SYSMEL_PAL_EXTERN_C sysmel_pal_windowRenderer_t *sysmel_pal_windowRenderer_create(sysmel_pal_window_t *window, uint32_t flags);
SYSMEL_PAL_EXTERN_C void sysmel_pal_windowRenderer_getOutputSize(sysmel_pal_windowRenderer_t *renderer, int *outWidth, int *outHeight);
SYSMEL_PAL_EXTERN_C void sysmel_pal_windowRenderer_destroy(sysmel_pal_windowRenderer_t *renderer);

SYSMEL_PAL_EXTERN_C sysmel_pal_windowRendererTexture_t *sysmel_pal_windowRenderer_createStreamingTextureBGRA32(sysmel_pal_windowRenderer_t *renderer, int width, int height);
Expand Down
18 changes: 18 additions & 0 deletions lib/support/pal-null-window.c
Expand Up @@ -40,6 +40,15 @@ SYSMEL_PAL_EXTERN_C void sysmel_pal_window_destroy(sysmel_pal_window_t *window)
(void)window;
}

SYSMEL_PAL_EXTERN_C void sysmel_pal_window_getSize(sysmel_pal_window_t *window, int *outWidth, int *outHeight)
{
(void)window;
if(outWidth)
*outWidth = 0;
if(outHeight)
*outHeight = 0;
}

SYSMEL_PAL_EXTERN_C bool sysmel_pal_window_pollEvent(sysmel_pal_window_event_t *event)
{
(void)event;
Expand Down Expand Up @@ -88,6 +97,15 @@ SYSMEL_PAL_EXTERN_C void sysmel_pal_windowRenderer_destroy(sysmel_pal_windowRend
(void)renderer;
}

SYSMEL_PAL_EXTERN_C void sysmel_pal_windowRenderer_getOutputSize(sysmel_pal_windowRenderer_t *renderer, int *outWidth, int *outHeight)
{
(void)renderer;
if(outWidth)
*outWidth = 0;
if(outHeight)
*outHeight = 0;
}

SYSMEL_PAL_EXTERN_C void sysmel_pal_windowRenderer_beginFrame(sysmel_pal_windowRenderer_t *renderer, uint8_t r, uint8_t g, uint8_t b, uint8_t a)
{
(void)renderer;
Expand Down
44 changes: 42 additions & 2 deletions lib/support/pal-sdl2.c
Expand Up @@ -15,7 +15,37 @@ SYSMEL_PAL_EXTERN_C void sysmel_pal_windowSystem_finalize(void)
SYSMEL_PAL_EXTERN_C sysmel_pal_window_t *sysmel_pal_window_create(size_t titleSize, const char *title, int x, int y, int width, int height, uint32_t flags)
{
(void)flags;
Uint32 sdlFlags = SDL_WINDOW_ALLOW_HIGHDPI;
Uint32 sdlFlags = 0;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_ALLOW_HIGH_DPI)
sdlFlags |= SDL_WINDOW_ALLOW_HIGHDPI;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_ALWAYS_ON_TOP)
sdlFlags |= SDL_WINDOW_ALWAYS_ON_TOP;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_BORDERLESS)
sdlFlags |= SDL_WINDOW_BORDERLESS;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_FULLSCREEN)
sdlFlags |= SDL_WINDOW_FULLSCREEN;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_FULLSCREEN_DESKTOP)
sdlFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_HIDDEN)
sdlFlags |= SDL_WINDOW_HIDDEN;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_POPUP)
sdlFlags |= SDL_WINDOW_POPUP_MENU;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_RESIZABLE)
sdlFlags |= SDL_WINDOW_RESIZABLE;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_TOOLTIP)
sdlFlags |= SDL_WINDOW_TOOLTIP;

if(flags & SYSMEL_PAL_WINDOW_CREATION_FLAGS_UTILITY)
sdlFlags |= SDL_WINDOW_UTILITY;

char *titleCString = malloc(titleSize + 1);
memcpy(titleCString, title, titleSize);
Expand Down Expand Up @@ -50,6 +80,11 @@ SYSMEL_PAL_EXTERN_C void sysmel_pal_window_raise(sysmel_pal_window_t *window)
SDL_RaiseWindow((SDL_Window*)window);
}

SYSMEL_PAL_EXTERN_C void sysmel_pal_window_getSize(sysmel_pal_window_t *window, int *outWidth, int *outHeight)
{
SDL_GetWindowSize((SDL_Window*)window, outWidth, outHeight);
}

SYSMEL_PAL_EXTERN_C void sysmel_pal_window_destroy(sysmel_pal_window_t *window)
{
SDL_DestroyWindow((SDL_Window*)window);
Expand Down Expand Up @@ -210,7 +245,7 @@ static void sysmel_pal_sdl2Window_convertEvent(SDL_Event *sdlEvent, sysmel_pal_w
}
break;
default:
printf("Unknown sdl event 16r%x\n", sdlEvent->type);
//printf("Unknown sdl event 16r%x\n", sdlEvent->type);
break;
}
}
Expand Down Expand Up @@ -241,6 +276,11 @@ SYSMEL_PAL_EXTERN_C sysmel_pal_windowRenderer_t *sysmel_pal_windowRenderer_creat
return (sysmel_pal_windowRenderer_t*)SDL_CreateRenderer((SDL_Window*)window, -1, 0);
}

SYSMEL_PAL_EXTERN_C void sysmel_pal_windowRenderer_getOutputSize(sysmel_pal_windowRenderer_t *renderer, int *outWidth, int *outHeight)
{
SDL_GetRendererOutputSize((SDL_Renderer*)renderer, outWidth, outHeight);
}

SYSMEL_PAL_EXTERN_C void sysmel_pal_windowRenderer_destroy(sysmel_pal_windowRenderer_t *renderer)
{
SDL_DestroyRenderer((SDL_Renderer*)renderer);
Expand Down
2 changes: 1 addition & 1 deletion package-sources/Core.Runtime/BaseBootstrap/Enum.sysmel
Expand Up @@ -18,7 +18,7 @@ public class EnumType superclass: ValueType; definition: {

let: #enum with: metatype basicNew.
enum
flags: TypeFlags::EnumDefaultFlags;
flags: TypeFlags::EnumDefaultFlags | (valueType isBytes ifTrue: TypeFlags::Bytes ifFalse: 0bflgs);
supertype: AnyEnum;
valueType: valueType;
slots: #();
Expand Down
@@ -1,12 +1,13 @@
public class FormSGFormRenderer superclass: FormSGVisitor; definition: {
public field canvas => FormCanvas.

public method renderSceneGraph: (sceneGraph: FormSGNode) onForm: (targetForm: Form) ::=> Void := {
self renderSceneGraph: sceneGraph onCanvas: (FormCanvas for: targetForm)
public method renderSceneGraph: (sceneGraph: FormSGNode) scaleFactor: (scaleFactor: Float32x2) onForm: (targetForm: Form) ::=> Void := {
self renderSceneGraph: sceneGraph scaleFactor: scaleFactor onCanvas: (FormCanvas for: targetForm)
}.

public method renderSceneGraph: (sceneGraph: FormSGNode) onCanvas: (targetCanvas: FormCanvas) ::=> Void := {
public method renderSceneGraph: (sceneGraph: FormSGNode) scaleFactor: (scaleFactor: Float32x2) onCanvas: (targetCanvas: FormCanvas) ::=> Void := {
canvas := targetCanvas.
## TODO: Apply the scale factor.
self visitNode: sceneGraph.
}.

Expand Down
78 changes: 49 additions & 29 deletions package-sources/Graphics.Window.PAL/PAL.sysmel
Expand Up @@ -9,34 +9,52 @@ public global SysmelPAL::WindowRendererHandle := SysmelPAL::WindowRenderer point
public struct SysmelPAL::WindowRendererTexture.
public global SysmelPAL::WindowRendererTextureHandle := SysmelPAL::WindowRendererTexture pointer.

public global SysmelPAL::WindowEventType::UNKNOWN := 0u32.
public global SysmelPAL::WindowEventType::QUIT := 1u32.

public global SysmelPAL::WindowEventType::KeyDown := 16r100 u32.
public global SysmelPAL::WindowEventType::KeyUp := 16r101 u32.
public global SysmelPAL::WindowEventType::TextEditing := 16r102 u32.
public global SysmelPAL::WindowEventType::TextInput := 16r103 u32.
public global SysmelPAL::WindowEventType::KeyMapChanged := 16r104 u32.

public global SysmelPAL::WindowEventType::MouseButtonDown := 16r200 u32.
public global SysmelPAL::WindowEventType::MouseButtonUp := 16r201 u32.
public global SysmelPAL::WindowEventType::MouseMotion := 16r202 u32.
public global SysmelPAL::WindowEventType::MouseWheel := 16r203 u32.

public global SysmelPAL::WindowEventType::Shown := 16r300 u32.
public global SysmelPAL::WindowEventType::Hidden := 16r301 u32.
public global SysmelPAL::WindowEventType::Exposed := 16r302 u32.
public global SysmelPAL::WindowEventType::Moved := 16r303 u32.
public global SysmelPAL::WindowEventType::Resize := 16r304 u32.
public global SysmelPAL::WindowEventType::SizeChanged := 16r305 u32.
public global SysmelPAL::WindowEventType::Minimize := 16r306 u32.
public global SysmelPAL::WindowEventType::Maximized := 16r307 u32.
public global SysmelPAL::WindowEventType::Restored := 16r308 u32.
public global SysmelPAL::WindowEventType::Enter := 16r309 u32.
public global SysmelPAL::WindowEventType::Leave := 16r30A u32.
public global SysmelPAL::WindowEventType::FocusGained := 16r30B u32.
public global SysmelPAL::WindowEventType::FocusLost := 16r30C u32.
public global SysmelPAL::WindowEventType::Close := 16r30D u32.
public enum SysmelPAL::WindowCreationFlags bitMask valueType: UInt32; values: #{
None: 0u32.
AllowHighDPI: 1u32 << 0u32.
AlwaysOnTop: 1u32 << 1u32.
Borderless: 1u32 << 2u32.
Fullscreen: 1u32 << 3u32.
FullscreenDesktop: 1u32 << 4u32.
Hidden: 1u32 << 5u32.
Popup: 1u32 << 6u32.
Resizable: 1u32 << 7u32.
Tooltip: 1u32 << 8u32.
Utility: 1u32 << 90u32.

Default: Resizable | AllowHighDPI.
}.

public enum SysmelPAL::WindowEventType valueType: UInt32; values: #{
Unknown: 0u32.
Quit: 1u32.

KeyDown: 16r100 u32.
KeyUp: 16r101 u32.
TextEditing: 16r102 u32.
TextInput: 16r103 u32.
KeyMapChanged: 16r104 u32.

MouseButtonDown: 16r200 u32.
MouseButtonUp: 16r201 u32.
MouseMotion: 16r202 u32.
MouseWheel: 16r203 u32.

Shown: 16r300 u32.
Hidden: 16r301 u32.
Exposed: 16r302 u32.
Moved: 16r303 u32.
Resize: 16r304 u32.
SizeChanged: 16r305 u32.
Minimize: 16r306 u32.
Maximized: 16r307 u32.
Restored: 16r308 u32.
Enter: 16r309 u32.
Leave: 16r30A u32.
FocusGained: 16r30B u32.
FocusLost: 16r30C u32.
Close: 16r30D u32.
}.

public struct SysmelPAL::MouseButtonEvent definition: {
public field mouse => UInt32.
Expand Down Expand Up @@ -98,13 +116,15 @@ public struct SysmelPAL::WindowEvent definition: {
public externC function sysmel_pal_windowSystem_initialize() => Void.
public externC function sysmel_pal_windowSystem_finalize() => Void.

public externC function sysmel_pal_window_create(titleSize: Size, title: Char8 const pointer, x: Int32, y: Int32, width: Int32, height: Int32, flags: UInt32) => SysmelPAL::WindowHandle.
public externC function sysmel_pal_window_create(titleSize: Size, title: Char8 const pointer, x: Int32, y: Int32, width: Int32, height: Int32, flags: SysmelPAL::WindowCreationFlags) => SysmelPAL::WindowHandle.
public externC function sysmel_pal_window_show(window: SysmelPAL::WindowHandle) => Void.
public externC function sysmel_pal_window_hide(window: SysmelPAL::WindowHandle) => Void.
public externC function sysmel_pal_window_raise(window: SysmelPAL::WindowHandle) => Void.
public externC function sysmel_pal_window_getSize(window: SysmelPAL::WindowHandle, outWidth: Int32 ref, outHeight: Int32 ref) => Void.
public externC function sysmel_pal_window_destroy(window: SysmelPAL::WindowHandle) => Void.

public externC function sysmel_pal_windowRenderer_create(window: SysmelPAL::WindowHandle, flags: UInt32) => SysmelPAL::WindowRendererHandle.
public externC function sysmel_pal_windowRenderer_getOutputSize(renderer: SysmelPAL::WindowRendererHandle, outWidth: Int32 ref, outHeight: Int32 ref) => Void.
public externC function sysmel_pal_windowRenderer_destroy(renderer: SysmelPAL::WindowRendererHandle) => Void.

public externC function sysmel_pal_windowRenderer_createStreamingTextureBGRA32(renderer: SysmelPAL::WindowRendererHandle, width: Int32, height: Int32) => SysmelPAL::WindowRendererTextureHandle.
Expand Down
16 changes: 16 additions & 0 deletions package-sources/Graphics.Window/Event.sysmel
Expand Up @@ -194,6 +194,22 @@ public class ValidateRenderingEvent superclass: Event; definition: {
:= handler onValidateRenderingEvent: self
}.

#**
* I am a window size changed event.
*#
public class WindowSizeChangedEvent superclass: Event; definition: {
public override method acceptEventHandler: (handler: EventHandler) ::=> Void
:= handler onWindowSizeChangedEvent: self
}.

#**
* I am a window resize event.
*#
public class WindowResizeEvent superclass: Event; definition: {
public override method acceptEventHandler: (handler: EventHandler) ::=> Void
:= handler onWindowResizeEvent: self
}.

#**
* I am a window close event.
*#
Expand Down
2 changes: 2 additions & 0 deletions package-sources/Graphics.Window/EventHandler.sysmel
Expand Up @@ -25,4 +25,6 @@ EventHandler definition: {
public virtual method onLostFocusEvent: (event: LostFocusEvent) ::=> Void := {}.

public virtual method onWindowCloseRequestEvent: (event: WindowCloseRequestEvent) ::=> Void := {}.
public virtual method onWindowResizeEvent: (event: WindowResizeEvent) ::=> Void := {}.
public virtual method onWindowSizeChangedEvent: (event: WindowSizeChangedEvent) ::=> Void := {}.
}.
38 changes: 26 additions & 12 deletions package-sources/Graphics.Window/Window.sysmel
Expand Up @@ -40,44 +40,58 @@ public class Window superclass: Object; definition: {
handle := nil.
}.

public method extent => UInt32x2 := {
let width mutable := 0i32.
let height mutable := 0i32.
sysmel_pal_window_getSize(handle, width, height).
width asUInt32 @ height asUInt32
}.

public method convertAndDispatchEvent: (event: SysmelPAL::WindowEvent ref) ::=> Void := {
switch: event type withCases: #{
SysmelPAL::WindowEventType::Exposed : {
SysmelPAL::WindowEventType Exposed : {
self dispatchEvent: ExposeEvent new
}.
SysmelPAL::WindowEventType::Close : {
SysmelPAL::WindowEventType Close : {
self dispatchEvent: WindowCloseRequestEvent new
}.
SysmelPAL::WindowEventType::MouseButtonDown : {
SysmelPAL::WindowEventType Resize : {
self dispatchEvent: WindowResizeEvent new
}.
SysmelPAL::WindowEventType SizeChanged : {
self dispatchEvent: WindowSizeChangedEvent new
}.

SysmelPAL::WindowEventType MouseButtonDown : {
self dispatchEvent: (self convertMouseButtonEventInto: event*->data*->mouseButton into: MouseButtonPressedEvent new)
}.
SysmelPAL::WindowEventType::MouseButtonUp : {
SysmelPAL::WindowEventType MouseButtonUp : {
self dispatchEvent: (self convertMouseButtonEventInto: event*->data*->mouseButton into: MouseButtonReleasedEvent new)
}.
SysmelPAL::WindowEventType::MouseMotion : {
SysmelPAL::WindowEventType MouseMotion : {
self dispatchEvent: (self convertMouseMotionEventInto: event*->data*->mouseMotion into: MouseMoveEvent new)
}.
SysmelPAL::WindowEventType::MouseWheel : {
SysmelPAL::WindowEventType MouseWheel : {
self dispatchEvent: (self convertMouseWheelEventInto: event*->data*->mouseWheel into: MouseWheelEvent new)
}.
SysmelPAL::WindowEventType::Enter : {
SysmelPAL::WindowEventType Enter : {
self dispatchEvent: MouseEnterEvent new.
}.
SysmelPAL::WindowEventType::Leave : {
SysmelPAL::WindowEventType Leave : {
self dispatchEvent: MouseLeaveEvent new.
}.

SysmelPAL::WindowEventType::KeyDown : {
SysmelPAL::WindowEventType KeyDown : {
self dispatchEvent: (self convertKeyboardEventInto: event*->data*->keyboard into: KeyPressedEvent new)
}.
SysmelPAL::WindowEventType::KeyUp : {
SysmelPAL::WindowEventType KeyUp : {
self dispatchEvent: (self convertKeyboardEventInto: event*->data*->keyboard into: KeyReleasedEvent new)
}.

SysmelPAL::WindowEventType::TextInput : {
SysmelPAL::WindowEventType TextInput : {
self dispatchEvent: (self convertTextInputEventInto: event*->data*->textInput into: TextInputEvent new)
}.
SysmelPAL::WindowEventType::TextEditing : {
SysmelPAL::WindowEventType TextEditing : {
self dispatchEvent: (self convertTextEditingEventInto: event*->data*->textEditing into: TextEditingEvent new)
}.

Expand Down
8 changes: 8 additions & 0 deletions package-sources/Graphics.Window/WindowFormRenderer.sysmel
Expand Up @@ -21,6 +21,14 @@ public class WindowFormRenderer superclass: WindowRenderer; definition: {
handle := nil.
}.

public method drawableSurfaceExtent => UInt32x2 := {
let outputWidth mutable := 0i32.
let outputHeight mutable := 0i32.
sysmel_pal_windowRenderer_getOutputSize(handle, outputWidth, outputHeight).

outputWidth asUInt32 @ outputHeight asUInt32
}.

public method ensureTextureWithWidth: (width: UInt32) height: (height: UInt32) ::=> Boolean := {
texture isNotNil && (textureWidth = width) && (textureHeight = height) ifTrue: {
return: true
Expand Down

0 comments on commit bc1f9c1

Please sign in to comment.