Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/Bloc/BlBounds.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,15 @@ BlBounds >> = aRectangle [
and: [ left = aRectangle left ] ] ] ]
]

{ #category : #converting }
BlBounds >> asExpandedRectangle [
"Convert me to immutable expanded (then, integer) Rectangle.
Note, that using left:right:top:bottom: is the fastest way to create
a rectangle from set of numbers (faster than Point#>>corner:)"

^ Rectangle left: left floor right: right ceiling top: top floor bottom: bottom ceiling
]

{ #category : #converting }
BlBounds >> asRectangle [
"Convert me to immutable Rectangle.
Expand Down
66 changes: 66 additions & 0 deletions src/BlocHost-OSWindow-SDL3-Tests/BlOSSDL3HostTest.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
Class {
#name : #BlOSSDL3HostTest,
#superclass : #TestCase,
#pools : [
'SDL3KeyConstants'
],
#category : #'BlocHost-OSWindow-SDL3-Tests'
}

{ #category : #tests }
BlOSSDL3HostTest >> testKeyMapping [

| table |
table := BlOSSDL3Host new keyboardKeyTable.

self assert: (table keyFromVirtualCode: SDLK_A) equals: KeyboardKey A.
self assert: (table keyFromVirtualCode: SDLK_RETURN) equals: KeyboardKey enter.
self assert: (table keyFromVirtualCode: SDLK_ESCAPE) equals: KeyboardKey escape.
self assert: (table keyFromVirtualCode: SDLK_1) equals: KeyboardKey one.
self assert: (table keyFromVirtualCode: SDLK_LSHIFT) equals: KeyboardKey shiftLeft.
self assert: (table keyFromVirtualCode: SDLK_SPACE) equals: KeyboardKey space
]

{ #category : #tests }
BlOSSDL3HostTest >> testNewAttributesForSpace [

| host space attributes |
host := BlOSSDL3Host new.
space := BlSpace new.
space title: 'Test Window'.
space extent: 800@600.

attributes := host newAttributesFor: space.
self assert: attributes title equals: 'Test Window'.
self assert: attributes extent equals: 800@600.
self assert: attributes visible not. "Visible should be false initially to avoid race condition"
]

{ #category : #tests }
BlOSSDL3HostTest >> testNewHostSpaceFor [

| host space hostSpace |
host := BlOSSDL3Host new.
space := BlSpace new.
hostSpace := host newHostSpaceFor: space.

self assert: hostSpace class equals: BlOSSDL3SimpleHostSpace.
self assert: hostSpace host equals: host.
self assert: hostSpace space equals: space
]

{ #category : #tests }
BlOSSDL3HostTest >> testUseSDL3Host [

| space host |
space := BlSpace new.
space useSDL3Host.
self assert: space host class equals: BlOSSDL3Host.

host := space host.
host start.
self assert: host isRunning.
self assert: host class label equals: 'SDL3'.
self assert: host class priority equals: 10.
self assert: host class isSupported.
]
99 changes: 99 additions & 0 deletions src/BlocHost-OSWindow-SDL3-Tests/BlSDL3GPUHostDemo.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
Class {
#name : #BlSDL3GPUHostDemo,
#superclass : #Object,
#category : #'BlocHost-OSWindow-SDL3-Tests'
}

{ #category : #examples }
BlSDL3GPUHostDemo class >> openGPURendererSpace [
<script>
| space element text originalRendererClass |

"Temporarily use the GPU renderer for this demo"
originalRendererClass := BlOSSDL3Renderer defaultClass.
BlOSSDL3Renderer defaultClass: BlOSSDL3GPURenderer.

space := BlSpace new.
space extent: 600 @ 400.
space title: 'Bloc SDL3 GPU Host Demo'.
space host: BlOSSDL3Host new.

element := BlElement new
extent: 200 @ 200;
background: Color blue;
position: 100 @ 100;
yourself.

text := BlTextElement new
text: ('Hello SDL3 GPU Host' asRopedText
fontSize: 24;
foreground: Color white);
position: 20 @ 20.

element addChild: text.

element addEventHandler: (BlEventHandler
on: BlMouseDownEvent
do: [ :evt | element background: Color red ]).

element addEventHandler: (BlEventHandler
on: BlMouseUpEvent
do: [ :evt | element background: Color blue ]).

space root addChild: element.

"Restore the original renderer class after creating the space"
space addEventHandler: (BlEventHandler
on: BlSpaceClosedEvent
do: [ :evt | BlOSSDL3Renderer defaultClass: originalRendererClass ]).

space show.
^ space
]

{ #category : #examples }
BlSDL3GPUHostDemo class >> openSimpleSpace [
<script>
| space element text originalRendererClass |

"Temporarily use the GPU renderer for this demo"
originalRendererClass := BlOSSDL3Renderer defaultClass.
BlOSSDL3Renderer defaultClass: BlOSSDL3SimpleRenderer.

space := BlSpace new.
space extent: 600 @ 400.
space title: 'Bloc SDL3 GPU Host Demo'.
space host: BlOSSDL3Host new.

element := BlElement new
extent: 200 @ 200;
background: Color blue;
position: 100 @ 100;
yourself.

text := BlTextElement new
text: ('Hello SDL3 GPU Host' asRopedText
fontSize: 24;
foreground: Color white);
position: 20 @ 20.

element addChild: text.

element addEventHandler: (BlEventHandler
on: BlMouseDownEvent
do: [ :evt | element background: Color red ]).

element addEventHandler: (BlEventHandler
on: BlMouseUpEvent
do: [ :evt | element background: Color blue ]).

space root addChild: element.

"Restore the original renderer class after creating the space"
space addEventHandler: (BlEventHandler
on: BlSpaceClosedEvent
do: [ :evt | BlOSSDL3Renderer defaultClass: originalRendererClass ]).

space show.
^ space
]
1 change: 1 addition & 0 deletions src/BlocHost-OSWindow-SDL3-Tests/package.st
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Package { #name : #'BlocHost-OSWindow-SDL3-Tests' }
29 changes: 29 additions & 0 deletions src/BlocHost-OSWindow-SDL3/BlOSSDL3GPUHostSpace.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Class {
#name : #BlOSSDL3GPUHostSpace,
#superclass : #BlOSSDL3HostSpace,
#category : #'BlocHost-OSWindow-SDL3'
}

{ #category : #rendering }
BlOSSDL3GPUHostSpace >> lockSurfaceFor: logicalDamagedRectangle scaleFactor: scaleFactor during: aBlock [

| form physicalDamagedRectangle |
form := osWindow renderer form.
form ifNil: [ ^ self ].

physicalDamagedRectangle :=
((logicalDamagedRectangle
intersect: (0@0 extent: osWindow extent)
ifNone: [ ^ self ]) scaleBy: scaleFactor) asExpandedRectangle.

"Pass the logicalDamagedRectangle for surgical clipping in Cairo.
physicalRectangle remains the full Form extent to match the backing surface."
renderer
renderWith: aBlock
pixels: form bits
stride: form width * 4
physicalRectangle: (0@0 extent: form extent)
logicalRectangle: logicalDamagedRectangle.

osWindow renderer updateRectangle: physicalDamagedRectangle
]
74 changes: 74 additions & 0 deletions src/BlocHost-OSWindow-SDL3/BlOSSDL3GPURenderer.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
Class {
#name : #BlOSSDL3GPURenderer,
#superclass : #BlOSSDL3Renderer,
#instVars : [
'formRenderer',
'form'
],
#category : #'BlocHost-OSWindow-SDL3'
}

{ #category : #accessing }
BlOSSDL3GPURenderer class >> hostSpaceClass [
^ BlOSSDL3GPUHostSpace
]

{ #category : #'host space - accessing' }
BlOSSDL3GPURenderer >> canvasExtent [

^ formRenderer outputExtent
]

{ #category : #'updating screen' }
BlOSSDL3GPURenderer >> flush [

formRenderer flush
]

{ #category : #accessing }
BlOSSDL3GPURenderer >> form [

^ form
]

{ #category : #accessing }
BlOSSDL3GPURenderer >> form: aForm [

form := aForm.
formRenderer form: aForm
]

{ #category : #accessing }
BlOSSDL3GPURenderer >> formRenderer [

^ formRenderer
]

{ #category : #initialization }
BlOSSDL3GPURenderer >> initializeWith: aSDL3BackendWindow [

super initializeWith: aSDL3BackendWindow.
formRenderer := OSSDL3GPUFormRenderer new.
formRenderer backendWindow: aSDL3BackendWindow.
"Use canvasExtent (physical pixels) for the backing Form on High-DPI"
self form: (Form extent: aSDL3BackendWindow canvasExtent depth: 32)
]

{ #category : #'updating screen' }
BlOSSDL3GPURenderer >> present [

self flush
]

{ #category : #'updating screen' }
BlOSSDL3GPURenderer >> resized [
"Recreate the backing form when the window is resized"
self form: (Form extent: backendWindow canvasExtent depth: 32).
formRenderer updateToNewResolution
]

{ #category : #'updating screen' }
BlOSSDL3GPURenderer >> updateRectangle: aRectangle [

formRenderer updateRectangle: aRectangle
]
Loading
Loading