123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- #!/usr/bin/env python
- # fake additive blending. Using NumPy. it doesn't clamp.
- # press r,g,b
- import os, pygame
- from pygame.locals import *
- try:
- import pygame.surfarray
- import numpy
- except:
- print ("no surfarray for you! install numpy")
- import time
-
- main_dir = os.path.split(os.path.abspath(__file__))[0]
- data_dir = os.path.join(main_dir, 'data')
- def main():
- pygame.init()
- pygame.mixer.quit() # remove ALSA underflow messages for Debian squeeze
- screen = pygame.display.set_mode((640, 480))
- im1= pygame.Surface(screen.get_size())
- #im1= im1.convert()
- im1.fill((100, 0, 0))
-
- im2= pygame.Surface(screen.get_size())
- im2.fill((0, 50, 0))
- # we make a srcalpha copy of it.
- #im3= im2.convert(SRCALPHA)
- im3 = im2
- im3.set_alpha(127)
- images = {}
- images[K_1] = im2
- images[K_2] = pygame.image.load(os.path.join(data_dir, "chimp.bmp"))
- images[K_3] = pygame.image.load(os.path.join(data_dir, "alien3.gif"))
- images[K_4] = pygame.image.load(os.path.join(data_dir, "liquid.bmp"))
- img_to_blit = im2.convert()
- iaa = img_to_blit.convert_alpha()
- blits = {}
- blits[K_a] = BLEND_ADD
- blits[K_s] = BLEND_SUB
- blits[K_m] = BLEND_MULT
- blits[K_EQUALS] = BLEND_MAX
- blits[K_MINUS] = BLEND_MIN
- blitsn = {}
- blitsn[K_a] = "BLEND_ADD"
- blitsn[K_s] = "BLEND_SUB"
- blitsn[K_m] = "BLEND_MULT"
- blitsn[K_EQUALS] = "BLEND_MAX"
- blitsn[K_MINUS] = "BLEND_MIN"
- screen.blit(im1, (0, 0))
- pygame.display.flip()
- clock = pygame.time.Clock()
- print ("one pixel is:%s:" % [im1.get_at((0,0))])
- going = True
- while going:
- clock.tick(60)
- for event in pygame.event.get():
- if event.type == QUIT:
- going = False
- if event.type == KEYDOWN:
- usage()
- if event.type == KEYDOWN and event.key == K_ESCAPE:
- going = False
- elif event.type == KEYDOWN and event.key in images.keys():
- img_to_blit = images[event.key]
- iaa = img_to_blit.convert_alpha()
- elif event.type == KEYDOWN and event.key in blits.keys():
- t1 = time.time()
- # blits is a dict keyed with key -> blit flag. eg BLEND_ADD.
- im1.blit(img_to_blit, (0,0), None, blits[event.key])
- t2 = time.time()
- print ("one pixel is:%s:" % [im1.get_at((0,0))])
- print ("time to do:%s:" % (t2-t1))
- elif event.type == KEYDOWN and event.key in [K_t]:
- for bkey in blits.keys():
- t1 = time.time()
- for x in range(300):
- im1.blit(img_to_blit, (0,0), None, blits[bkey])
- t2 = time.time()
- # show which key we're doing...
- onedoing = blitsn[bkey]
- print ("time to do :%s: is :%s:" % (onedoing, t2-t1))
- elif event.type == KEYDOWN and event.key in [K_o]:
- t1 = time.time()
- # blits is a dict keyed with key -> blit flag. eg BLEND_ADD.
- im1.blit(iaa, (0,0))
- t2 = time.time()
- print ("one pixel is:%s:" % [im1.get_at((0,0))])
- print ("time to do:%s:" % (t2-t1))
- elif event.type == KEYDOWN and event.key == K_SPACE:
- # this additive blend without clamp two surfaces.
- #im1.set_alpha(127)
- #im1.blit(im1, (0,0))
- #im1.set_alpha(255)
- t1 = time.time()
- im1p = pygame.surfarray.pixels2d(im1)
- im2p = pygame.surfarray.pixels2d(im2)
- im1p += im2p
- del im1p
- del im2p
- t2 = time.time()
- print ("one pixel is:%s:" % [im1.get_at((0,0))])
- print ("time to do:%s:" % (t2-t1))
- elif event.type == KEYDOWN and event.key in [K_z]:
- t1 = time.time()
- im1p = pygame.surfarray.pixels3d(im1)
- im2p = pygame.surfarray.pixels3d(im2)
- im1p16 = im1p.astype(numpy.uint16)
- im2p16 = im1p.astype(numpy.uint16)
- im1p16 += im2p16
- im1p16 = numpy.minimum(im1p16, 255)
- pygame.surfarray.blit_array(im1, im1p16)
- del im1p
- del im2p
- t2 = time.time()
- print ("one pixel is:%s:" % [im1.get_at((0,0))])
- print ("time to do:%s:" % (t2-t1))
- elif event.type == KEYDOWN and event.key in [K_r, K_g, K_b]:
- # this adds one to each pixel.
- colmap={}
- colmap[K_r] = 0x10000
- colmap[K_g] = 0x00100
- colmap[K_b] = 0x00001
- im1p = pygame.surfarray.pixels2d(im1)
- im1p += colmap[event.key]
- del im1p
- print ("one pixel is:%s:" % [im1.get_at((0,0))])
- elif event.type == KEYDOWN and event.key == K_p:
- print ("one pixel is:%s:" % [im1.get_at((0,0))])
- elif event.type == KEYDOWN and event.key == K_f:
- # this additive blend without clamp two surfaces.
- t1 = time.time()
- im1.set_alpha(127)
- im1.blit(im2, (0,0))
- im1.set_alpha(255)
- t2 = time.time()
- print ("one pixel is:%s:" % [im1.get_at((0,0))])
- print ("time to do:%s:" % (t2-t1))
- screen.blit(im1, (0, 0))
- pygame.display.flip()
- pygame.quit()
- def usage():
- print ("press keys 1-5 to change image to blit.")
- print ("A - ADD, S- SUB, M- MULT, - MIN, + MAX")
- print ("T - timing test for special blend modes.")
- if __name__ == '__main__':
- usage()
- main()
|