sgl 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. data/ChangeLog +234 -0
  2. data/Manifest.txt +94 -0
  3. data/Rakefile +16 -5
  4. data/examples/cocoa1-basic.rb +14 -0
  5. data/examples/cocoa10-transparent.rb +26 -0
  6. data/examples/cocoa11-application.rb +13 -0
  7. data/examples/cocoa2-draw.rb +23 -0
  8. data/examples/cocoa3-affine.rb +29 -0
  9. data/examples/cocoa4-font.rb +24 -0
  10. data/examples/cocoa5-image.rb +22 -0
  11. data/examples/cocoa6-sound.rb +24 -0
  12. data/examples/cocoa7-movie.rb +40 -0
  13. data/examples/cocoa8-movieoverlay.rb +42 -0
  14. data/examples/cocoa9-streaming.rb +40 -0
  15. data/examples/opengl1-basic.rb +14 -0
  16. data/examples/opengl11-application.rb +13 -0
  17. data/examples/opengl2-draw.rb +23 -0
  18. data/examples/opengl3-affine.rb +29 -0
  19. data/examples/sample1.rb +11 -0
  20. data/examples/sample10.rb +16 -0
  21. data/examples/sample11.rb +22 -0
  22. data/examples/sample11a.rb +33 -0
  23. data/examples/sample12.rb +30 -0
  24. data/examples/sample12a.rb +35 -0
  25. data/examples/sample13.rb +116 -0
  26. data/examples/sample15.rb +24 -0
  27. data/examples/sample16.rb +31 -0
  28. data/examples/sample16a.rb +35 -0
  29. data/examples/sample6.rb +18 -0
  30. data/examples/sample7.rb +16 -0
  31. data/examples/sample9.rb +20 -0
  32. data/examples/sgl-sound1.rb +6 -0
  33. data/examples/sgl-sound2.rb +19 -0
  34. data/examples/sine.ogg +0 -0
  35. data/examples/testgl.rb +169 -0
  36. data/lib/sgl/bass-api.rb +202 -0
  37. data/lib/sgl/bass-sample.rb +106 -0
  38. data/lib/sgl/bass.rb +46 -0
  39. data/lib/sgl/cocoa-app.rb +43 -0
  40. data/lib/sgl/cocoa-color.rb +65 -0
  41. data/lib/sgl/cocoa-draw.rb +72 -0
  42. data/lib/sgl/cocoa-event.rb +229 -0
  43. data/lib/sgl/cocoa-media.rb +144 -0
  44. data/lib/sgl/cocoa-notuse.rb +493 -0
  45. data/lib/sgl/cocoa-window.rb +203 -0
  46. data/lib/sgl/cocoa.rb +8 -0
  47. data/lib/sgl/notuse-objs.rb +358 -0
  48. data/lib/sgl/opengl-app.rb +38 -0
  49. data/lib/sgl/opengl-color.rb +44 -0
  50. data/lib/sgl/opengl-draw.rb +260 -0
  51. data/lib/sgl/opengl-event.rb +325 -0
  52. data/lib/sgl/opengl-modules.rb +22 -0
  53. data/lib/sgl/opengl-window.rb +224 -0
  54. data/lib/sgl/opengl.rb +7 -0
  55. data/lib/sgl/sgl-basic.rb +61 -0
  56. data/lib/sgl/sgl-button.rb +135 -0
  57. data/lib/sgl/sgl-client.rb +21 -0
  58. data/lib/sgl/sgl-color.rb +82 -0
  59. data/lib/sgl/sgl-connect.rb +9 -0
  60. data/lib/sgl/sgl-objlib.rb +0 -0
  61. data/lib/sgl/sgl-objs.rb +0 -0
  62. data/lib/sgl/sgl-server.rb +58 -0
  63. data/lib/sgl/sgl-sound.rb +24 -0
  64. data/lib/sgl/sgl-spring.rb +216 -0
  65. data/lib/sgl/sgl-timer.rb +72 -0
  66. data/lib/sgl/sgl.rb +5 -0
  67. data/lib/sgl/version.rb +2 -2
  68. data/scripts/makemanifest.rb +20 -0
  69. data/test/test_bass.rb +27 -0
  70. data/test/test_cocoa_app.rb +5 -5
  71. data/test/test_helper.rb +9 -1
  72. data/test/test_module_ruby16.rb +22 -21
  73. data/test/test_opengl_app.rb +4 -5
  74. data/test/test_opengl_basic.rb +3 -4
  75. data/test/test_opengl_fullscreen.rb +4 -6
  76. data/test/test_opengl_novice.rb +3 -6
  77. data/test/test_sgl.rb +4 -27
  78. data/test/test_sound.rb +15 -0
  79. data/website/challenge1.html +91 -0
  80. data/website/challenge1.txt +30 -0
  81. data/website/challenge2.html +144 -0
  82. data/website/challenge2.txt +73 -0
  83. data/website/challenge3.html +63 -0
  84. data/website/challenge3.txt +15 -0
  85. data/website/cocoa.html +88 -0
  86. data/website/cocoa.txt +35 -0
  87. data/website/description.html +138 -0
  88. data/website/description.txt +90 -0
  89. data/website/exercise1.html +264 -0
  90. data/website/exercise1.txt +192 -0
  91. data/website/exercise2.html +683 -0
  92. data/website/exercise2.txt +597 -0
  93. data/website/exhibition.html +84 -0
  94. data/website/exhibition.txt +24 -0
  95. data/website/howto.html +134 -0
  96. data/website/howto.txt +56 -0
  97. data/website/index.html +17 -9
  98. data/website/index.txt +13 -4
  99. data/website/sound.html +141 -0
  100. data/website/sound.txt +87 -0
  101. data/website/stylesheets/grade.png +0 -0
  102. data/website/stylesheets/screen.css +21 -20
  103. metadata +109 -3
@@ -0,0 +1,493 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+ # These classes are not using.
4
+
5
+ =begin
6
+ module SGL
7
+ class NuVideo
8
+ include Singleton
9
+
10
+ def initialize
11
+ Thread.abort_on_exception = true
12
+ @win = Window.alloc.init
13
+ end
14
+ attr_reader :win
15
+ end
16
+
17
+ class NuWindow < OSX::NSObject
18
+ def init
19
+ OSX.ruby_thread_switcher_start(0.001, 0.01)
20
+ @app = OSX::NSApplication.sharedApplication
21
+ @app.setMainMenu(OSX::NSMenu.alloc.init)
22
+ @rgb = ColorTranslatorRGB.new(100, 100, 100, 100) # color translator
23
+ @hsv = ColorTranslatorHSV.new(100, 100, 100, 100)
24
+ @mouseX = @mouseY = @mouseDown = 0
25
+ @keynum = 0
26
+ $windowBorder = 1
27
+ $windowShadow = 1
28
+ $windowBackground = 1
29
+ $windowDelay = 1.0/60
30
+ $windowMovie = 0
31
+ @window_initialized = false
32
+ @setup_done = false
33
+ @display_drawing = false
34
+
35
+ @bgview = @oview = nil
36
+
37
+ return self # important for RubyCocoa
38
+ end
39
+ attr_reader :mouseX, :mouseY, :mouseDown, :keynum
40
+
41
+ # generate window
42
+ def window(w, h)
43
+ return if @window_initialized
44
+ s = OSX::NSScreen.mainScreen.frame.size
45
+ x = (s.width - w)/2.0
46
+ y = (s.height - h)/2.0
47
+ @win_frame = [x.to_f, y.to_f, w.to_f, h.to_f]
48
+ window_open
49
+ end
50
+
51
+ def window_open
52
+ style = OSX::NSClosableWindowMask
53
+ style |= ($windowBorder && $windowBorder == 0) ?
54
+ OSX::NSBorderlessWindowMask : OSX::NSTitledWindowMask
55
+ @win = SglWindow.alloc.
56
+ initWithContentRect(@win_frame,
57
+ :styleMask, style,
58
+ :backing, OSX::NSBackingStoreBuffered,
59
+ :defer, true)
60
+ @win.setTitle("sgl")
61
+ @bgview = BackView.alloc.init
62
+ @bgview.myinit(self)
63
+ @win.setContentView(@bgview)
64
+ @bgcolor = @curcolor = nil
65
+ background(100) # white
66
+ color(0) # black
67
+ @win.setDelegate(self) # for handling windowShouldClose
68
+ @win.setOpaque(false) # can be transparent
69
+ @win.setHasShadow(!($windowShadow && $windowShadow == 0))
70
+ @win.setReleasedWhenClosed(false)
71
+ @win.makeKeyAndOrderFront(self)
72
+ @win.orderFrontRegardless # show the window
73
+ window_movie if $windowMovie == 1
74
+ window_overlay if defined?(displayOverlay)
75
+ @window_initialized = true
76
+ @win
77
+ end
78
+
79
+ def window_movie
80
+ o = @bgview.frame.origin
81
+ so = @win.convertBaseToScreen([o.x, o.y])
82
+ s = @bgview.frame.size
83
+ @movwin = SglWindow.alloc.
84
+ initWithContentRect([so.x, so.y, s.width, s.height],
85
+ :styleMask, OSX::NSBorderlessWindowMask,
86
+ :backing, OSX::NSBackingStoreBuffered,
87
+ :defer, true)
88
+ @movwin.setOpaque(false) # can be transparent
89
+ @movwin.setHasShadow(false)
90
+ @movwin.setIgnoresMouseEvents(true)
91
+ @movwin.setAlphaValue(1.0)
92
+ b = @bgview.bounds
93
+ bo, bs = b.origin, b.size
94
+ @movview = MovieView.alloc.initWithFrame([bo.x, bo.y, bs.width, bs.height])
95
+ @movview.myinit(self)
96
+ @movwin.contentView.addSubview(@movview)
97
+ @movwin.orderFront(self)
98
+ @win.addChildWindow(@movwin, :ordered, OSX::NSWindowAbove)
99
+ @movview.setNeedsDisplay(true)
100
+ @movewin
101
+ end
102
+
103
+ def window_overlay
104
+ o = @bgview.frame.origin
105
+ so = @win.convertBaseToScreen([o.x, o.y])
106
+ s = @bgview.frame.size
107
+ @owin = SglWindow.alloc.
108
+ initWithContentRect([so.x, so.y, s.width, s.height],
109
+ :styleMask, OSX::NSBorderlessWindowMask,
110
+ :backing, OSX::NSBackingStoreBuffered,
111
+ :defer, true)
112
+ @owin.setOpaque(false) # can be transparent
113
+ @owin.setHasShadow(false)
114
+ @owin.setIgnoresMouseEvents(true)
115
+ @owin.setAlphaValue(1.0)
116
+ b = @bgview.bounds
117
+ bo, bs = b.origin, b.size
118
+ @oview = OverView.alloc.initWithFrame([bo.x, bo.y, bs.width, bs.height])
119
+ @oview.myinit(self)
120
+ @owin.contentView.addSubview(@oview)
121
+ @owin.orderFront(self)
122
+ if $windowMovie == 1
123
+ @movwin.addChildWindow(@owin, :ordered, OSX::NSWindowAbove)
124
+ else
125
+ @win.addChildWindow(@owin, :ordered, OSX::NSWindowAbove)
126
+ end
127
+ @oview.setNeedsDisplay(true)
128
+ # timer = OSX::NSTimer.
129
+ # scheduledTimerWithTimeInterval(1.0/60,
130
+ # :target, self,
131
+ # :selector, "timerloop",
132
+ # :userInfo, nil,
133
+ # :repeats, true).retain
134
+ # OSX::NSRunLoop.currentRunLoop.
135
+ # addTimer(timer, :forMode, OSX::NSEventTrackingRunLoopMode)
136
+ @owin
137
+ end
138
+ attr_reader :bgcolor, :curcolor
139
+
140
+ def setup_post
141
+ @setup_done = true
142
+ end
143
+
144
+ def windowShouldClose(sender)
145
+ OSX.NSApp.stop(nil)
146
+ false
147
+ end
148
+
149
+ def timerloop
150
+ p "timerloop"
151
+ end
152
+
153
+ # main loop
154
+ def mainloop
155
+ @thread = Thread.start {
156
+ loop {
157
+ setNeedsDisplay
158
+ delay
159
+ }
160
+ }
161
+ end
162
+
163
+ def setNeedsDisplay
164
+ @bgview.setNeedsDisplay(true)
165
+ @oview.setNeedsDisplay(true) if @oview
166
+ end
167
+
168
+ def delay
169
+ sleep $windowDelay
170
+ end
171
+
172
+ def run
173
+ @app.run
174
+ end
175
+
176
+ # handle events
177
+ def winmouseDown
178
+ @mouseDown = 1
179
+ onMouseDown(@mouseX, @mouseY)
180
+ end
181
+
182
+ def winmouseUp
183
+ @mouseDown = 0
184
+ onMouseUp(@mouseX, @mouseY)
185
+ end
186
+
187
+ def winkeyDown(e)
188
+ calc_keynum(e)
189
+ p @keynum
190
+ onKeyDown(@keynum)
191
+ end
192
+
193
+ def winkeyUp(e)
194
+ calc_keynum(e)
195
+ @keynum = 0
196
+ p @keynum
197
+ onKeyUp(@keynum)
198
+ end
199
+
200
+ def calc_keynum(e)
201
+ input = event.characters
202
+ @keynum = input.to_s[0]
203
+ end
204
+
205
+ # display
206
+ def display_bg(rect)
207
+ return if $windowBackground != 1
208
+ color_set(*@bgcolor)
209
+ OSX::NSRectFill(rect)
210
+ # if @lastbgcolor && @lastbgcolor != @bgcolor
211
+ # end
212
+ # @lastbgcolor = @bgcolor.dup
213
+ end
214
+
215
+ def display_pre
216
+ pos = @win.mouseLocationOutsideOfEventStream
217
+ @mouseX, @mouseY = pos.x, pos.y
218
+ color_set(*@curcolor) # set back current color
219
+ end
220
+
221
+ def display_all(rect)
222
+ return if !@setup_done
223
+ # return if @display_drawing
224
+ return if defined?(display_drawing) && display_drawing
225
+ @display_drawing = true
226
+ display_bg(rect)
227
+ display_pre
228
+ display
229
+ display_post
230
+ @display_drawing = false
231
+ end
232
+
233
+ def display_mov(rect)
234
+ color_set(0, 0, 0, 0) # full transparent
235
+ OSX::NSRectFill(rect)
236
+ color_set(*@curcolor) # set back current color
237
+ end
238
+
239
+ def display_overlay_all(rect)
240
+ return if !@setup_done
241
+ return if @display_overlay_drawing
242
+ @display_overlay_drawing = true
243
+ color_set(0, 0, 0, 0) # display_bg
244
+ OSX::NSRectFill(rect)
245
+ color_set(*@curcolor) # set back current color
246
+ displayOverlay
247
+ @display_overlay_drawing = false
248
+ end
249
+
250
+ def display_post
251
+ end
252
+
253
+ # sgl commands
254
+ def background(x, y=nil, z=nil, a=nil)
255
+ @bgcolor = @rgb.norm(x,y,z,a)
256
+ end
257
+
258
+ def backgroundHSV(x, y=nil, z=nil, a=nil)
259
+ @bgcolor = @hsv.norm(x,y,z,a)
260
+ end
261
+
262
+ def color(x, y=nil, z=nil, a=nil)
263
+ @curcolor = @rgb.norm(x,y,z,a)
264
+ color_set(*@curcolor)
265
+ end
266
+
267
+ def colorHSV(x,y=nil,z=nil,a=nil)
268
+ @curcolor = @hsv.norm(x,y,z,a)
269
+ color_set(*@curcolor)
270
+ end
271
+
272
+ def color_set(*a)
273
+ color_make(*a).set if @window_initialized
274
+ end
275
+
276
+ def color_make(r, g, b, a)
277
+ OSX::NSColor.colorWithDeviceRed(r,:green, g, :blue, b, :alpha, a)
278
+ end
279
+
280
+ def color_cur
281
+ color_make(*@curcolor)
282
+ end
283
+ end
284
+
285
+ class SglWindow < OSX::NSWindow
286
+ # ns_overrides :keyDown_, :keyUp_
287
+ # def keyDown(event)
288
+ # p "ho"
289
+ # end
290
+ end
291
+
292
+ class BackView < OSX::NSView
293
+ ns_overrides :drawRect_,
294
+ :mouseDown_, :mouseDragged_, :mouseUp_, :keyDown_, :keyUp_
295
+ def myinit(win) @win = win; end
296
+ def drawRect(rect) @win.display_all(rect); end
297
+ def mouseDown(event) @win.winmouseDown; end
298
+ def mouseDragged(event) end
299
+ def mouseUp(event) @win.winmouseUp; end
300
+ def keyDown(event) @win.winkeyDown(event);
301
+ p "ho"
302
+ end
303
+ def keyUp(event) @win.winkeyUp(event); end
304
+ end
305
+
306
+ class OverView < OSX::NSView
307
+ ns_overrides :drawRect_
308
+ def myinit(win) @win = win; end
309
+ def drawRect(rect) @win.display_overlay_all(rect); end
310
+ end
311
+
312
+ class MovieView < OSX::NSView
313
+ ns_overrides :drawRect_
314
+ def myinit(win) @win = win; end
315
+ def drawRect(rect) @win.display_mov(rect); end
316
+ end
317
+
318
+ class NuWindow < OSX::NSObject
319
+ def movie(u)
320
+ # if %r$^http://$ =~ u || %r$^rtsp://$ =~ u
321
+ if /\Ahttp:\/\// =~ u || /\Artsp:\/\// =~ u
322
+ url = OSX::NSURL.URLWithString_(u)
323
+ else
324
+ url = OSX::NSURL.fileURLWithPath_(u)
325
+ end
326
+ mov = OSX::NSMovie.alloc.initWithURL(url, :byReference, true)
327
+ # place it outer of the screen
328
+ obj = SglMovieView.alloc.initWithFrame([-100.0, -100.0, 10.0, 10.0])
329
+ obj.myinit(self)
330
+ obj.setMovie(mov)
331
+ obj.showController(false, :adjustingSize, false)
332
+ if $windowMovie == 1
333
+ @movview.addSubview(obj)
334
+ else
335
+ @bgview.addSubview(obj)
336
+ end
337
+ # @oview.addSubview(obj)
338
+ obj
339
+ end
340
+
341
+ def image(file)
342
+ img = SglImage.alloc.initWithContentsOfFile(file)
343
+ img.myinit(self)
344
+ img
345
+ end
346
+
347
+ def font(*a)
348
+ SglFont.new(self, *a)
349
+ end
350
+
351
+ def sound(file)
352
+ url = OSX::NSURL.fileURLWithPath_(file)
353
+ snd = SglSound.alloc.initWithContentsOfURL(url, :byReference, true)
354
+ snd
355
+ end
356
+ end
357
+
358
+ class SglMovieView < OSX::NSMovieView
359
+ def myinit(win)
360
+ @win = win
361
+ end
362
+
363
+ def rect(a,b,c,d)
364
+ frame(*to_xywh(a, b, c, d))
365
+ end
366
+
367
+ def frame(a,b,c,d)
368
+ setFrame([a, b, c, d])
369
+ # @win.switch_to_over
370
+ end
371
+
372
+ def play() start_; end
373
+ def stop() stop_; end
374
+ def goBegin() gotoBeginning_; end
375
+ def goEnd() gotoEnd_; end
376
+ def forward() stepForward_; end
377
+ def back() stepBack_; end
378
+ def loop=(a) setLoopMode(a); end
379
+ def rate=(r) setRate(r/100.0); end
380
+ def volume=(v) setVolume(v/100.0); end
381
+ end
382
+
383
+ class SglImage < OSX::NSImage
384
+ def myinit(win)
385
+ @win = win
386
+ end
387
+
388
+ def rect(a,b,c,d) frame(*to_xywh(a, b, c, d)); end
389
+ def frame(x,y,w,h)
390
+ drawInRect([x,y,w,h],
391
+ :fromRect, [0,0,size.width,size.height],
392
+ :operation, OSX::NSCompositeSourceOver,
393
+ :fraction, @win.curcolor[3])
394
+ end
395
+ end
396
+
397
+ class SglFont
398
+ def initialize(w, n="Helvetica", s=0.0)
399
+ @win, @name, @size = w, n, s.abs
400
+ end
401
+ attr_accessor :name
402
+ attr_reader :size
403
+
404
+ def size=(s)
405
+ @size = s.abs
406
+ end
407
+
408
+ def to_sjis(str)
409
+ NKF.nkf("-m0 -s", str)
410
+ end
411
+
412
+ def text(x, y, str)
413
+ return unless str.is_a? String
414
+ str = str.to_sjis
415
+ str = to_sjis(str)
416
+ str = OSX::NSMutableAttributedString.alloc.initWithString(str)
417
+ str.addAttribute(OSX::NSFontAttributeName(),
418
+ :value, OSX::NSFont.fontWithName(@name, :size, @size),
419
+ :range, [0,str.length])
420
+ str.addAttribute(OSX::NSForegroundColorAttributeName(),
421
+ :value, @win.color_cur,
422
+ :range, [0,str.length])
423
+ str.drawAtPoint([x, y])
424
+ end
425
+
426
+ def show_fixed() show(OSX::NSFixedPitchFontMask); end
427
+ def show_all() show(); end
428
+
429
+ private
430
+ def show(mask=0)
431
+ fmgr = OSX::NSFontManager.sharedFontManager
432
+ fonts = fmgr.availableFontNamesWithTraits(mask).to_a.map{|i| i.to_s }.sort
433
+ puts fonts
434
+ end
435
+ end
436
+
437
+ class SglSound < OSX::NSSound
438
+ # def play() play_; end
439
+ end
440
+ end
441
+ =end
442
+
443
+ =begin
444
+ # sgl commands
445
+ def point(a,b)
446
+ line(a,b,a,b)
447
+ end
448
+
449
+ def lineWidth(w)
450
+ OSX::NSBezierPath.setDefaultLineWidth(w)
451
+ end
452
+
453
+ def line(a,b,c,d)
454
+ OSX::NSBezierPath.strokeLineFromPoint(OSX::NSPoint.new(a, b),
455
+ :toPoint, OSX::NSPoint.new(c, d))
456
+ end
457
+
458
+ def rect(a,b,c,d)
459
+ rect = OSX::NSRect.new(*to_xywh(a, b, c, d))
460
+ OSX::NSBezierPath.bezierPathWithRect(rect).fill
461
+ end
462
+
463
+ def circle(x, y, r)
464
+ rect = OSX::NSRect.new(x - r, y - r, 2*r, 2*r)
465
+ OSX::NSBezierPath.bezierPathWithOvalInRect(rect).fill
466
+ end
467
+
468
+ def to_xywh(a,b,c,d)
469
+ [[a, c].min, [b, d].min, (a - c).abs, (b - d).abs]
470
+ end
471
+
472
+ def rotateZ(deg)
473
+ af = OSX::NSAffineTransform.transform
474
+ af.rotateByDegrees(deg)
475
+ af.concat
476
+ end
477
+
478
+ def translate(x, y)
479
+ af = OSX::NSAffineTransform.transform
480
+ af.translateXBy(x, :yBy, y)
481
+ af.concat
482
+ end
483
+
484
+ def scale(x, y=nil)
485
+ af = OSX::NSAffineTransform.transform
486
+ y ? af.scaleXBy(x, :yBy, y) : af.scaleBy(x)
487
+ af.concat
488
+ end
489
+
490
+ def reset()
491
+ OSX::NSAffineTransform.transform.set
492
+ end
493
+ =end
@@ -0,0 +1,203 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ module SGL
5
+ # window functions
6
+ def window(*a) $__a__.window(*a); end
7
+ def close_window() $__a__.close_window; end
8
+ def width() $__a__.width; end
9
+ def height() $__a__.height; end
10
+
11
+ class Application
12
+ def initialize_window
13
+ @options = default_options
14
+ @win = @bgview = nil
15
+ @width = @height = nil
16
+ @oview = @movview = nil
17
+ @thread = nil
18
+ end
19
+ private :initialize_window
20
+
21
+ def default_options
22
+ {
23
+ :shadow=>true,
24
+ :border=>true,
25
+ :movie=>false,
26
+ :overlay=>false,
27
+ }
28
+ end
29
+ private :default_options
30
+
31
+ # create window
32
+ def window(*a)
33
+ return if @win
34
+
35
+ @options.update(a.pop) if a.last.is_a? Hash
36
+
37
+ if defined?($windowShadow)
38
+ @options[:shadow] = $windowShadow == 1
39
+ end
40
+
41
+ if defined?($windowBorder)
42
+ @options[:border] = $windowBorder == 1
43
+ end
44
+
45
+ if @block[:display_overlay]
46
+ @options[:overlay] = true
47
+ end
48
+
49
+ # get window size
50
+ case a.length
51
+ when 2
52
+ w, h = a
53
+ when 4
54
+ raise "not implemented" # x1, y1, x2, y3 = a
55
+ else
56
+ raise "please specify width and height"
57
+ end
58
+ @width, @height = w, h
59
+
60
+ cocoa_create_window(w, h)
61
+ end
62
+
63
+ def close_window
64
+ @win.close if @win
65
+ @win = @bgview = nil
66
+ end
67
+
68
+ attr_reader :width, :height
69
+
70
+ def cocoa_create_window(w, h)
71
+ @receiver = CocoaReceiver.alloc.init
72
+ @receiver.setApp(self)
73
+
74
+ # create a window
75
+ s = OSX::NSScreen.mainScreen.frame.size
76
+ x = (s.width - w) / 2.0
77
+ y = (s.height - h) / 2.0
78
+ win_frame = [x.to_f, y.to_f, w.to_f, h.to_f]
79
+ style = OSX::NSClosableWindowMask
80
+ style |= @options[:border] ? OSX::NSTitledWindowMask :
81
+ OSX::NSBorderlessWindowMask
82
+ win = NSWindow.alloc.
83
+ initWithContentRect(win_frame,
84
+ :styleMask, style,
85
+ :backing, OSX::NSBackingStoreBuffered,
86
+ :defer, true)
87
+ win.setTitle("sgl")
88
+
89
+ # create a view
90
+ view = SglNSView.alloc.init
91
+ view.setApp(self)
92
+ win.setContentView(view)
93
+ background(100) # white
94
+ color(0) # black
95
+
96
+ # for handling windowShouldClose
97
+ win.setDelegate(@receiver)
98
+ win.setOpaque(false) # can be transparent
99
+ win.setHasShadow(@options[:shadow])
100
+ win.setReleasedWhenClosed(false)
101
+ win.makeKeyAndOrderFront(@receiver)
102
+ win.orderFrontRegardless # show the window now
103
+ @win = win
104
+ @bgview = view
105
+ window_movie(@options) if @options[:movie]
106
+ #window_overlay(@options) if defined?(displayOverlay)
107
+ window_overlay(@options) if @options[:overlay]
108
+ @win
109
+ end
110
+
111
+ # sub view
112
+ def window_movie(options)
113
+ @movwin, @movview = make_view(@win, @bgview, NSViewForMovie, @options)
114
+ @win.addChildWindow(@movwin, :ordered, OSX::NSWindowAbove)
115
+ @movview.setNeedsDisplay(true)
116
+ @movwin
117
+ end
118
+
119
+ def window_overlay(options)
120
+ @owin, @oview = make_view(@win, @bgview, NSViewForOverlay, options)
121
+ win = options[:movie] ? @movwin : @win
122
+ win.addChildWindow(@owin, :ordered, OSX::NSWindowAbove)
123
+ @oview.setNeedsDisplay(true)
124
+ @owin
125
+ end
126
+
127
+ def make_view(parent_win, parent_view, viewclass, options)
128
+ o = parent_view.frame.origin
129
+ so = parent_win.convertBaseToScreen([o.x, o.y])
130
+ s = parent_view.frame.size
131
+ win_frame = [so.x, so.y, s.width, s.height]
132
+ win = NSWindow.alloc.
133
+ initWithContentRect(win_frame,
134
+ :styleMask, OSX::NSBorderlessWindowMask,
135
+ :backing, OSX::NSBackingStoreBuffered,
136
+ :defer, true)
137
+ win.setOpaque(false) # can be transparent
138
+ win.setHasShadow(false)
139
+ win.setIgnoresMouseEvents(true)
140
+ win.setAlphaValue(1.0) # transparent
141
+ b = parent_view.bounds
142
+ bo, bs = b.origin, b.size
143
+ frame = [bo.x, bo.y, bs.width, bs.height]
144
+ view = viewclass.alloc.initWithFrame(frame)
145
+ view.setApp(self)
146
+ win.contentView.addSubview(view)
147
+ win.orderFront(@receiver)
148
+ return win, view
149
+ end
150
+ private :window_movie, :window_overlay, :make_view
151
+
152
+ # Cocoa callback methods
153
+ def window_should_close
154
+ stop
155
+ end
156
+ end
157
+
158
+ class CocoaReceiver < OSX::NSObject
159
+ def init
160
+ @app = nil
161
+ return self
162
+ end
163
+
164
+ def setApp(app)
165
+ @app = app
166
+ end
167
+
168
+ # Cocoa callback methods
169
+ def windowShouldClose(sender)
170
+ @app.window_should_close
171
+ end
172
+ end
173
+
174
+ class NSWindow < OSX::NSWindow
175
+ end
176
+
177
+ # Do not use NSView for class name.
178
+ # It causes Illeagal Instruction Error.
179
+ # I don't know why.
180
+ class SglNSView < OSX::NSView
181
+ ns_overrides :drawRect_,
182
+ :mouseDown_, :mouseDragged_, :mouseUp_, :keyDown_, :keyUp_
183
+ def setApp(app) @app = app; end
184
+ def drawRect(rect) @app.display_all(rect); end
185
+ def mouseDown(event) @app.do_mousedown; end
186
+ def mouseDragged(event) end # ignore
187
+ def mouseUp(event) @app.do_mouseup; end
188
+ def keyDown(event) @app.do_keydown(event); end
189
+ def keyUp(event) @app.do_keyup(event); end
190
+ end
191
+
192
+ class NSViewForOverlay < OSX::NSView
193
+ ns_overrides :drawRect_
194
+ def setApp(app) @app = app; end
195
+ def drawRect(rect) @app.display_overlay_all(rect); end
196
+ end
197
+
198
+ class NSViewForMovie < OSX::NSView
199
+ ns_overrides :drawRect_
200
+ def setApp(app) @app = app; end
201
+ def drawRect(rect) @app.display_mov(rect); end
202
+ end
203
+ end
data/lib/sgl/cocoa.rb ADDED
@@ -0,0 +1,8 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ require "sgl/cocoa-app"
5
+ require "sgl/cocoa-functions"
6
+
7
+ include SGL
8
+ $__a__ = Application.new