glimmer-dsl-swt 4.18.4.7 → 4.18.4.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 51dc789287aa0203306dc929ed567af49696f266cab8581f5aa4252ec61055a0
4
- data.tar.gz: 8c4f4042cb47f7a21b82894160358a70e119c2ddd4bee12ad3318e626c376f23
3
+ metadata.gz: 89ea3be1af753358a8beaffbf28c8dfd6602eae3903b01a884e6999f0dbf6cfb
4
+ data.tar.gz: 672422abf1637420ac51706373824ac821682eab77afe86b91e22b21f1e00eb6
5
5
  SHA512:
6
- metadata.gz: a0a663e6bec722f38050619d6d9ffe5cd65cc3e7384a19447b2ce83d2ec7a24abb4b591e067c75616df5fa85647886ac78b565fe22f67c51381b09030cbd9ec4
7
- data.tar.gz: f31423c8317d5199a1188daadb712b7933277714215a392870056e83d726a9ab27cd8b7b9fcbaf9446bab2c176145149a358049e80762f6b953814238a3d518e
6
+ metadata.gz: 7b502b353aa06f6b26e39487859ae8f4d9f8ee47d74a4a97a224b14dfa8b18acba6d8e48b6a66ee518a8075cd90a6303f1864726a22812edf98515f6a2754aa2
7
+ data.tar.gz: a5926f825b0247d4b521bfa2f857d1b1f88d731dba9651690960cf7c516ef2a1c5aca9c6cce86878162358fb416a0913b3ba945b0589be19f78f94454848d0b5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Change Log
2
2
 
3
+ ### 4.18.4.8
4
+
5
+ - Make `image` a top-level expression keyword
6
+ - Default placing image on Canvas at coordinates 0, 0 if they are not specified (e.g. canvas {image some_image})
7
+ - Support passing in color args directly to the `pixel` keyword as an rgb value array without using the `color`/`rgb` keyword, to improve performance for large pixel counts
8
+ - Support Image Double Buffering by nesting an `image` built from shapes within a `canvas`
9
+ - Shrink image of baseball background for Hello, Table! Sample to reduce the glimmer-dsl-swt gem size (recently bloated)
10
+ - Fix issue with closing a canvas shell with pixel graphics freezing temporarily for a long time while disposing shapes
11
+ - Fix issue with disposing `image` having shapes
12
+
3
13
  ### 4.18.4.7
4
14
 
5
15
  - Fixed issue with Tetris breaking with the latest Canvas Shape/Animation DSL performance optimizations
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for SWT 4.18.4.7
1
+ # [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for SWT 4.18.4.8
2
2
  ## JRuby Desktop Development GUI Framework
3
3
  [![Gem Version](https://badge.fury.io/rb/glimmer-dsl-swt.svg)](http://badge.fury.io/rb/glimmer-dsl-swt)
4
4
  [![Travis CI](https://travis-ci.com/AndyObtiva/glimmer-dsl-swt.svg?branch=master)](https://travis-ci.com/github/AndyObtiva/glimmer-dsl-swt)
@@ -342,7 +342,7 @@ jgem install glimmer-dsl-swt
342
342
 
343
343
  Or this command if you want a specific version:
344
344
  ```
345
- jgem install glimmer-dsl-swt -v 4.18.4.7
345
+ jgem install glimmer-dsl-swt -v 4.18.4.8
346
346
  ```
347
347
 
348
348
  `jgem` is JRuby's version of `gem` command.
@@ -360,7 +360,7 @@ Note: if you're using activerecord or activesupport, keep in mind that Glimmer u
360
360
 
361
361
  Add the following to `Gemfile`:
362
362
  ```
363
- gem 'glimmer-dsl-swt', '~> 4.18.4.7'
363
+ gem 'glimmer-dsl-swt', '~> 4.18.4.8'
364
364
  ```
365
365
 
366
366
  And, then run:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.18.4.7
1
+ 4.18.4.8
@@ -1289,7 +1289,7 @@ This is accomplished via the Shape DSL a sub-DSL of the Glimmer GUI DSL, which m
1289
1289
  Shape keywords and their args (including defaults) are listed below (they basically match method names and arguments on [org.eclipse.swt.graphics.GC](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html) minus the `draw` or `fill` prefix in downcase):
1290
1290
  - `arc(x, y, width, height, startAngle, arcAngle, fill: false)` arc is part of a circle within an oval area, denoted by start angle (degrees) and end angle (degrees)
1291
1291
  - `focus(x, y, width, height)` this is just like rectangle but its foreground color is always that of the OS widget focus color (useful when capturing user interaction via a shape)
1292
- - `image(image, x, y)` [image](#image)
1292
+ - `image(image, x = 0, y = 0)` sets [image](#image), which could be an [org.eclipse.swt.graphics.Image](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/Image.html) object or just a file path string
1293
1293
  - `line(x1, y1, x2, y2)` line
1294
1294
  - `oval(x, y, width, height, fill: false)` oval if width does not match heigh and circle if width matches height. Can be optionally filled.
1295
1295
  - `point(x, y)` point
@@ -1369,37 +1369,15 @@ Screenshot:
1369
1369
 
1370
1370
  Learn more at the [Hello, Canvas! Sample](#hello-canvas).
1371
1371
 
1372
- #### Pixel Graphics
1373
-
1374
- **(Early Alpha Feature)**
1372
+ If you ever have special needs or optimizations, you could always default to direct SWT painting via [org.eclipse.swt.graphics.GC](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html) instead. Learn more at the [SWT Graphics Guide](https://www.eclipse.org/articles/Article-SWT-graphics/SWT_graphics.html) and [SWT Image Guide](https://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html#Saving%20Images).
1375
1373
 
1376
- If you need to paint pixel graphics, use the optimized `pixel` keyword alternative to `point`, which takes foreground as a hash argument and bypasses the [Glimmer DSL Engine chain of responsibility](https://github.com/AndyObtiva/glimmer#dsl-engine), thus rendering faster when having very large pixel numbers.
1377
-
1378
- Example (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
1374
+ Example of manually doing the same things as in the previous example without relying on the declarative Glimmer Shape DSL (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
1379
1375
 
1380
1376
  ```ruby
1381
- shell {
1382
- minimum_size 250, 265
1383
-
1384
- canvas {
1385
- 250.times {|y|
1386
- 250.times {|x|
1387
- pixel(x, y, foreground: color(y%255, x%255, (x+y)%255).swt_color)
1388
- }
1389
- }
1390
- }
1391
- }.open
1392
- ```
1393
-
1394
- Remember that you could always default to direct [SWT GC Usage]([org.eclipse.swt.graphics.GC](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html) too for even faster performance (when rarely needed). Learn more at the [SWT Graphics Guide](https://www.eclipse.org/articles/Article-SWT-graphics/SWT_graphics.html) and [SWT Image Guide](https://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html#Saving%20Images).
1395
-
1396
- Example of manually doing the same things as in the Canvas Shape DSL example without relying on the declarative Glimmer Shape DSL:
1377
+ include Glimmer
1397
1378
 
1398
- ```ruby
1399
1379
  image_object = image(File.expand_path('./icons/scaffold_app.png'), width: 100)
1400
1380
 
1401
- include Glimmer
1402
-
1403
1381
  shell {
1404
1382
  text 'Canvas Manual Example'
1405
1383
  minimum_size 320, 400
@@ -1431,6 +1409,118 @@ shell {
1431
1409
  }.open
1432
1410
  ```
1433
1411
 
1412
+ #### Pixel Graphics
1413
+
1414
+ **(Early Alpha Feature)**
1415
+
1416
+ If you need to paint pixel graphics, use the optimized `pixel` keyword alternative to `point`, which takes foreground as a hash argument and bypasses the [Glimmer DSL Engine chain of responsibility](https://github.com/AndyObtiva/glimmer#dsl-engine), thus rendering faster when having very large pixel counts.
1417
+
1418
+ Example (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
1419
+
1420
+ ```ruby
1421
+ include Glimmer
1422
+
1423
+ shell {
1424
+ minimum_size 250, 265
1425
+ text 'Pixel Graphics Example'
1426
+
1427
+ canvas {
1428
+ 250.times {|y|
1429
+ 250.times {|x|
1430
+ pixel(x, y, foreground: [y%255, x%255, (x+y)%255])
1431
+ }
1432
+ }
1433
+ }
1434
+ }.open
1435
+ ```
1436
+
1437
+ Result:
1438
+
1439
+ ![glimmer example pixel graphics](/images/glimmer-example-pixel-graphics.png)
1440
+
1441
+ Remember that you could always default to direct SWT painting via [org.eclipse.swt.graphics.GC](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html) too for even faster performance when needed in rare circumstances. Learn more at the [SWT Graphics Guide](https://www.eclipse.org/articles/Article-SWT-graphics/SWT_graphics.html) and [SWT Image Guide](https://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html#Saving%20Images).
1442
+
1443
+ Example of manually doing the same things as in the previous example without relying on the declarative Glimmer Shape DSL (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
1444
+
1445
+ ```ruby
1446
+ include Glimmer
1447
+
1448
+ shell {
1449
+ minimum_size 250, 265
1450
+ text 'Pixel Graphics Example'
1451
+
1452
+ canvas {
1453
+ on_paint_control { |paint_event|
1454
+ gc = paint_event.gc
1455
+ 250.times {|y|
1456
+ 250.times {|x|
1457
+ gc.foreground = Color.new(y%255, x%255, (x+y)%255)
1458
+ gc.draw_point(x, y)
1459
+ }
1460
+ }
1461
+ }
1462
+ }
1463
+ }.open
1464
+ ```
1465
+
1466
+ The only downside with the approach above is that it repaints all pixels on repaints to the window (e.g. during window resize). To get around that, we can rely on a technique called **Image Double-Buffering**. That is to buffer the graphics on an Image first and then set it on the Canvas so that resizes of the shell dont cause a repaint of all the pixels. Additionally, this gives us the added benefit of being able to use the image as a Shell icon via its `image` property.
1467
+
1468
+ Example (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
1469
+
1470
+ ```ruby
1471
+ include Glimmer
1472
+
1473
+ @the_image = image(250, 250)
1474
+ gc = org.eclipse.swt.graphics.GC.new(@the_image)
1475
+ 250.times {|y|
1476
+ 250.times {|x|
1477
+ gc.foreground = Color.new(y%255, x%255, (x+y)%255)
1478
+ gc.draw_point(x, y)
1479
+ }
1480
+ }
1481
+
1482
+ shell {
1483
+ minimum_size 250, 265
1484
+ text 'Pixel Graphics Example'
1485
+ image @the_image
1486
+
1487
+ canvas {
1488
+ image @the_image
1489
+ }
1490
+ }.open
1491
+ ```
1492
+
1493
+ If you need a transparent background for the image, replace the image construction line with the following:
1494
+
1495
+ ```ruby
1496
+ @the_image = image(250, 250)
1497
+ @the_image.image_data.alpha = 0
1498
+ @the_image = image(@the_image.image_data)
1499
+ ```
1500
+
1501
+ That way, wherever you don't draw a point, you get transparency (seeing what is behind the image).
1502
+
1503
+ If you don't need a `shell` image icon and `pixel` performance is enough, you can automatically apply **Image Double-Buffering** with the `:image_double_buffered` SWT style (custom Glimmer style not available in SWT itself)
1504
+
1505
+ Example (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
1506
+
1507
+ ```ruby
1508
+ include Glimmer
1509
+
1510
+ shell {
1511
+ minimum_size 250, 265
1512
+ text 'Pixel Graphics Example'
1513
+
1514
+ canvas(:image_double_buffered) {
1515
+ 250.times {|y|
1516
+ 250.times {|x|
1517
+ pixel(x, y, foreground: [y%255, x%255, (x+y)%255])
1518
+ }
1519
+ }
1520
+ }
1521
+ }.open
1522
+ ```
1523
+
1434
1524
  #### Shapes inside a Widget
1435
1525
 
1436
1526
  Keep in mind that the Shape DSL can be used inside any widget, not just `canvas`. Unlike shapes on a `canvas`, which are standalone graphics, when included in a widget, which already has its own look and feel, shapes are used as a decorative add-on that complements its look by getting painted on top of it. For example, shapes were used to decorate `composite` blocks in the [Tetris](#tetris) sample to have a more bevel look. In summary, Shapes can be used in a hybrid approach (shapes inside a widget), not just standalone in a `canvas`.
@@ -1597,7 +1687,7 @@ shell {
1597
1687
 
1598
1688
  #### Top-Level Transform Fluent Interface
1599
1689
 
1600
- When using a transform at the top-level (outside of shell), you get a fluent interface to faciliate manual constructioni and use.
1690
+ When using a transform at the top-level (outside of shell), you get a fluent interface to faciliate manual construction and use.
1601
1691
 
1602
1692
  Example:
1603
1693
 
@@ -2,11 +2,11 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: glimmer-dsl-swt 4.18.4.7 ruby lib
5
+ # stub: glimmer-dsl-swt 4.18.4.8 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "glimmer-dsl-swt".freeze
9
- s.version = "4.18.4.7"
9
+ s.version = "4.18.4.8"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
@@ -20,7 +20,9 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/dsl/expression'
23
+ require 'glimmer/dsl/top_level_expression'
23
24
  require 'glimmer/swt/image_proxy'
25
+ require 'glimmer/swt/widget_proxy'
24
26
 
25
27
  module Glimmer
26
28
  module DSL
@@ -28,6 +30,7 @@ module Glimmer
28
30
  # image expression
29
31
  # Note: Cannot be a static expression because it clashes with image property expression
30
32
  class ImageExpression < Expression
33
+ include TopLevelExpression
31
34
  include ParentExpression
32
35
 
33
36
  def can_interpret?(parent, keyword, *args, &block)
@@ -59,8 +59,10 @@ module Glimmer
59
59
  # rgba is 4 arguments representing Red, Green, Blue, and Alpha numeric values
60
60
  #
61
61
  def initialize(*args)
62
+ @options = args.last.is_a?(Hash) ? args.pop : {}
62
63
  @args = args
63
- ensure_arg_values_within_valid_bounds
64
+ @args = @args.first if @args.first.is_a?(Array)
65
+ ensure_arg_values_within_valid_bounds unless @options[:ensure_bounds] == false
64
66
  end
65
67
 
66
68
  def swt_color
@@ -75,8 +77,7 @@ module Glimmer
75
77
  @swt_color = @args.first
76
78
  end
77
79
  when 3..4
78
- red, green, blue, alpha = @args
79
- @swt_color = Color.new(*[red, green, blue, alpha].compact)
80
+ @swt_color = Color.new(*@args)
80
81
  end
81
82
  end
82
83
  @swt_color
@@ -84,6 +84,7 @@ module Glimmer
84
84
 
85
85
  def initialize(parent)
86
86
  @parent = parent
87
+ @parent.requires_shape_disposal = true
87
88
  @started = true
88
89
  @frame_index = 0
89
90
  @cycle_count_index = 0
@@ -24,12 +24,31 @@ module Glimmer
24
24
  module Custom
25
25
  # Represents SWT drawable controls (widgets like canvas) and display
26
26
  module Drawable
27
+ attr_accessor :requires_shape_disposal, :image_double_buffered
28
+ alias requires_shape_disposal? requires_shape_disposal
29
+ alias image_double_buffered? image_double_buffered
30
+
31
+ include_package 'org.eclipse.swt.graphics'
32
+
27
33
  def shapes
28
34
  @shapes ||= []
29
35
  end
30
36
 
37
+ def image_buffered_shapes
38
+ @image_buffered_shapes ||= []
39
+ end
40
+
41
+ def add_shape(shape)
42
+ if !@image_double_buffered || shape.args.first == @image_proxy_buffer
43
+ shapes << shape
44
+ else
45
+ image_buffered_shapes << shape
46
+ end
47
+ end
48
+
31
49
  def clear_shapes
32
- shapes.dup.each(&:dispose)
50
+ # Optimize further by having a collection of disposable_shapes independent of shapes, which is much smaller and only has shapes that require disposal (shapes with patterns or image)
51
+ shapes.dup.each(&:dispose) if requires_shape_disposal?
33
52
  end
34
53
 
35
54
  def deregister_shape_painting
@@ -40,8 +59,21 @@ module Glimmer
40
59
  # TODO consider performance optimization relating to order of shape rendering (affecting only further shapes not previous ones)
41
60
  if @paint_listener_proxy.nil?
42
61
  shape_painter = lambda do |paint_event|
43
- shapes.each do |shape|
44
- shape.paint(paint_event)
62
+ shape_painting_work = lambda do |paint_event|
63
+ paintable_shapes = @image_double_buffered ? image_buffered_shapes : shapes
64
+ paintable_shapes.each do |shape|
65
+ shape.paint(paint_event)
66
+ end
67
+ end
68
+ if @image_double_buffered
69
+ if @image_proxy_buffer.nil?
70
+ swt_image = Image.new(DisplayProxy.instance.swt_display, bounds.width, bounds.height)
71
+ @image_proxy_buffer = ImageProxy.new(swt_image: swt_image)
72
+ shape_painting_work.call(@image_proxy_buffer)
73
+ end
74
+ @image_proxy_buffer.shape(self).paint(paint_event)
75
+ else
76
+ shape_painting_work.call(paint_event)
45
77
  end
46
78
  end
47
79
 
@@ -103,7 +103,7 @@ module Glimmer
103
103
  @options.reject {|key, value| %w[fill gradient round].include?(key.to_s)}.each do |property, property_args|
104
104
  @properties[property] = property_args
105
105
  end
106
- @parent.shapes << self
106
+ @parent.add_shape(self)
107
107
  post_add_content if property_block.nil?
108
108
  end
109
109
 
@@ -134,7 +134,7 @@ module Glimmer
134
134
  def post_add_content
135
135
  unless @content_added
136
136
  amend_method_name_options_based_on_properties!
137
- @parent.setup_shape_painting
137
+ @parent.setup_shape_painting unless @parent.is_a?(ImageProxy)
138
138
  @content_added = true
139
139
  end
140
140
  end
@@ -142,7 +142,10 @@ module Glimmer
142
142
  def apply_property_arg_conversions(method_name, property, args)
143
143
  args = args.dup
144
144
  the_java_method = org.eclipse.swt.graphics.GC.java_class.declared_instance_methods.detect {|m| m.name == method_name}
145
- if (args.first.is_a?(Symbol) || args.first.is_a?(String))
145
+ if ['setBackground', 'setForeground'].include?(method_name.to_s) && args.first.is_a?(Array)
146
+ args[0] = ColorProxy.new(args[0])
147
+ end
148
+ if args.first.is_a?(Symbol) || args.first.is_a?(String)
146
149
  if the_java_method.parameter_types.first == Color.java_class
147
150
  args[0] = ColorProxy.new(args[0])
148
151
  end
@@ -163,6 +166,7 @@ module Glimmer
163
166
  args[0] = args[0].swt_transform
164
167
  end
165
168
  if ['setBackgroundPattern', 'setForegroundPattern'].include?(method_name.to_s)
169
+ @parent.requires_shape_disposal = true
166
170
  args.each_with_index do |arg, i|
167
171
  if arg.is_a?(Symbol) || arg.is_a?(String)
168
172
  args[i] = ColorProxy.new(arg).swt_color
@@ -192,11 +196,18 @@ module Glimmer
192
196
  elsif (@name.include?('text') || @name.include?('String')) && !@properties.keys.map(&:to_s).include?('background') && @args.size == 3
193
197
  @args << true
194
198
  end
195
- if @name.include?('image') && @args.first.is_a?(String)
196
- @args[0] = ImageProxy.new(@args[0])
197
- end
198
- if @name.include?('image') && @args.first.is_a?(ImageProxy)
199
- @image = @args[0] = @args[0].swt_image
199
+ if @name.include?('image')
200
+ @parent.requires_shape_disposal = true
201
+ if @args.size == 1
202
+ @args[1] = 0
203
+ @args[2] = 0
204
+ end
205
+ if @args.first.is_a?(String)
206
+ @args[0] = ImageProxy.new(@args[0])
207
+ end
208
+ if @args.first.is_a?(ImageProxy)
209
+ @image = @args[0] = @args[0].swt_image
210
+ end
200
211
  end
201
212
  end
202
213
 
@@ -276,20 +287,35 @@ module Glimmer
276
287
  end
277
288
 
278
289
  def calculate_paint_args!
279
- unless @name == 'point' || @calculated_paint_args
280
- @properties['background'] = [@parent.background] if fill? && !has_some_background?
281
- @properties['foreground'] = [@parent.foreground] if @parent.respond_to?(:foreground) && draw? && !has_some_foreground?
282
- @properties['font'] = [@parent.font] if @parent.respond_to?(:font) && draw? && !@properties.keys.map(&:to_s).include?('font')
283
- @properties['transform'] = [nil] if @parent.respond_to?(:transform) && !@properties.keys.map(&:to_s).include?('transform')
284
- @properties.each do |property, args|
285
- method_name = attribute_setter(property)
286
- converted_args = apply_property_arg_conversions(method_name, property, args)
287
- @properties[property] = converted_args
290
+ unless @calculated_paint_args
291
+ if @name == 'point'
292
+ # optimized performance calculation for pixel points
293
+ if !@properties[:foreground].is_a?(Color)
294
+ if @properties[:foreground].is_a?(Array)
295
+ @properties[:foreground] = ColorProxy.new(@properties[:foreground], ensure_bounds: false)
296
+ end
297
+ if @properties[:foreground].is_a?(Symbol) || @properties[:foreground].is_a?(String)
298
+ @properties[:foreground] = ColorProxy.new(@properties[:foreground], ensure_bounds: false)
299
+ end
300
+ if @properties[:foreground].is_a?(ColorProxy)
301
+ @properties[:foreground] = @properties[:foreground].swt_color
302
+ end
303
+ end
304
+ else
305
+ @properties['background'] = [@parent.background] if fill? && !has_some_background?
306
+ @properties['foreground'] = [@parent.foreground] if @parent.respond_to?(:foreground) && draw? && !has_some_foreground?
307
+ @properties['font'] = [@parent.font] if @parent.respond_to?(:font) && draw? && !@properties.keys.map(&:to_s).include?('font')
308
+ @properties['transform'] = [nil] if @parent.respond_to?(:transform) && !@properties.keys.map(&:to_s).include?('transform')
309
+ @properties.each do |property, args|
310
+ method_name = attribute_setter(property)
311
+ converted_args = apply_property_arg_conversions(method_name, property, args)
312
+ @properties[property] = converted_args
313
+ end
314
+ apply_shape_arg_conversions!
315
+ apply_shape_arg_defaults!
316
+ tolerate_shape_extra_args!
317
+ @calculated_paint_args = true
288
318
  end
289
- apply_shape_arg_conversions!
290
- apply_shape_arg_defaults!
291
- tolerate_shape_extra_args!
292
- @calculated_paint_args = true
293
319
  end
294
320
  end
295
321
 
@@ -32,7 +32,7 @@ module Glimmer
32
32
  class ImageProxy
33
33
  include Custom::Drawable
34
34
  include Properties
35
-
35
+
36
36
  class << self
37
37
  def create(*args)
38
38
  if args.size == 1 && args.first.is_a?(ImageProxy)
@@ -53,6 +53,7 @@ module Glimmer
53
53
  # Takes the same args as the SWT Image class
54
54
  # Alternatively, takes a file path string or a uri:classloader file path string (generated by JRuby when invoking `File.expand_path` inside a JAR file)
55
55
  # and returns an image object.
56
+ # Last but not least, it could serve as a parent for nesting shapes underneath to build an image with the Canvas Shape DSL
56
57
  def initialize(*args, &content)
57
58
  @args = args
58
59
  @parent_proxy = nil
@@ -62,7 +63,7 @@ module Glimmer
62
63
  end
63
64
  options = @args.last.is_a?(Hash) ? @args.delete_at(-1) : {}
64
65
  options[:swt_image] = @args.first if @args.size == 1 && @args.first.is_a?(Image)
65
- @file_path = @args.first if @args.size == 1 && @args.first.is_a?(String)
66
+ @file_path = @args.first if @args.first.is_a?(String)
66
67
  @args = @args.first if @args.size == 1 && @args.first.is_a?(Array)
67
68
  if options&.keys&.include?(:swt_image)
68
69
  @swt_image = options[:swt_image]
@@ -78,23 +79,33 @@ module Glimmer
78
79
  height = (@image_data.height.to_f / @image_data.width.to_f)*width.to_f if !width.nil? && height.nil?
79
80
  width = (@image_data.width.to_f / @image_data.height.to_f)*height.to_f if !height.nil? && width.nil?
80
81
  scale_to(width, height) unless width.nil? || height.nil?
81
- else
82
+ elsif !@args.first.is_a?(ImageProxy) && !@args.first.is_a?(Image)
82
83
  @args.prepend(DisplayProxy.instance.swt_display) unless @args.first.is_a?(Display)
83
84
  @swt_image = Image.new(*@args)
84
85
  @original_image_data = @image_data = @swt_image.image_data
85
86
  end
86
- @swt_image.singleton_class.alias_method(:dispose_without_glimmer, :dispose)
87
87
  proxy = self
88
88
  # TODO consider adding a get_data/set_data method to conform with other SWT widgets
89
89
  @swt_image.singleton_class.define_method(:dispose) do
90
90
  proxy.clear_shapes
91
- dispose_without_glimmer
91
+ super
92
92
  end
93
93
  post_add_content if content.nil?
94
94
  end
95
95
 
96
96
  def post_add_content
97
- @parent&.image = swt_image
97
+ if shapes.any?
98
+ setup_shape_painting
99
+ end
100
+ if @parent.respond_to?('image=')
101
+ @parent&.image = swt_image
102
+ end
103
+ end
104
+
105
+ def shape(parent_proxy = nil, args = nil)
106
+ parent_proxy ||= @parent_proxy
107
+ args ||= [self] # TODO consider passing args if available
108
+ @shape ||= Glimmer::SWT::Custom::Shape.new(parent_proxy, 'image', *args)
98
109
  end
99
110
 
100
111
  def input_stream
@@ -149,6 +149,7 @@ module Glimmer
149
149
  #
150
150
  # Styles is a comma separate list of symbols representing SWT styles in lower case
151
151
  def initialize(*init_args, swt_widget: nil)
152
+ @image_double_buffered = !!(init_args&.last&.include?(:image_double_buffered) && init_args&.last&.delete(:image_double_buffered))
152
153
  if swt_widget.nil?
153
154
  underscored_widget_name, parent, args = init_args
154
155
  @parent_proxy = parent
@@ -94,7 +94,7 @@ class MandelbrotFractal
94
94
  image @image
95
95
 
96
96
  canvas {
97
- image(@image, 0, 0)
97
+ image @image
98
98
  }
99
99
  }
100
100
  }
@@ -192,7 +192,7 @@ class HelloTable
192
192
  layout_data :center, :center, true, false
193
193
 
194
194
  text 'BASEBALL PLAYOFF SCHEDULE'
195
- background :transparent
195
+ background :transparent if OS.windows?
196
196
  foreground rgb(94, 107, 103)
197
197
  font name: 'Optima', height: 38, style: :bold
198
198
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-dsl-swt
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.18.4.7
4
+ version: 4.18.4.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh