1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
#!/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()
|