blit_blends.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #!/usr/bin/env python
  2. # fake additive blending. Using NumPy. it doesn't clamp.
  3. # press r,g,b
  4. import os, pygame
  5. from pygame.locals import *
  6. try:
  7. import pygame.surfarray
  8. import numpy
  9. except:
  10. print ("no surfarray for you! install numpy")
  11. import time
  12. main_dir = os.path.split(os.path.abspath(__file__))[0]
  13. data_dir = os.path.join(main_dir, 'data')
  14. def main():
  15. pygame.init()
  16. pygame.mixer.quit() # remove ALSA underflow messages for Debian squeeze
  17. screen = pygame.display.set_mode((640, 480))
  18. im1= pygame.Surface(screen.get_size())
  19. #im1= im1.convert()
  20. im1.fill((100, 0, 0))
  21. im2= pygame.Surface(screen.get_size())
  22. im2.fill((0, 50, 0))
  23. # we make a srcalpha copy of it.
  24. #im3= im2.convert(SRCALPHA)
  25. im3 = im2
  26. im3.set_alpha(127)
  27. images = {}
  28. images[K_1] = im2
  29. images[K_2] = pygame.image.load(os.path.join(data_dir, "chimp.bmp"))
  30. images[K_3] = pygame.image.load(os.path.join(data_dir, "alien3.gif"))
  31. images[K_4] = pygame.image.load(os.path.join(data_dir, "liquid.bmp"))
  32. img_to_blit = im2.convert()
  33. iaa = img_to_blit.convert_alpha()
  34. blits = {}
  35. blits[K_a] = BLEND_ADD
  36. blits[K_s] = BLEND_SUB
  37. blits[K_m] = BLEND_MULT
  38. blits[K_EQUALS] = BLEND_MAX
  39. blits[K_MINUS] = BLEND_MIN
  40. blitsn = {}
  41. blitsn[K_a] = "BLEND_ADD"
  42. blitsn[K_s] = "BLEND_SUB"
  43. blitsn[K_m] = "BLEND_MULT"
  44. blitsn[K_EQUALS] = "BLEND_MAX"
  45. blitsn[K_MINUS] = "BLEND_MIN"
  46. screen.blit(im1, (0, 0))
  47. pygame.display.flip()
  48. clock = pygame.time.Clock()
  49. print ("one pixel is:%s:" % [im1.get_at((0,0))])
  50. going = True
  51. while going:
  52. clock.tick(60)
  53. for event in pygame.event.get():
  54. if event.type == QUIT:
  55. going = False
  56. if event.type == KEYDOWN:
  57. usage()
  58. if event.type == KEYDOWN and event.key == K_ESCAPE:
  59. going = False
  60. elif event.type == KEYDOWN and event.key in images.keys():
  61. img_to_blit = images[event.key]
  62. iaa = img_to_blit.convert_alpha()
  63. elif event.type == KEYDOWN and event.key in blits.keys():
  64. t1 = time.time()
  65. # blits is a dict keyed with key -> blit flag. eg BLEND_ADD.
  66. im1.blit(img_to_blit, (0,0), None, blits[event.key])
  67. t2 = time.time()
  68. print ("one pixel is:%s:" % [im1.get_at((0,0))])
  69. print ("time to do:%s:" % (t2-t1))
  70. elif event.type == KEYDOWN and event.key in [K_t]:
  71. for bkey in blits.keys():
  72. t1 = time.time()
  73. for x in range(300):
  74. im1.blit(img_to_blit, (0,0), None, blits[bkey])
  75. t2 = time.time()
  76. # show which key we're doing...
  77. onedoing = blitsn[bkey]
  78. print ("time to do :%s: is :%s:" % (onedoing, t2-t1))
  79. elif event.type == KEYDOWN and event.key in [K_o]:
  80. t1 = time.time()
  81. # blits is a dict keyed with key -> blit flag. eg BLEND_ADD.
  82. im1.blit(iaa, (0,0))
  83. t2 = time.time()
  84. print ("one pixel is:%s:" % [im1.get_at((0,0))])
  85. print ("time to do:%s:" % (t2-t1))
  86. elif event.type == KEYDOWN and event.key == K_SPACE:
  87. # this additive blend without clamp two surfaces.
  88. #im1.set_alpha(127)
  89. #im1.blit(im1, (0,0))
  90. #im1.set_alpha(255)
  91. t1 = time.time()
  92. im1p = pygame.surfarray.pixels2d(im1)
  93. im2p = pygame.surfarray.pixels2d(im2)
  94. im1p += im2p
  95. del im1p
  96. del im2p
  97. t2 = time.time()
  98. print ("one pixel is:%s:" % [im1.get_at((0,0))])
  99. print ("time to do:%s:" % (t2-t1))
  100. elif event.type == KEYDOWN and event.key in [K_z]:
  101. t1 = time.time()
  102. im1p = pygame.surfarray.pixels3d(im1)
  103. im2p = pygame.surfarray.pixels3d(im2)
  104. im1p16 = im1p.astype(numpy.uint16)
  105. im2p16 = im1p.astype(numpy.uint16)
  106. im1p16 += im2p16
  107. im1p16 = numpy.minimum(im1p16, 255)
  108. pygame.surfarray.blit_array(im1, im1p16)
  109. del im1p
  110. del im2p
  111. t2 = time.time()
  112. print ("one pixel is:%s:" % [im1.get_at((0,0))])
  113. print ("time to do:%s:" % (t2-t1))
  114. elif event.type == KEYDOWN and event.key in [K_r, K_g, K_b]:
  115. # this adds one to each pixel.
  116. colmap={}
  117. colmap[K_r] = 0x10000
  118. colmap[K_g] = 0x00100
  119. colmap[K_b] = 0x00001
  120. im1p = pygame.surfarray.pixels2d(im1)
  121. im1p += colmap[event.key]
  122. del im1p
  123. print ("one pixel is:%s:" % [im1.get_at((0,0))])
  124. elif event.type == KEYDOWN and event.key == K_p:
  125. print ("one pixel is:%s:" % [im1.get_at((0,0))])
  126. elif event.type == KEYDOWN and event.key == K_f:
  127. # this additive blend without clamp two surfaces.
  128. t1 = time.time()
  129. im1.set_alpha(127)
  130. im1.blit(im2, (0,0))
  131. im1.set_alpha(255)
  132. t2 = time.time()
  133. print ("one pixel is:%s:" % [im1.get_at((0,0))])
  134. print ("time to do:%s:" % (t2-t1))
  135. screen.blit(im1, (0, 0))
  136. pygame.display.flip()
  137. pygame.quit()
  138. def usage():
  139. print ("press keys 1-5 to change image to blit.")
  140. print ("A - ADD, S- SUB, M- MULT, - MIN, + MAX")
  141. print ("T - timing test for special blend modes.")
  142. if __name__ == '__main__':
  143. usage()
  144. main()