OSDN Git Service

fix keybindings that use shift (eg. Save As...)
[mypaint-anime/master.git] / composite_benchmark.py
1 #!/usr/bin/env python
2 from scipy import *
3 #from pylab import *
4 from time import time
5 import sys
6 sys.path.insert(0, 'lib')
7 import mypaintlib
8
9 import gtk
10 gdk = gtk.gdk
11
12 iterations=1000
13 N=64
14
15 def benchmarkGdkPixbuf():
16     print 'gdkPixbuf blitting 8bit RGBA on RGB'
17     src = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, N, N)  
18     dst = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, N, N)  
19
20     src.get_pixels_array()[:,:,:] = (rand(N,N,4)*255).astype('uint8')
21     dst.get_pixels_array()[:,:,:] = (rand(N,N,3)*255).astype('uint8')
22
23     t = time()
24     for i in xrange(iterations):
25         src.composite(dst, 0, 0, N, N, 0, 0, 1, 1, gtk.gdk.INTERP_NEAREST, 255)
26     return time() - t
27
28 def benchmarkSciPy(t='float32'):
29     print 'benchmarkSciPy', t
30     src = rand(N,N,4).astype(t)
31     dst = rand(N,N,4).astype(t)
32
33     src_rgb = src[:,:,0:3].copy()
34     src_a   = src[:,:,3: ].copy()
35     dst_rgb = dst[:,:,0:3].copy()
36     dst_a   = dst[:,:,3: ].copy()
37
38     t = time()
39     for i in xrange(iterations):
40         src_a_ = 1.0-src_a
41         dst_rgb = src_rgb * src_a + dst_rgb * src_a_
42         dst_a = src_a + dst_a * src_a_
43     return time() - t
44
45 def benchmarkSciPyPremulSlice(t='float32'):
46     print 'benchmarkSciPyPremulSlice', t
47     src = rand(N,N,4).astype(t)
48     dst = rand(N,N,4).astype(t)
49
50     t = time()
51     for i in xrange(iterations):
52         dst = src + dst - dst[:,:,3:]*dst
53     return time() - t
54
55 def benchmarkSciPyPremul(t='float32'):
56     print 'benchmarkSciPyPremul', t
57     src = rand(N,N,4).astype(t)
58     dst = rand(N,N,4).astype(t)
59
60     src_rgb = src[:,:,0:3].copy()
61     src_a   = src[:,:,3: ].copy()
62     dst_rgb = dst[:,:,0:3].copy()
63     dst_a   = dst[:,:,3: ].copy()
64
65     t = time()
66     for i in xrange(iterations):
67         # resultColor = topColor + (1.0 - topAlpha) * bottomColor
68         dst_rgb = src_rgb + dst_rgb - src_a*dst_rgb
69         # resultAlpha = topAlpha + (1.0 - topAlpha) * bottomAlpha
70         dst_a = src_a + dst_a - src_a*dst_a
71     return time() - t
72
73 def benchmarkSciPyPremulOpt(t='float32'):
74     print 'benchmarkSciPyPremulOpt', t
75     src = rand(N,N,4).astype(t)
76     dst = rand(N,N,4).astype(t)
77
78     src_rgb = src[:,:,0:3].copy()
79     src_a   = src[:,:,3: ].copy()
80     dst_rgb = dst[:,:,0:3].copy()
81     dst_a   = dst[:,:,3: ].copy()
82
83     t = time()
84     for i in xrange(iterations):
85         # resultColor = topColor + (1.0 - topAlpha) * bottomColor
86         dst_rgb += src_rgb
87         dst_rgb -= src_a*dst_rgb
88         # resultAlpha = topAlpha + (1.0 - topAlpha) * bottomAlpha
89         dst_a += src_a
90         dst_a -= src_a*dst_a
91     return time() - t
92
93 def benchmark16bitPremulC():
94     print 'benchmark16bitPremulC'
95     src = (rand(N,N,4)*65535).astype('uint16')
96     dst = (rand(N,N,3)*255).astype('uint8')
97
98     t = time()
99     for i in xrange(iterations):
100         mypaintlib.composite_tile_over_rgb8(src, dst)
101     return time() - t
102
103
104 a = benchmarkGdkPixbuf()
105 print a
106 b = benchmarkSciPyPremulOpt()
107 print b, b/a
108 c = benchmark16bitPremulC()
109 print c, c/a, c/b