1
if __name__ == '__main__':
4
pkg_dir = os.path.split(os.path.abspath(__file__))[0]
5
parent_dir, pkg_name = os.path.split(pkg_dir)
6
is_pygame_pkg = (pkg_name == 'tests' and
7
os.path.split(parent_dir)[1] == 'pygame')
9
sys.path.insert(0, parent_dir)
11
is_pygame_pkg = __name__.startswith('pygame.tests.')
15
from pygame.locals import *
18
import pygame.surfarray
20
uint8, uint16, uint32, uint64, zeros, \
21
float32, float64, alltrue, rint, arange
24
class SurfarrayModuleTest (unittest.TestCase):
26
pixels2d = {8: True, 16: True, 24: False, 32: True}
27
pixels3d = {8: False, 16: False, 24: True, 32: True}
28
array2d = {8: True, 16: True, 24: True, 32: True}
29
array3d = {8: False, 16: False, 24: True, 32: True}
31
test_palette = [(0, 0, 0, 255),
37
test_points = [((0, 0), 1), ((4, 5), 1), ((9, 0), 2),
38
((5, 5), 2), ((0, 11), 3), ((4, 6), 3),
39
((9, 11), 4), ((5, 6), 4)]
41
def _make_surface(self, bitsize, srcalpha=False, palette=None):
43
palette = self.test_palette
47
surf = pygame.Surface(self.surf_size, flags, bitsize)
49
surf.set_palette([c[:3] for c in palette])
52
def _fill_surface(self, surf, palette=None):
54
palette = self.test_palette
55
surf.fill(palette[1], (0, 0, 5, 6))
56
surf.fill(palette[2], (5, 0, 5, 6))
57
surf.fill(palette[3], (0, 6, 5, 6))
58
surf.fill(palette[4], (5, 6, 5, 6))
60
def _make_src_surface(self, bitsize, srcalpha=False, palette=None):
61
surf = self._make_surface(bitsize, srcalpha, palette)
62
self._fill_surface(surf, palette)
65
def _assert_surface(self, surf, palette=None, msg=""):
67
palette = self.test_palette
68
if surf.get_bitsize() == 16:
69
palette = [surf.unmap_rgb(surf.map_rgb(c)) for c in palette]
70
for posn, i in self.test_points:
71
self.failUnlessEqual(surf.get_at(posn), palette[i],
72
"%s != %s: flags: %i, bpp: %i, posn: %s%s" %
74
palette[i], surf.get_flags(),
75
surf.get_bitsize(), posn, msg))
77
def _make_array3d(self, dtype):
78
return zeros((self.surf_size[0], self.surf_size[1], 3), dtype)
80
def _fill_array2d(self, arr, surf):
81
palette = self.test_palette
82
arr[:5,:6] = surf.map_rgb(palette[1])
83
arr[5:,:6] = surf.map_rgb(palette[2])
84
arr[:5,6:] = surf.map_rgb(palette[3])
85
arr[5:,6:] = surf.map_rgb(palette[4])
87
def _fill_array3d(self, arr):
88
palette = self.test_palette
89
arr[:5,:6] = palette[1][:3]
90
arr[5:,:6] = palette[2][:3]
91
arr[:5,6:] = palette[3][:3]
92
arr[5:,6:] = palette[4][:3]
94
def _make_src_array3d(self, dtype):
95
arr = self._make_array3d(dtype)
96
self._fill_array3d(arr)
99
def _make_array2d(self, dtype):
100
return zeros(self.surf_size, dtype)
103
# Needed for 8 bits-per-pixel color palette surface tests.
106
# Makes sure the same array package is used each time.
108
pygame.surfarray.use_arraytype(arraytype)
113
def test_array2d(self):
115
self.fail("no array package installed")
117
sources = [self._make_src_surface(8),
118
self._make_src_surface(16),
119
self._make_src_surface(16, srcalpha=True),
120
self._make_src_surface(24),
121
self._make_src_surface(32),
122
self._make_src_surface(32, srcalpha=True)]
123
palette = self.test_palette
124
alpha_color = (0, 0, 0, 128)
127
arr = pygame.surfarray.array2d(surf)
128
for posn, i in self.test_points:
129
self.failUnlessEqual(arr[posn], surf.get_at_mapped(posn),
130
"%s != %s: flags: %i, bpp: %i, posn: %s" %
132
surf.get_at_mapped(posn),
133
surf.get_flags(), surf.get_bitsize(),
136
if surf.get_masks()[3]:
137
surf.fill(alpha_color)
138
arr = pygame.surfarray.array2d(surf)
140
self.failUnlessEqual(arr[posn], surf.get_at_mapped(posn),
141
"%s != %s: bpp: %i" %
143
surf.get_at_mapped(posn),
146
def test_array3d(self):
148
self.fail("no array package installed")
150
sources = [self._make_src_surface(16),
151
self._make_src_surface(16, srcalpha=True),
152
self._make_src_surface(24),
153
self._make_src_surface(32),
154
self._make_src_surface(32, srcalpha=True)]
155
palette = self.test_palette
158
arr = pygame.surfarray.array3d(surf)
159
def same_color(ac, sc):
160
return (ac[0] == sc[0] and
163
for posn, i in self.test_points:
164
self.failUnless(same_color(arr[posn], surf.get_at(posn)),
165
"%s != %s: flags: %i, bpp: %i, posn: %s" %
168
surf.get_flags(), surf.get_bitsize(),
171
def test_array_alpha(self):
173
self.fail("no array package installed")
175
palette = [(0, 0, 0, 0),
180
targets = [self._make_src_surface(8, palette=palette),
181
self._make_src_surface(16, palette=palette),
182
self._make_src_surface(16, palette=palette, srcalpha=True),
183
self._make_src_surface(24, palette=palette),
184
self._make_src_surface(32, palette=palette),
185
self._make_src_surface(32, palette=palette, srcalpha=True)]
189
if surf.get_bitsize() == 16:
190
p = [surf.unmap_rgb(surf.map_rgb(c)) for c in p]
191
arr = pygame.surfarray.array_alpha(surf)
192
if surf.get_masks()[3]:
193
for (x, y), i in self.test_points:
194
self.failUnlessEqual(arr[x, y], p[i][3],
195
("%i != %i, posn: (%i, %i), "
199
surf.get_bitsize())))
201
self.failUnless(alltrue(arr == 255))
203
# No per-pixel alpha when blanket alpha is None.
205
blacket_alpha = surf.get_alpha()
207
arr = pygame.surfarray.array_alpha(surf)
208
self.failUnless(alltrue(arr == 255),
209
"bitsize: %i, flags: %i" %
210
(surf.get_bitsize(), surf.get_flags()))
211
surf.set_alpha(blacket_alpha)
213
# Bug for per-pixel alpha surface when blanket alpha 0.
215
blanket_alpha = surf.get_alpha()
217
arr = pygame.surfarray.array_alpha(surf)
218
if surf.get_masks()[3]:
219
self.failIf(alltrue(arr == 255),
220
"bitsize: %i, flags: %i" %
221
(surf.get_bitsize(), surf.get_flags()))
223
self.failUnless(alltrue(arr == 255),
224
"bitsize: %i, flags: %i" %
225
(surf.get_bitsize(), surf.get_flags()))
226
surf.set_alpha(blanket_alpha)
228
def test_array_colorkey(self):
230
self.fail("no array package installed")
232
palette = [(0, 0, 0, 0),
237
targets = [self._make_src_surface(8, palette=palette),
238
self._make_src_surface(16, palette=palette),
239
self._make_src_surface(16, palette=palette, srcalpha=True),
240
self._make_src_surface(24, palette=palette),
241
self._make_src_surface(32, palette=palette),
242
self._make_src_surface(32, palette=palette, srcalpha=True)]
246
if surf.get_bitsize() == 16:
247
p = [surf.unmap_rgb(surf.map_rgb(c)) for c in p]
248
surf.set_colorkey(None)
249
arr = pygame.surfarray.array_colorkey(surf)
250
self.failUnless(alltrue(arr == 255))
251
for i in range(1, len(palette)):
252
surf.set_colorkey(p[i])
253
alphas = [255] * len(p)
255
arr = pygame.surfarray.array_colorkey(surf)
256
for (x, y), j in self.test_points:
257
self.failUnlessEqual(arr[x, y], alphas[j],
258
("%i != %i, posn: (%i, %i), "
260
(arr[x, y], alphas[j],
262
surf.get_bitsize())))
264
def test_blit_array(self):
266
self.fail("no array package installed")
268
# bug 24 at http://pygame.motherhamster.org/bugzilla/
269
if 'numpy' in pygame.surfarray.get_arraytypes():
270
prev = pygame.surfarray.get_arraytype()
271
# This would raise exception:
272
# File "[...]\pygame\_numpysurfarray.py", line 381, in blit_array
273
# (array[:,:,1::3] >> losses[1] << shifts[1]) | \
274
# TypeError: unsupported operand type(s) for >>: 'float' and 'int'
275
pygame.surfarray.use_arraytype('numpy')
276
s = pygame.Surface((10,10), 0, 24)
277
a = pygame.surfarray.array3d(s)
278
pygame.surfarray.blit_array(s, a)
279
prev = pygame.surfarray.use_arraytype(prev)
282
targets = [self._make_surface(8),
283
self._make_surface(16),
284
self._make_surface(16, srcalpha=True),
285
self._make_surface(24),
286
self._make_surface(32),
287
self._make_surface(32, srcalpha=True),
292
dtypes = [(8, uint8), (16, uint16), (32, uint32)]
294
dtypes.append((64, uint64))
297
arrays3d = [(self._make_src_array3d(dtype), None)
298
for __, dtype in dtypes]
299
for bitsize in [8, 16, 24, 32]:
302
s = pygame.Surface((1,1), 0, 16)
303
palette = [s.unmap_rgb(s.map_rgb(c))
304
for c in self.test_palette]
305
if self.pixels3d[bitsize]:
306
surf = self._make_src_surface(bitsize)
307
arr = pygame.surfarray.pixels3d(surf)
308
arrays3d.append((arr, palette))
309
if self.array3d[bitsize]:
310
surf = self._make_src_surface(bitsize)
311
arr = pygame.surfarray.array3d(surf)
312
arrays3d.append((arr, palette))
313
for sz, dtype in dtypes:
314
arrays3d.append((arr.astype(dtype), palette))
317
def do_blit(surf, arr):
318
pygame.surfarray.blit_array(surf, arr)
321
bitsize = surf.get_bitsize()
322
for arr, palette in arrays3d:
323
surf.fill((0, 0, 0, 0))
325
self.failUnlessRaises(ValueError, do_blit, surf, arr)
327
pygame.surfarray.blit_array(surf, arr)
328
self._assert_surface(surf, palette)
330
if self.pixels2d[bitsize]:
331
surf.fill((0, 0, 0, 0))
332
s = self._make_src_surface(bitsize, surf.get_flags() & SRCALPHA)
333
arr = pygame.surfarray.pixels2d(s)
334
pygame.surfarray.blit_array(surf, arr)
335
self._assert_surface(surf)
337
if self.array2d[bitsize]:
338
s = self._make_src_surface(bitsize, surf.get_flags() & SRCALPHA)
339
arr = pygame.surfarray.array2d(s)
340
for sz, dtype in dtypes:
341
surf.fill((0, 0, 0, 0))
343
pygame.surfarray.blit_array(surf, arr.astype(dtype))
344
self._assert_surface(surf)
346
self.failUnlessRaises(ValueError, do_blit,
347
surf, self._make_array2d(dtype))
349
# Check alpha for 2D arrays
350
surf = self._make_surface(16, srcalpha=True)
351
arr = zeros(surf.get_size(), uint16)
352
arr[...] = surf.map_rgb((0, 128, 255, 64))
353
color = surf.unmap_rgb(arr[0, 0])
354
pygame.surfarray.blit_array(surf, arr)
355
self.failUnlessEqual(surf.get_at((5, 5)), color)
357
surf = self._make_surface(32, srcalpha=True)
358
arr = zeros(surf.get_size(), uint32)
359
color = (0, 111, 255, 63)
360
arr[...] = surf.map_rgb(color)
361
pygame.surfarray.blit_array(surf, arr)
362
self.failUnlessEqual(surf.get_at((5, 5)), color)
365
arr3d = self._make_src_array3d(uint8)
369
[0xf000, 0xf, 0xf00, 0xf0]),
372
[0xff0000, 0xff, 0xff00, 0]),
375
[0xff, 0xff0000, 0xff000000, 0xff00])]
377
for bitsize, shifts, masks in shift_tests:
378
surf = self._make_surface(bitsize, srcalpha=(shifts[3] != 0))
381
palette = [surf.unmap_rgb(surf.map_rgb(c))
382
for c in self.test_palette]
383
surf.set_shifts(shifts)
384
surf.set_masks(masks)
385
pygame.surfarray.blit_array(surf, arr3d)
386
self._assert_surface(surf, palette)
389
surf = pygame.Surface((1,1), 0, 32)
391
self.failUnlessRaises(ValueError, do_blit, surf, t)
393
surf_size = self.surf_size
394
surf = pygame.Surface(surf_size, 0, 32)
395
arr = zeros([surf_size[0], surf_size[1] + 1, 3], uint32)
396
self.failUnlessRaises(ValueError, do_blit, surf, arr)
397
arr = zeros([surf_size[0] + 1, surf_size[1], 3], uint32)
398
self.failUnlessRaises(ValueError, do_blit, surf, arr)
400
surf = pygame.Surface((1, 4), 0, 32)
401
arr = zeros((4,), uint32)
402
self.failUnlessRaises(ValueError, do_blit, surf, arr)
403
arr.shape = (1, 1, 1, 4)
404
self.failUnlessRaises(ValueError, do_blit, surf, arr)
406
# Issue #81: round from float to int
412
surf = pygame.Surface((10, 10), pygame.SRCALPHA, 32)
413
w, h = surf.get_size()
415
for dtype in [float32, float64]:
416
surf.fill((255, 255, 255, 0))
417
farr = arange(0, length, dtype=dtype)
419
pygame.surfarray.blit_array(surf, farr)
422
self.assertEqual(surf.get_at_mapped((x, y)),
423
int(rint(farr[x, y])))
425
def test_get_arraytype(self):
427
self.fail("no array package installed")
429
self.failUnless((pygame.surfarray.get_arraytype() in
431
("unknown array type %s" %
432
pygame.surfarray.get_arraytype()))
434
def test_get_arraytypes(self):
436
self.fail("no array package installed")
438
arraytypes = pygame.surfarray.get_arraytypes()
439
self.failUnless('numpy' in arraytypes)
441
for atype in arraytypes:
442
self.failUnless(atype in ['numpy'],
443
"unknown array type %s" % atype)
445
def test_make_surface(self):
447
self.fail("no array package installed")
449
# How does one properly test this with 2d arrays. It makes no sense
450
# since the pixel format is not entirely dependent on element size.
451
# Just make sure the surface pixel size is at least as large as the
452
# array element size I guess.
454
for bitsize, dtype in [(8, uint8), (16, uint16), (24, uint32)]:
455
## Even this simple assertion fails for 2d arrays. Where's the problem?
456
## surf = pygame.surfarray.make_surface(self._make_array2d(dtype))
457
## self.failUnless(surf.get_bitsize() >= bitsize,
458
## "not %i >= %i)" % (surf.get_bitsize(), bitsize))
460
surf = pygame.surfarray.make_surface(self._make_src_array3d(dtype))
461
self._assert_surface(surf)
463
# Issue #81: round from float to int
472
for dtype in [float32, float64]:
473
farr = arange(0, length, dtype=dtype)
475
surf = pygame.surfarray.make_surface(farr)
478
self.assertEqual(surf.get_at_mapped((x, y)),
479
int(rint(farr[x, y])))
481
def test_map_array(self):
483
self.fail("no array package installed")
485
arr3d = self._make_src_array3d(uint8)
486
targets = [self._make_surface(8),
487
self._make_surface(16),
488
self._make_surface(16, srcalpha=True),
489
self._make_surface(24),
490
self._make_surface(32),
491
self._make_surface(32, srcalpha=True)]
492
palette = self.test_palette
495
arr2d = pygame.surfarray.map_array(surf, arr3d)
496
for posn, i in self.test_points:
497
self.failUnlessEqual(arr2d[posn], surf.map_rgb(palette[i]),
498
"%i != %i, bitsize: %i, flags: %i" %
499
(arr2d[posn], surf.map_rgb(palette[i]),
500
surf.get_bitsize(), surf.get_flags()))
503
self.failUnlessRaises(ValueError, pygame.surfarray.map_array,
504
self._make_surface(32),
505
self._make_array2d(uint8))
507
def test_pixels2d(self):
509
self.fail("no array package installed")
511
sources = [self._make_surface(8),
512
self._make_surface(16, srcalpha=True),
513
self._make_surface(32, srcalpha=True)]
516
self.failIf(surf.get_locked())
517
arr = pygame.surfarray.pixels2d(surf)
518
self.failUnless(surf.get_locked())
519
self._fill_array2d(arr, surf)
521
self.failUnless(surf.get_locked())
523
self.failIf(surf.get_locked())
524
self.failUnlessEqual(surf.get_locks(), ())
525
self._assert_surface(surf)
528
self.failUnlessRaises(ValueError,
529
pygame.surfarray.pixels2d,
530
self._make_surface(24))
532
def test_pixels3d(self):
534
self.fail("no array package installed")
536
sources = [self._make_surface(24),
537
self._make_surface(32)]
540
self.failIf(surf.get_locked())
541
arr = pygame.surfarray.pixels3d(surf)
542
self.failUnless(surf.get_locked())
543
self._fill_array3d(arr)
545
self.failUnless(surf.get_locked())
547
self.failIf(surf.get_locked())
548
self.failUnlessEqual(surf.get_locks(), ())
549
self._assert_surface(surf)
553
surf = self._make_surface(32, srcalpha=True)
554
arr = pygame.surfarray.pixels3d(surf)
556
self.failUnlessEqual(surf.get_at((0, 0)), color)
559
def do_pixels3d(surf):
560
pygame.surfarray.pixels3d(surf)
562
self.failUnlessRaises(ValueError,
564
self._make_surface(8))
565
self.failUnlessRaises(ValueError,
567
self._make_surface(16))
569
def test_pixels_alpha(self):
571
self.fail("no array package installed")
573
palette = [(0, 0, 0, 0),
576
(127, 127, 127, 170),
577
(127, 127, 127, 255)]
578
alphas = [0, 45, 86, 99, 180]
580
surf = self._make_src_surface(32, srcalpha=True, palette=palette)
582
self.failIf(surf.get_locked())
583
arr = pygame.surfarray.pixels_alpha(surf)
584
self.failUnless(surf.get_locked())
586
self.failUnless(surf.get_locked())
588
for (x, y), i in self.test_points:
589
self.failUnlessEqual(arr[x, y], palette[i][3])
591
for (x, y), i in self.test_points:
594
color = (127, 127, 127, alpha)
595
self.failUnlessEqual(surf.get_at((x, y)), color,
596
"posn: (%i, %i)" % (x, y))
599
self.failIf(surf.get_locked())
600
self.failUnlessEqual(surf.get_locks(), ())
603
def do_pixels_alpha(surf):
604
pygame.surfarray.pixels_alpha(surf)
606
targets = [(8, False),
612
for bitsize, srcalpha in targets:
613
self.failUnlessRaises(ValueError, do_pixels_alpha,
614
self._make_surface(bitsize, srcalpha))
616
def test_pixels_red(self):
617
self._test_pixels_rgb('red', 0)
619
def test_pixels_green(self):
620
self._test_pixels_rgb('green', 1)
622
def test_pixels_blue(self):
623
self._test_pixels_rgb('blue', 2)
625
def _test_pixels_rgb(self, operation, mask_posn):
626
method_name = "pixels_" + operation
628
self.fail("no array package installed")
630
pixels_rgb = getattr(pygame.surfarray, method_name)
631
palette = [(0, 0, 0, 255),
634
(131, 157, 167, 255),
635
(179, 191, 251, 255)]
636
plane = [c[mask_posn] for c in palette]
638
surf24 = self._make_src_surface(24, srcalpha=False, palette=palette)
639
surf32 = self._make_src_surface(32, srcalpha=False, palette=palette)
640
surf32a = self._make_src_surface(32, srcalpha=True, palette=palette)
642
for surf in [surf24, surf32, surf32a]:
643
self.failIf(surf.get_locked())
644
arr = pixels_rgb(surf)
645
self.failUnless(surf.get_locked())
647
self.failUnless(surf.get_locked())
649
for (x, y), i in self.test_points:
650
self.failUnlessEqual(arr[x, y], plane[i])
653
self.failIf(surf.get_locked())
654
self.failUnlessEqual(surf.get_locks(), ())
657
targets = [(8, False),
661
for bitsize, srcalpha in targets:
662
self.failUnlessRaises(ValueError, pixels_rgb,
663
self._make_surface(bitsize, srcalpha))
665
def test_use_arraytype(self):
667
self.fail("no array package installed")
669
def do_use_arraytype(atype):
670
pygame.surfarray.use_arraytype(atype)
672
pygame.surfarray.use_arraytype('numpy')
673
self.failUnlessEqual(pygame.surfarray.get_arraytype(), 'numpy')
675
self.failUnlessRaises(ValueError, do_use_arraytype, 'not an option')
677
def test_surf_lock (self):
679
self.fail("no array package installed")
681
sf = pygame.Surface ((5, 5), 0, 32)
682
for atype in pygame.surfarray.get_arraytypes ():
683
pygame.surfarray.use_arraytype (atype)
685
ar = pygame.surfarray.pixels2d (sf)
686
self.assertEquals (sf.get_locked (), True)
689
self.assertEquals (sf.get_locked (), True)
692
self.assertEquals (sf.get_locked (), False)
693
self.assertEquals (sf.get_locks (), ())
695
#print ("test_surf_lock - end")
698
if __name__ == '__main__':
700
print ("No array package is installed. Cannot run unit tests.")