Skip to content

Commit 25be5d2

Browse files
authored
Merge pull request #861 from pharo-graphics/BlocHostSDL3
Add BlocHost-OSWindow-SDL3
2 parents a863816 + e787690 commit 25be5d2

15 files changed

Lines changed: 1074 additions & 0 deletions

src/Bloc/BlBounds.class.st

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,15 @@ BlBounds >> = aRectangle [
9393
and: [ left = aRectangle left ] ] ] ]
9494
]
9595

96+
{ #category : #converting }
97+
BlBounds >> asExpandedRectangle [
98+
"Convert me to immutable expanded (then, integer) Rectangle.
99+
Note, that using left:right:top:bottom: is the fastest way to create
100+
a rectangle from set of numbers (faster than Point#>>corner:)"
101+
102+
^ Rectangle left: left floor right: right ceiling top: top floor bottom: bottom ceiling
103+
]
104+
96105
{ #category : #converting }
97106
BlBounds >> asRectangle [
98107
"Convert me to immutable Rectangle.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
Class {
2+
#name : #BlOSSDL3HostTest,
3+
#superclass : #TestCase,
4+
#pools : [
5+
'SDL3KeyConstants'
6+
],
7+
#category : #'BlocHost-OSWindow-SDL3-Tests'
8+
}
9+
10+
{ #category : #tests }
11+
BlOSSDL3HostTest >> testKeyMapping [
12+
13+
| table |
14+
table := BlOSSDL3Host new keyboardKeyTable.
15+
16+
self assert: (table keyFromVirtualCode: SDLK_A) equals: KeyboardKey A.
17+
self assert: (table keyFromVirtualCode: SDLK_RETURN) equals: KeyboardKey enter.
18+
self assert: (table keyFromVirtualCode: SDLK_ESCAPE) equals: KeyboardKey escape.
19+
self assert: (table keyFromVirtualCode: SDLK_1) equals: KeyboardKey one.
20+
self assert: (table keyFromVirtualCode: SDLK_LSHIFT) equals: KeyboardKey shiftLeft.
21+
self assert: (table keyFromVirtualCode: SDLK_SPACE) equals: KeyboardKey space
22+
]
23+
24+
{ #category : #tests }
25+
BlOSSDL3HostTest >> testNewAttributesForSpace [
26+
27+
| host space attributes |
28+
host := BlOSSDL3Host new.
29+
space := BlSpace new.
30+
space title: 'Test Window'.
31+
space extent: 800@600.
32+
33+
attributes := host newAttributesFor: space.
34+
self assert: attributes title equals: 'Test Window'.
35+
self assert: attributes extent equals: 800@600.
36+
self assert: attributes visible not. "Visible should be false initially to avoid race condition"
37+
]
38+
39+
{ #category : #tests }
40+
BlOSSDL3HostTest >> testNewHostSpaceFor [
41+
42+
| host space hostSpace |
43+
host := BlOSSDL3Host new.
44+
space := BlSpace new.
45+
hostSpace := host newHostSpaceFor: space.
46+
47+
self assert: hostSpace class equals: BlOSSDL3SimpleHostSpace.
48+
self assert: hostSpace host equals: host.
49+
self assert: hostSpace space equals: space
50+
]
51+
52+
{ #category : #tests }
53+
BlOSSDL3HostTest >> testUseSDL3Host [
54+
55+
| space host |
56+
space := BlSpace new.
57+
space useSDL3Host.
58+
self assert: space host class equals: BlOSSDL3Host.
59+
60+
host := space host.
61+
host start.
62+
self assert: host isRunning.
63+
self assert: host class label equals: 'SDL3'.
64+
self assert: host class priority equals: 10.
65+
self assert: host class isSupported.
66+
]
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
Class {
2+
#name : #BlSDL3GPUHostDemo,
3+
#superclass : #Object,
4+
#category : #'BlocHost-OSWindow-SDL3-Tests'
5+
}
6+
7+
{ #category : #examples }
8+
BlSDL3GPUHostDemo class >> openGPURendererSpace [
9+
<script>
10+
| space element text originalRendererClass |
11+
12+
"Temporarily use the GPU renderer for this demo"
13+
originalRendererClass := BlOSSDL3Renderer defaultClass.
14+
BlOSSDL3Renderer defaultClass: BlOSSDL3GPURenderer.
15+
16+
space := BlSpace new.
17+
space extent: 600 @ 400.
18+
space title: 'Bloc SDL3 GPU Host Demo'.
19+
space host: BlOSSDL3Host new.
20+
21+
element := BlElement new
22+
extent: 200 @ 200;
23+
background: Color blue;
24+
position: 100 @ 100;
25+
yourself.
26+
27+
text := BlTextElement new
28+
text: ('Hello SDL3 GPU Host' asRopedText
29+
fontSize: 24;
30+
foreground: Color white);
31+
position: 20 @ 20.
32+
33+
element addChild: text.
34+
35+
element addEventHandler: (BlEventHandler
36+
on: BlMouseDownEvent
37+
do: [ :evt | element background: Color red ]).
38+
39+
element addEventHandler: (BlEventHandler
40+
on: BlMouseUpEvent
41+
do: [ :evt | element background: Color blue ]).
42+
43+
space root addChild: element.
44+
45+
"Restore the original renderer class after creating the space"
46+
space addEventHandler: (BlEventHandler
47+
on: BlSpaceClosedEvent
48+
do: [ :evt | BlOSSDL3Renderer defaultClass: originalRendererClass ]).
49+
50+
space show.
51+
^ space
52+
]
53+
54+
{ #category : #examples }
55+
BlSDL3GPUHostDemo class >> openSimpleSpace [
56+
<script>
57+
| space element text originalRendererClass |
58+
59+
"Temporarily use the GPU renderer for this demo"
60+
originalRendererClass := BlOSSDL3Renderer defaultClass.
61+
BlOSSDL3Renderer defaultClass: BlOSSDL3SimpleRenderer.
62+
63+
space := BlSpace new.
64+
space extent: 600 @ 400.
65+
space title: 'Bloc SDL3 GPU Host Demo'.
66+
space host: BlOSSDL3Host new.
67+
68+
element := BlElement new
69+
extent: 200 @ 200;
70+
background: Color blue;
71+
position: 100 @ 100;
72+
yourself.
73+
74+
text := BlTextElement new
75+
text: ('Hello SDL3 GPU Host' asRopedText
76+
fontSize: 24;
77+
foreground: Color white);
78+
position: 20 @ 20.
79+
80+
element addChild: text.
81+
82+
element addEventHandler: (BlEventHandler
83+
on: BlMouseDownEvent
84+
do: [ :evt | element background: Color red ]).
85+
86+
element addEventHandler: (BlEventHandler
87+
on: BlMouseUpEvent
88+
do: [ :evt | element background: Color blue ]).
89+
90+
space root addChild: element.
91+
92+
"Restore the original renderer class after creating the space"
93+
space addEventHandler: (BlEventHandler
94+
on: BlSpaceClosedEvent
95+
do: [ :evt | BlOSSDL3Renderer defaultClass: originalRendererClass ]).
96+
97+
space show.
98+
^ space
99+
]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Package { #name : #'BlocHost-OSWindow-SDL3-Tests' }
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
Class {
2+
#name : #BlOSSDL3GPUHostSpace,
3+
#superclass : #BlOSSDL3HostSpace,
4+
#category : #'BlocHost-OSWindow-SDL3'
5+
}
6+
7+
{ #category : #rendering }
8+
BlOSSDL3GPUHostSpace >> lockSurfaceFor: logicalDamagedRectangle scaleFactor: scaleFactor during: aBlock [
9+
10+
| form physicalDamagedRectangle |
11+
form := osWindow renderer form.
12+
form ifNil: [ ^ self ].
13+
14+
physicalDamagedRectangle :=
15+
((logicalDamagedRectangle
16+
intersect: (0@0 extent: osWindow extent)
17+
ifNone: [ ^ self ]) scaleBy: scaleFactor) asExpandedRectangle.
18+
19+
"Pass the logicalDamagedRectangle for surgical clipping in Cairo.
20+
physicalRectangle remains the full Form extent to match the backing surface."
21+
renderer
22+
renderWith: aBlock
23+
pixels: form bits
24+
stride: form width * 4
25+
physicalRectangle: (0@0 extent: form extent)
26+
logicalRectangle: logicalDamagedRectangle.
27+
28+
osWindow renderer updateRectangle: physicalDamagedRectangle
29+
]
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
Class {
2+
#name : #BlOSSDL3GPURenderer,
3+
#superclass : #BlOSSDL3Renderer,
4+
#instVars : [
5+
'formRenderer',
6+
'form'
7+
],
8+
#category : #'BlocHost-OSWindow-SDL3'
9+
}
10+
11+
{ #category : #accessing }
12+
BlOSSDL3GPURenderer class >> hostSpaceClass [
13+
^ BlOSSDL3GPUHostSpace
14+
]
15+
16+
{ #category : #'host space - accessing' }
17+
BlOSSDL3GPURenderer >> canvasExtent [
18+
19+
^ formRenderer outputExtent
20+
]
21+
22+
{ #category : #'updating screen' }
23+
BlOSSDL3GPURenderer >> flush [
24+
25+
formRenderer flush
26+
]
27+
28+
{ #category : #accessing }
29+
BlOSSDL3GPURenderer >> form [
30+
31+
^ form
32+
]
33+
34+
{ #category : #accessing }
35+
BlOSSDL3GPURenderer >> form: aForm [
36+
37+
form := aForm.
38+
formRenderer form: aForm
39+
]
40+
41+
{ #category : #accessing }
42+
BlOSSDL3GPURenderer >> formRenderer [
43+
44+
^ formRenderer
45+
]
46+
47+
{ #category : #initialization }
48+
BlOSSDL3GPURenderer >> initializeWith: aSDL3BackendWindow [
49+
50+
super initializeWith: aSDL3BackendWindow.
51+
formRenderer := OSSDL3GPUFormRenderer new.
52+
formRenderer backendWindow: aSDL3BackendWindow.
53+
"Use canvasExtent (physical pixels) for the backing Form on High-DPI"
54+
self form: (Form extent: aSDL3BackendWindow canvasExtent depth: 32)
55+
]
56+
57+
{ #category : #'updating screen' }
58+
BlOSSDL3GPURenderer >> present [
59+
60+
self flush
61+
]
62+
63+
{ #category : #'updating screen' }
64+
BlOSSDL3GPURenderer >> resized [
65+
"Recreate the backing form when the window is resized"
66+
self form: (Form extent: backendWindow canvasExtent depth: 32).
67+
formRenderer updateToNewResolution
68+
]
69+
70+
{ #category : #'updating screen' }
71+
BlOSSDL3GPURenderer >> updateRectangle: aRectangle [
72+
73+
formRenderer updateRectangle: aRectangle
74+
]

0 commit comments

Comments
 (0)