Thanks DR0ID. Per pixel alpha, color key, and per surface alpha are all separate, it's a SDL constraint.
I'll have to look into your script a bit more. I think maybe the rotate/rotozoom functions need some fixing for non 32bit per pixel alpha. I'm guessing that the blend modes for blit are ok. Cheers, On 8/10/07, DR0ID <[EMAIL PROTECTED]> wrote: > René Dudfield schrieb: > > Hi, > > > > DR0ID, do you have a script which demonstrates this bug? > > > > Or can you explain it further? > > > > > Hi > > there you have a script. Blendmodes only work with pygame1.8. Users > using pygame1.7 can start the script, but should not change the > blendmode pressing 'm'. > > Perhaps I have done something wrong, please correct any mistake you > find. Or perhaps I have forgotten an interesting case. > > Results: > > rotate() screws up on normals surfaces and surfaces with per surface alpha. > > rotozoom() screws up all except surfaces with per pixel alpha > > Blendmodes do not respect colorkey nor per pixel alpha. I do not know if > this is intentional. > > rotozoom fills the space in with black, therefore you will not see any > difference in blendmodes 'add' or 'sub' (because adding 0 or subtracting > 0 gives the same number). > > An is there a reason why colorkey and per pixel alpha are mutual > exclusive? (is that a constraint from SDL?) > > ~DR0ID > > #Copyright 2006 DR0ID <[EMAIL PROTECTED]> http://mypage.bluewin.ch/DR0ID > # > # > # > """ > gradients demo > """ > > __author__ = "$Author: DR0ID $" > __version__= "$Revision: 106 $" > __date__ = "$Date: 2007-08-09 17:43:42 +0200 (Do, 09 Aug 2007) $" > > > import pygame > import math > import random > import os > > > > > > > def main(): > screen_size = (800,700) > size = 100 # size of the test surfaces > fill_color = (0,255,0) > num_table = (4, 4) # number of test surfaces per row/column > > pygame.init() > os.environ['SDL_VIDEO_CENTERED'] = '1' > screen = pygame.display.set_mode(screen_size, pygame.SRCALPHA) > bgd = pygame.Surface(screen.get_size()) > bgd.fill((128,128,128)) > screen.blit(bgd, (0,0)) > font = pygame.font.Font(None, 30) > surfaces = [] > > surfaces.append(pygame.Surface((size,)*2)) #normal surface > > colorkey = pygame.Surface((size,)*2)#colorkey > colorkey.set_colorkey((255,0,255)) > > surfaces.append(colorkey) # colorkey > > surfaces.append(pygame.Surface((size,)*2).convert_alpha()) #alpha > surface, per pixel alpha > ## surfaces[-1].set_colorkey((255,0,255)) > ## surfaces[-1].set_alpha(128) > surf_alpha = pygame.Surface((size,)*2) > surf_alpha.set_alpha(128) > surfaces.append(surf_alpha) #alpha surface, per pixel alpha > > for idx, surf in enumerate(surfaces): > surf.fill(fill_color) > > pygame.draw.circle(surfaces[1], (255,0,255), (20,20), size/2) > pygame.draw.circle(surfaces[2], (255,0,255,0), (20,20), size/2) > ## pygame.draw.circle(surfaces[3], (255,0,255,0), (20,20), size/2) > > for idx in range(num_table[0]): > surfaces.append( pygame.transform.rotate(surfaces[idx], 30)) > > for idx in range(num_table[0]): > surfaces.append( pygame.transform.rotozoom(surfaces[idx], 30,1)) > > > > modes = [0,1,2,3,4,5] > mode = 0 > > pygame.display.set_caption( "mode:"+str(modes[mode])+ > " keys: m" > ) > running = True > changed = True > while running: > event = pygame.event.wait() > if pygame.QUIT==event.type: > running = False > elif pygame.KEYDOWN == event.type: > if event.key == pygame.K_ESCAPE:#pygame.K_ESCAPE == event.key: > running = False > elif event.key == pygame.K_m: > mode += 1 > mode %= len(modes) > changed = True > elif pygame.MOUSEBUTTONDOWN == event.type: > if pygame.key.get_mods()&pygame.KMOD_CTRL: > spoint = list(pygame.mouse.get_pos()) > else: > epoint = list(pygame.mouse.get_pos()) > changed = True > > if changed: > changed = False > mode_str = ["normal", "add", "sub", "mult", "min", "max"] > pygame.display.set_caption( "mode:"+mode_str[modes[mode]]+ > " keys: m" > ) > screen.fill((50,50,50)) > screen.blit(bgd, (0,0)) > > #here blit the different surfaces > distx = screen_size[0]/num_table[0] > disty = screen_size[1]/num_table[1] > idx = 0 > for y in range(0,600, disty): > for x in range(0,800, distx): > if idx<len(surfaces): > if modes[mode]==0: > screen.blit(surfaces[idx], (x+50,y+50)) > else: > screen.blit(surfaces[idx], (x+50,y+50), None, > modes[mode]) > idx += 1 > > # strings > if y == 0: > if x == 0: > tex = font.render('normal', 1,(255,255,255)) > screen.blit(tex, (x+50, y)) > elif x == distx: > tex = font.render('colorkey', 1,(255,255,255)) > screen.blit(tex, (x+50, y)) > elif x == 2*distx: > tex = font.render('per pixel alpha', > 1,(255,255,255)) > screen.blit(tex, (x+50, y)) > elif x == 3*distx: > tex = font.render('surface alpha 128', > 1,(255,255,255)) > screen.blit(tex, (x+20, y)) > if x == 0: > if y == 0: > tex = font.render('no rotation', 1 , > (255,255,255)) > screen.blit(tex, (x, y+30)) > if y == disty: > tex = font.render('rotate()', 1 , > (255,255,255)) > screen.blit(tex, (x, y+30)) > if y == 2*disty: > tex = font.render('rotozoom()', 1 , > (255,255,255)) > screen.blit(tex, (x, y+30)) > tex = font.render('press m to change > blendmode: '+mode_str[modes[mode]], 1 , (255,255,255)) > screen.blit(tex, (screen_size[1]/3, > screen_size[1]-50)) > > > pygame.display.flip() > > > pygame.quit() > > > > > > if __name__ == '__main__': > main() >
