Traktor/myenv/Lib/site-packages/pygame/examples/blit_blends.py

198 lines
6.2 KiB
Python
Raw Normal View History

2024-05-23 01:57:24 +02:00
#!/usr/bin/env python
""" pygame.examples.blit_blends
Blending colors in different ways with different blend modes.
It also shows some tricks with the surfarray.
Including how to do additive blending.
Keyboard Controls
-----------------
* R, G, B - add a bit of Red, Green, or Blue.
* A - Add blend mode
* S - Subtractive blend mode
* M - Multiply blend mode
* = key BLEND_MAX blend mode.
* - key BLEND_MIN blend mode.
* 1, 2, 3, 4 - use different images.
"""
import os
import pygame as pg
import time
main_dir = os.path.split(os.path.abspath(__file__))[0]
data_dir = os.path.join(main_dir, "data")
try:
import pygame.surfarray
import numpy
except ImportError:
print("no surfarray for you! install numpy")
def main():
pg.init()
pg.mixer.quit() # remove ALSA underflow messages for Debian squeeze
screen = pg.display.set_mode((640, 480))
im1 = pg.Surface(screen.get_size())
# im1= im1.convert()
im1.fill((100, 0, 0))
im2 = pg.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[pg.K_1] = im2
images[pg.K_2] = pg.image.load(os.path.join(data_dir, "chimp.png"))
images[pg.K_3] = pg.image.load(os.path.join(data_dir, "alien3.gif"))
images[pg.K_4] = pg.image.load(os.path.join(data_dir, "liquid.bmp"))
img_to_blit = im2.convert()
iaa = img_to_blit.convert_alpha()
blits = {}
blits[pg.K_a] = pg.BLEND_ADD
blits[pg.K_s] = pg.BLEND_SUB
blits[pg.K_m] = pg.BLEND_MULT
blits[pg.K_EQUALS] = pg.BLEND_MAX
blits[pg.K_MINUS] = pg.BLEND_MIN
blitsn = {}
blitsn[pg.K_a] = "BLEND_ADD"
blitsn[pg.K_s] = "BLEND_SUB"
blitsn[pg.K_m] = "BLEND_MULT"
blitsn[pg.K_EQUALS] = "BLEND_MAX"
blitsn[pg.K_MINUS] = "BLEND_MIN"
screen.blit(im1, (0, 0))
pg.display.flip()
clock = pg.time.Clock()
print("one pixel is:%s:" % [im1.get_at((0, 0))])
going = True
while going:
clock.tick(60)
for event in pg.event.get():
if event.type == pg.QUIT:
going = False
if event.type == pg.KEYDOWN:
usage()
if event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE:
going = False
elif event.type == pg.KEYDOWN and event.key in images.keys():
img_to_blit = images[event.key]
iaa = img_to_blit.convert_alpha()
elif event.type == pg.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(f"time to do:{t2 - t1}:")
elif event.type == pg.KEYDOWN and event.key in [pg.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(f"time to do :{onedoing}: is :{t2 - t1}:")
elif event.type == pg.KEYDOWN and event.key in [pg.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(f"time to do:{t2 - t1}:")
elif event.type == pg.KEYDOWN and event.key == pg.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(f"time to do:{t2 - t1}:")
elif event.type == pg.KEYDOWN and event.key in [pg.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(f"time to do:{t2 - t1}:")
elif event.type == pg.KEYDOWN and event.key in [pg.K_r, pg.K_g, pg.K_b]:
# this adds one to each pixel.
colmap = {}
colmap[pg.K_r] = 0x10000
colmap[pg.K_g] = 0x00100
colmap[pg.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 == pg.KEYDOWN and event.key == pg.K_p:
print("one pixel is:%s:" % [im1.get_at((0, 0))])
elif event.type == pg.KEYDOWN and event.key == pg.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(f"time to do:{t2 - t1}:")
screen.blit(im1, (0, 0))
pg.display.flip()
pg.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()