Improved shogi theme. Add shadows.
[kaya.git] / lib / themes / shadow.rb
blob4dbdbb82ac87f0b6c31667a130e419c42c1dda80
1 require 'ext/loader'
3 module Shadower
4   ShadowData = Struct.new(:radius, :color, :grow, :offset)
5   DEFAULT_SHADOW_DATA = 
6     ShadowData.new(7.0, Qt::Color.new(0x40, 0x40, 0x50), 5, Qt::PointF.new(6, 4))
7   
8   def with_shadow(loader, data = DEFAULT_SHADOW_DATA)
9     lambda do |piece, size|
10       isz = size * 100 / (100 + data.grow) + Qt::PointF.new(0.5, 0.5)
11       off = Qt::PointF.new(
12         data.offset.x * isz.x / 200.0,
13         data.offset.y * isz.x / 200.0)
14       img = loader[piece, isz]
15       scaled_data = ShadowData.new(data.radius * isz.x / 100.0,
16                                    data.color,
17                                    size.x - isz.x,
18                                    off)
19       s = shadow(img, scaled_data)
20       Qt::Painter.new(s).paint do |p|
21         dst = Qt::RectF.new((size.x - isz.x) / 2 - off.x,
22                             (size.y - isz.y) / 2 - off.y,
23                             isz.x, isz.y)
24         p.draw_image(dst, img, Qt::RectF.new(Qt::PointF.new(0, 0), isz))
25       end
26       s
27     end
28   end
29   
30   private
31   
32   def shadow(img, data)
33     img = Qt::Image.painted(Qt::Point.new(img.width + data.grow, 
34                                           img.height + data.grow)) do |p|
35       px = (data.grow * 0.5 + data.offset.x).to_i
36       py = (data.grow * 0.5 + data.offset.y).to_i
37   
38       p.composition_mode = Qt::Painter::CompositionMode_Source
39       p.fill_rect Qt::Rect.new(px, py, img.width, img.height), data.color
40       p.composition_mode = Qt::Painter::CompositionMode_DestinationAtop
41       p.draw_image Qt::Point.new(px, py), img
42     end
43     img.exp_blur(data.radius)
44     img
45   end
46 end