o
    tVgц                 	   @   s@  d dl Z d dlZd dlmZ d dlmZmZ zd dlT W n ee	fy'   Y nw d dl
Z
d dlT d dlmZ d dlZd dlZd dlZd dlZde kZG dd dejZG d	d
 d
ejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZedkre  dS dS )    N)
test_utils)example_pathSurfaceSubclass)*)BufferProxyPyPyc                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Ze e!j"#d9d:kd;d<d= Z$d>d? Z%d@dA Z&dBdC Z'dDdE Z(dFdG Z)e*e+j,dHZ-e e- dIdJdK Z.e e- dIdLdM Z/dNdO Z0dPdQ Z1dRdS Z2dTdU Z3dVdW Z4dXS )YSurfaceTypeTestc                 C   s   d}t }d}td||}t|||}| || | |tj | |t | | | | |	 | | |
 | dS )z]Ensure a subclassed surface can be used for pixel format
        when creating a new surface.   )   %         N)SRCALPHAr   pygameSurfaceassertIsNotassertIsInstanceassertNotIsInstanceassertEqualget_size	get_flagsget_bitsize)selfexpected_depthexpected_flagsexpected_sizedepth_surfacesurface r   M/home/ubuntu/.local/lib/python3.10/site-packages/pygame/tests/surface_test.py.test_surface__pixel_format_as_surface_subclass   s   z>SurfaceTypeTest.test_surface__pixel_format_as_surface_subclassc                 C   sH   t d}| |dd t jd t d}| |dd d S )N)   r"   r   r   r   r   r        r'   )r   r   r   get_atdisplayset_moder   surfr   r   r    !test_surface_created_opaque_black+   s
   

z1SurfaceTypeTest.test_surface_created_opaque_blackc                 C   sf   t d}t dddd}|| |dd |d | }| |d d | |d d dS )z.see if surface.set_clip(None) works correctly.   X  
   r   N   r/   )r   r   Rectset_clipmove_ipget_clipr   )r   srresr   r   r    test_set_clip4   s   


zSurfaceTypeTest.test_set_clipc                 C   s"   t ddd}| t|d d S )NF   r<   r       z<Surface(70x70x32 SW)>)r   r   r   reprr+   r   r   r    
test_print@   s   zSurfaceTypeTest.test_printc                 C   st   t jdtdd}| | t@ t | | d t ddd}| | d t jddd}| | d d S )Nr;   r=   )flagsdepthr   r	   r2   rA   )r   r   r   r   r   r   get_bytesize)r   r,   surf_16r   r   r    test_keyword_argumentsD   s   z&SurfaceTypeTest.test_keyword_argumentsc                 C   sx   t ddd}|d |dd |d}| |t j | |d |d |dd	 |d}| |d
 d S )Nd   rG   r      r   r   r   r#   )r1   r1   r1   r%   r$   )r1      r%   )r   r   r%   r%   )r   r   fillset_atr(   r   Colorr   )r   r7   r8   r   r   r    test_set_atQ   s   



zSurfaceTypeTest.test_set_atc                 C   s,  t j  zt jttjdd}| 	|
dt ddd | 	|
dt ddd | 	|
dt ddd |dt ddd |dt ddd |dt ddd | 	|
dt ddd | 	|
dt ddd | 	|
dt ddd W t j  dS t j  w )	z?png files are loaded in big endian format (BGR rather than RGB)datazBGR.pngr1   r1   r%   r   )r1   r"   )r1   (   N)r   r)   initimageloadr   ospathjoinr   r(   rM   rL   quit)r   rS   r   r   r    test_set_at__big_endianb   s   
z'SurfaceTypeTest.test_set_at__big_endianc                 C   sl   t dtd}| | t@ t | tt jdt jd t dt}| dkr4| | t@ t d S d S )Nr;   r=   rF   rH   )r   r   r   r   r   assertRaises
ValueErrorr   r   r,   surf2r   r   r    test_SRCALPHAy   s   zSurfaceTypeTest.test_SRCALPHAc                 C   s,   t j  t d}| | t@ d dS )zOis set to zero, and SRCALPHA is not set by default with no display initialized.r;   r   N)r   r)   rX   r   r   r   r   r+   r   r   r    test_flags_default0_nodisplay   s   

z-SurfaceTypeTest.test_flags_default0_nodisplayc                 C   sH   t jd zt d}| | t@ d W t j  dS t j  w )zWis set to zero, and SRCALPH is not set by default even when the display is initialized.)@     r;   r   N)r   r)   r*   r   r   r   r   rX   r+   r   r   r    test_flags_default0_display   s
   
z+SurfaceTypeTest.test_flags_default0_displayc                 C   sb   dd }d}|  |dd|d  d}| t|dd| | t|dd| d}| t|dd| d S )	Nc                 S   s   t d|| | d S )NrP   )r   r   )bppr@   masksr   r   r    	make_surf   s   z-SurfaceTypeTest.test_masks.<locals>.make_surf)      ~       r   r=   r   )i   rh   r%   r   rH   )i  o rh   r%   r   )r   rZ   r[   )r   re   rd   r   r   r    
test_masks   s   zSurfaceTypeTest.test_masksc                 C   s&  t dtd}|d | }| |jd | |jd |dd | }| |j	d | |j
d | |jd | |jd |d	d | }| |j	d
 | |j
d
 | |jd | |jd t ddd}|d | }| |j|  | |j|  |d | }| |jd | |jd |dd | }| |j	d | |j
d | |jd | |jd |dd | }| |j	d | |j
d | |jd | |jd t j  zt ddd}|d |  W t j  d S t j  w )Nr;   r=   r   r   r   r   r   )   rk   )r%   r%   r%   rJ   rk   rJ   )   rl   rl   r2   rH   rI   r%   r%   r%   <   ro      )   rJ      )r   r   r   rK   get_bounding_rectr   widthheightrL   lefttop	get_width
get_heightset_colorkeyr)   rR   rX   )r   r,   
bound_rectr   r   r    test_get_bounding_rect   sX   





z&SurfaceTypeTest.test_get_bounding_rectc                 C   s\   d}t dt jd}|| | }| }| }| |j|j | |d| dS )zEnsure a surface can be copied.   r~   r~   r~   r=   r=   r=   rP   N)	r   r   r   rK   copyget_rectr   sizer(   )r   colors1s2s1rects2rectr   r   r    	test_copy   s   
zSurfaceTypeTest.test_copyc                 C   sx   d}t dddd}t dt jd}||| t|D ]}| ||| qt	|D ]}| 
||| q.dS )zEnsure a surface can be filled.r}   r   r	   r   r=   N)r   r3   r   r   rK   r   rect_area_ptsr   r(   rect_outer_boundsassertNotEqual)r   r   	fill_rectr   ptr   r   r    	test_fill   s   zSurfaceTypeTest.test_fillc                 C   s   d}t d}t d}|dt j | | t j@  ||d || | 	|
 | t j@ dk | | t j@  dS )zTest RLEACCEL flag with fill()   r~   r~   r%   r   r%   r   r%   r#   r   N)r   r   rz   RLEACCEL
assertTruer   
RLEACCELOKblitrK   r   mustlock)r   r   r,   	blit_surfr   r   r    test_fill_rle   s   


zSurfaceTypeTest.test_fill_rlec                 C   sh   t d}t d}|dt j | | t j@  ||d | | t j@  | |  dS )z"Test RLEACCEL flag with mustlock()rF   r   r   r%   r#   N)	r   r   rz   r   r   r   r   r   r   r   r,   r   r   r   r    test_mustlock_rle  s   

z!SurfaceTypeTest.test_mustlock_rlec                 C   s   t d}t jddt jd}|dt j | | t j@  ||d | | t j@  | | t j@  | |	  dS )zbTest RLEACCEL flag with mustlock() on a surface
        with per pixel alpha - new feature in SDL2rF   r=   )rA   r@   )      r   r%   r#   N)
r   r   r   rz   r   r   r   r   r   r   r   r   r   r    test_mustlock_surf_alpha_rle  s   
z,SurfaceTypeTest.test_mustlock_surf_alpha_rlec                 C   sb   t dd}|dt j | | t j@  | }| | t j@  | | t j@  dS )z5Test copying a surface set to use run length encodingr   rH   r   N)r   r   rz   r   r   r   r   r   )r   r   newsurfr   r   r    test_copy_rle  s   zSurfaceTypeTest.test_copy_rlec                 C   s   d}d}t dddd}t dd}t dd}|dt j || ||}|| ||d | |	 t j@  | |	 t j@   dS 	z<Ensure an RLE sub-surface works independently of its parent.r   )ra   ra   r   r%   r	   r   rH   r   r#   N)
r   r3   r   rz   r   rK   
subsurfacer   r   r   r   r   color2sub_rects0r   r   r   r   r    test_subsurface_rle"  s   


z#SurfaceTypeTest.test_subsurface_rlec                 C   s   d}d}t dddd}t dd}t dd}|dt j || ||}|| ||d | |	 t j
@  | |	 t j
@   dS r   )r   r3   r   rz   r   rK   r   r   r   r   r   r   r   r   r    test_subsurface_rle21  s   


z$SurfaceTypeTest.test_subsurface_rle2c                    s    fdd}t j  zQt jd t jttj	dd}|
 }| }||}||} | t j@   | t j@    | |  t|t j W t j  dS t j  w )zTest for error/crash when calling set_colorkey() followed
        by convert twice in succession. Code originally taken
        from solarwolf.c                    s,   |   }| |t  |   | |  S N)get_colorkeyrz   r   r   convert)imgclearr   r   r    optimizeF  s   z:SurfaceTypeTest.test_solarwolf_rle_usage.<locals>.optimizei    rO   
alien1.pngN)r   r)   rR   r*   rS   rT   r   rU   rV   rW   r   r   r   r   r   r   r   
isinstancer   rX   )r   r   rS   orig_colorkeyr   r   r    test_solarwolf_rle_usageA  s   
z(SurfaceTypeTest.test_solarwolf_rle_usagec                 C   s  t j  zzt jjddd t d}t jttj	
dd}| }| }||t | | t j@  | | t j@   ||d | | t j@  | | t j@  |d | | t j@   | | t j@   W t j  d	S t j  w )
z'Test for RLE status after setting alphar   r=   rB   rF   rO   r   r#   Z   N)r   r)   rR   r*   r   rS   rT   r   rU   rV   rW   r   r   rz   r   r   r   r   r   	set_alpharX   )r   blit_to_surfrS   r   r   r   r    test_solarwolf_rle_usage_2]  s"   


z*SurfaceTypeTest.test_solarwolf_rle_usage_2c                 C   s  t j  zzt jd t d}|d t jtt	j
dd}| }| }|dt ||d |d}| | | ||t |d ||d |d}| j|j|jd	d
 | j|j|jd	d
 | j|j|jd	d
 W t j  d S t j  w )Nr   )P   G   rm   rO   r   r   r#   2   r   r2   delta)r   r)   rR   r*   r   rK   rS   rT   r   rU   rV   rW   r   r   r   r   r   r(   r   rz   assertAlmostEqualr8   gbrX   )r   r   rS   r   sample_pixel_rlesample_pixel_no_rler   r   r     test_set_alpha__set_colorkey_rle|  s(   





z0SurfaceTypeTest.test_set_alpha__set_colorkey_rlec                 C   s   d}d}t dddd}t dt jd}|||}|d}| || |d}||d	}|d
}	| || ||d}
| t|
d d S )Nr}   )r"   r"   r"   r~   ir	   r   r=   r#   )   r   r   r   )r   r   r   rq   rq   )r   r   r   rj   )	r   r3   r   r   rK   r(   r   r   tuple)r   r   r   r   r   r1cr   r2c2r3r   r   r    test_fill_negative_coordinates  s   


z.SurfaceTypeTest.test_fill_negative_coordinatesc                 C   sP   d}d}t ddd}|jt j||d | |dd | |d	| d
S )z(Ensure fill() accepts keyword arguments.rJ   r2      r%   rJ   rJ   r2   r2   r   r   r=   special_flagsr   rectr#   r$   rJ   rJ   N)r   r   rK   	BLEND_ADDr   r(   )r   r   arear   r   r   r    test_fill_keyword_args  s   z&SurfaceTypeTest.test_fill_keyword_argsc                 C   sd   t dt jd}| | d dD ]}|| tdD ]	}||  q| | | qdS )z0Ensure a surface's alpha value can be retrieved.r   r=   r%   )r   r=      r%   rq   N)r   r   r   r   	get_alphar   range)r   r   alphatr   r   r    test_get_alpha  s   
zSurfaceTypeTest.test_get_alphac                 C   s$  t j  zd}d}t dt j|}| | | | | | d}d}t dd|}| | | | | | d}d}t dd|}| | | | | | | t j	 t j
 }t j  |  W d   n1 sww   Y  W t j  dS W t j  dS t j  w )	z7Ensure a surface's bit and byte sizes can be retrieved.r=   rq   r      r2   r      N)r   r)   rR   r   r   r   rC   r   rZ   errorr*   rX   )r   rA   depth_bytesr   r   r   r   r    test_get_bytesize  s2   



z!SurfaceTypeTest.test_get_bytesizec                 C   s&   t dt jd}| | t j dS )z*Ensure a surface's flags can be retrieved.r   r=   N)r   r   r   r   r   )r   r   r   r   r    test_get_flags  s   zSurfaceTypeTest.test_get_flagsSDL_VIDEODRIVERdummy&requires a non-"dummy" SDL_VIDEODRIVERc                 C   s  t j  zt jjddd}| | t j@  t jjdt jd}| | t j@  t jjddd}| | t j@  t jjdt jd}| | t j@  t jjddd}| | t j	@  t jjdt j	d}| | t j	@  t jjddd}| t j
@ s| | t j
@  zt jdt j
d W n
 t jy   Y nw | | t j
@  W t j  d S W t j  d S t j  w )N)r0     r   )r@   ra   ra   r=   )r   r)   rR   r*   assertFalser   
FULLSCREENr   NOFRAME	RESIZABLEOPENGLr   rX   )r   screen_surfr   r   r    test_get_flags__display_surf  s4   
z,SurfaceTypeTest.test_get_flags__display_surfc                 C   s   t j  zFt d}|d}| | | | t j t j	 }t j
  |  W d   n1 s7w   Y  W t j
  dS W t j
  dS t j
  w )z+Ensure a surface's parent can be retrieved.r	   r	   )r   r   r   r   N)r   r)   rR   r   r   assertIs
get_parentrZ   r   r*   rX   )r   parentchildr   r   r   r    test_get_parent   s   





zSurfaceTypeTest.test_get_parentc                 C   s(   d}t |}| }| |j| dS )z)Ensure a surface's rect can be retrieved.r   N)r   r   r   r   r   )r   r   r,   r   r   r   r    test_get_rect2  s   
zSurfaceTypeTest.test_get_rectc                 C   sj   t dddD ],}t dddD ]#}t||f}| | | | | | | | ||f qqdS )z;Ensure a surface's size, width and height can be retrieved.r   r%   r=   r   r   N)r   r   r   r   rx   ry   r   )r   whr7   r   r   r    test_get_width__size_and_height<  s   z/SurfaceTypeTest.test_get_width__size_and_heightc                 C   s8  t }tddd}|d}| ||jd | ||jd | |t | ||jd tddd}| |  |	  }|d}|d}| |t | 
|j| | |t | 
|j| tddd	}|d}| ||jd | ||jd | |t | ||jd tddd	}| |  |	  }|d}|d}| |t | 
|j| | |t | 
|j| tdtjd	}|d}| |t | ||jd tddd
}|d}|d}| ||jd | ||jd | |t | |t tddd
}| |  |	  }|d}|d}| |t | 
|j| | |t | 
|j| tddd}| |  |	  }|d}|d}|d}|d}| |t | 
|j| | |t | 
|j| | |t | |t |d}| ||jd | ||jd d}tdtjd}dD ]}	| ||	t qtddd}| }
tst|
}| 
|jd tddd}| |  |d}
| |  |
j}| |  d}t  | |  d}
t  | |  tdtjd}| t|jd | t|jd | t|jd | t|jd tddd}|d |d tddd}t|}|d}
t|
}t  | | |u  | | |
u  ~
t  | | |u  | | du  ~t  | | du  dS )z>Ensure a buffer view of the surface's pixels can be retrieved.r      r   rr   2013)rr   r   r	   rH   r=   )r   r   rq   r   N)
r   r  aAr8   Rr   Gr   Br2   rq   r2    9RGBA   2)r[   r   r   get_viewrZ   r   r   rC   rx   ry   r   lengthr   r   IS_PYPYArrayInterfacendr   
get_locked__array_interface__r   gccollect	TypeErrorweakrefref)r   Errorr7   v2r  v0v1v3r   kindvair   weak_sweak_vr   r   r    test_get_viewE  s   





















zSurfaceTypeTest.test_get_viewc                 C   s   dD ].}t dd|}| |  }| }| |t | |j| | t	|d| d qt ddd}|
d}| |  }| }| |t | |j| t d	dd}| }| |  d }t  | |  d S )
Nrr   r	   rH   r=   r   r   z<BufferProxy(z)>)r   r1   r=   )rJ   r2   r   r   r  )r   r   	get_pitchry   
get_bufferr   r   r   r  r>   r   r   r  r  r  r   )r   bitsizer7   r  r  r   r   r   r    test_get_buffer  s&   
zSurfaceTypeTest.test_get_bufferget_segcountzold buffer not availablec           	      C   s   ddl m}m} tdtjd}| }||\}}| |d | || |	   ||d\}}| ||j
 | || d S )Nr   r)  get_write_bufferr  r=   rJ   )pygame.bufferproxyr)  r+  r   r   r   r&  r   r%  ry   _pixels_address	r   r)  r+  r7   r  segcountbuflenseglensegaddrr   r   r    test_get_buffer_oldbuf  s   z&SurfaceTypeTest.test_get_buffer_oldbufc           	      C   s   ddl m}m} tdtjd}|d}||\}}| |d | || |	   ||d\}}| ||j
| d   | ||  d S )Nr   r*  r  r=   r  rr   r   )r,  r)  r+  r   r   r   r  r   r%  ry   r-  rC   r.  r   r   r    test_get_view_oldbuf  s   
z$SurfaceTypeTest.test_get_view_oldbufc                 C   sX   t dt jd}d}|D ]}|| tdD ]	}||  q| | | qd S )Nr   r=   ))r"      r"   r%   )   r   r   r%   )   r   r%   r%   rq   )r   r   r   rz   r   r   r   )r   r7   	colorkeyscolorkeyr   r   r   r    test_set_colorkey  s   
z!SurfaceTypeTest.test_set_colorkeyc                 C   6   t d}| \}}}}| t|j||||f d S Nr   )r   r   	get_masksrZ   r  	set_masksr   r7   r8   r   r   r  r   r   r    test_set_masks'     
zSurfaceTypeTest.test_set_masksc                 C   r;  r<  )r   r   
get_shiftsrZ   r  
set_shiftsr?  r   r   r    test_set_shifts,  rA  zSurfaceTypeTest.test_set_shiftsc                 C   sh   d}t ddd}t ddd}|d |jt|d| d | |d	d
 | |d| d S )Nr   r   r   r=   r2   r2   )rJ   r2   r   r   )r   sourcedestr   r#   r$   )r   r   rK   r   r   r   r   r(   )r   r   r   r   r   r   r    test_blit_keyword_args1  s   
z&SurfaceTypeTest.test_blit_keyword_argsc                 C   s   t ddd}d}|| t ddd}d}|| |j|ddd	 |j|d
dd	 |j|ddd	 | |d| | |d| | |d| | |d| | |d| | |d| | |d| | |d| dS )z8SDL2 can have more than 16 bits for x, y, width, height.)rG   i	 r   r=   r%   r   r   r&   r   r%   r   rF   )r   i>  rG   rG   )r   r   )r   i }  rG   rG   ),  rK  )r   i rG   rG   )e   rL  )   rM  )-  rN  )r   rN  )r   rM  )rG   rM  )c   rO  )  rP  N)r   r   rK   r   r   r(   )r   big_surfbig_surf_color
backgroundbackground_colorr   r   r    test_blit_big_rects:  s"   

z#SurfaceTypeTest.test_blit_big_rectsN)5__name__
__module____qualname__r!   r-   r:   r?   rE   rN   rY   r^   r_   rb   ri   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   unittestskipIfrU   environgetr   r   r   r   r#  r(  hasattrr   bufferproxyOLDBUFr3  r4  r:  r@  rD  rH  rU  r   r   r   r    r      sd    		3

"
)
	 

	r   c                   @   s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )TestSurfaceBlitz/Tests basic blitting functionality and options.c                 C   sL   t dd| _| jt ddd t dd| _| jt ddd dS )zResets starting surfaces.   rb  r=   r%   @   rd  r   N)r   r   src_surfacerK   rM   dst_surfacer   r   r   r    setUpv  s   zTestSurfaceBlit.setUpc                 C   s\   | j | jd}| |tj | |jd dd tdD D ]}| | j 	|d qdS )z4Full coverage w/ overflow, specified with Coordinater#   rc  c                 S      g | ]}||fqS r   r   .0xr   r   r    
<listcomp>      z<TestSurfaceBlit.test_blit_overflow_coord.<locals>.<listcomp>rd  rm   N)
rf  r   re  r   r   r3   r   r   r   r(   r   resultkr   r   r    test_blit_overflow_coord}  s   z(TestSurfaceBlit.test_blit_overflow_coordc              	   C   sh   | j | jtdddd}| |tj | |jd dd tdD D ]}| | j 	|d q%dS )	z0Full coverage w/ overflow, specified with a RectrK  rc  c                 S   rh  r   r   ri  r   r   r    rl    rm  z;TestSurfaceBlit.test_blit_overflow_rect.<locals>.<listcomp>rd  rm   N
rf  r   re  r   r3   r   r   r   r   r(   rn  r   r   r    test_blit_overflow_rect  s   z'TestSurfaceBlit.test_blit_overflow_rectc                 C   s   | j j| jtdd}| |tj | |jd | | j dd | | j dd | | j dd | | j dd	 | | j dd	 d
S )zPTest Rectangle Dest, with overflow but with starting rect with top-left at (1,1)rJ   rJ   rJ   rJ   )rG  ?   rw  r#   rI   rw  r   r   rw  r   rm   N	rf  r   re  r   r3   r   r   r   r(   r   ro  r   r   r    test_blit_overflow_nonorigin  s   z,TestSurfaceBlit.test_blit_overflow_nonoriginc                 C   s   | j j| jtdtdd}| |tj | |jd | | j dd | | j dd | | j dd | | j d	d | | j d
d | | j dd | | j dd dS )zTesting area constraintru  r2   r2   r2   r2   rG  r   rE  r#   rI   rx  ry  rv  r   rm   r   r   Nrz  r{  r   r   r    test_blit_area_contraint  s    z(TestSurfaceBlit.test_blit_area_contraintc                 C   s   | j j| jtdtdd}| |tj | |jd dd tdD D ]}| | j 	|d q'| | j 	d	d | | j 	d
d dS )zTesting zero-overlap condition.) r  rJ   rJ   )r2   r2   rb  rb  r~  r#   c                 S   rh  r   r   ri  r   r   r    rl    rm  z:TestSurfaceBlit.test_blit_zero_overlap.<locals>.<listcomp>rd  rI   rx  ry  Nrs  rn  r   r   r    test_blit_zero_overlap  s   z&TestSurfaceBlit.test_blit_zero_overlapc                 C   s   t dtd}| }t| D ]\}}|||f|dd|f |||fd|ddf q||d t| D ]}| 	|
|d |
|d  q<d S )Nra  r=   r   r%   r#   rJ   )r   r   r   r   r   r   r   rL   r   r   r(   )r   srcdstijr   r   r   r    !test_blit__SRCALPHA_opaque_source  s   "z1TestSurfaceBlit.test_blit__SRCALPHA_opaque_sourcec              	   C   s   t dtd}| }t|j|jD ]
\}}||| q|	 }|
|d t|jD ]+}t|jD ]#}|||f \}}	}
}}||	|
||d| d   f}| || q4q-| | |  dS )zjTest that blit operation works on self, alpha value is
        correct, and that no RGB distortion occurs.)r6  r6  r=   r#   rb  N)r   r   r   r   r   gradientrt   ru   rL   r   r   r   r(   r   )r   test_surfacer   r   
test_colorreference_surfacerk  yr8   r   r   r  reference_colorexpected_colorr   r   r    test_blit__blit_to_self  s   z'TestSurfaceBlit.test_blit__blit_to_selfc                    sd   ddd   fdd} fdd}t dd	D ]}t d	d
D ]}||| ||| q"qdS )zTests blitting a nonzero alpha surface to another nonzero alpha surface
        both straight alpha compositing method. Test is fuzzy (+/- 1/256) to account for
        different implementations in SDL1 and SDL2.
        r   c                 S   s$   | | D ]}t |dkr dS qdS )zAReturns True if two colors are within (1, 1, 1, 1) of each other.rJ   FT)abs)color1r   valr   r   r    check_color_diff  s
   zRTestSurfaceBlit.test_blit__SRCALPHA_to_SRCALPHA_non_zero.<locals>.check_color_diffc                    s   t t jd}| }t| | || f}t| |||f || |  ||d  tt fdd|D  }|	d| dS )zITests straight alpha case. Source is low alpha, destination is high alphar=   r#   c                 3   "    | ]}|d  j   d  V  qdS r%   Nr  ri  low_alpha_colorr   r    	<genexpr>      
zdTestSurfaceBlit.test_blit__SRCALPHA_to_SRCALPHA_non_zero.<locals>.high_a_onto_low.<locals>.<genexpr>N
r   r   r   r   rM   rK   r   r   r   r(   )highlowhigh_alpha_surfacelow_alpha_surfacehigh_alpha_colorr  r  r   r   r  r    high_a_onto_low  "   


zQTestSurfaceBlit.test_blit__SRCALPHA_to_SRCALPHA_non_zero.<locals>.high_a_onto_lowc                    s   t t jd}| }t| | || f t| |||f}|  || ||d  tt fdd|D  }|	d| dS )zITests straight alpha case. Source is high alpha, destination is low alphar=   r#   c                 3   r  r  r  ri  r  r   r    r    r  zdTestSurfaceBlit.test_blit__SRCALPHA_to_SRCALPHA_non_zero.<locals>.low_a_onto_high.<locals>.<genexpr>Nr  )r  r  r  r  r  r  r  r  r    low_a_onto_high  r  zQTestSurfaceBlit.test_blit__SRCALPHA_to_SRCALPHA_non_zero.<locals>.low_a_onto_highr   r6  rb  N)r   )r   r  r  low_ahigh_ar   r  r    (test_blit__SRCALPHA_to_SRCALPHA_non_zero  s   
z8TestSurfaceBlit.test_blit__SRCALPHA_to_SRCALPHA_non_zeroc                 C   sD   t ddd}|d}t dt jd}|d| ||d d S )N)r   rr   r   rr   r2   r   r=   r#   )r   r   get_palette_atr   rL   r   )r   targetr  rF  r   r   r    test_blit__SRCALPHA32_to_8  s
   
z*TestSurfaceBlit.test_blit__SRCALPHA32_to_8N)rV  rW  rX  __doc__rg  rq  rt  r|  r  r  r  r  r  r  r   r   r   r    r`  V  s    @r`  c                   @   s  e Zd Zeejddkddd Zeejddkddd Z	eejddkddd	 Z
d
d Zdd Zdd Zdd Zdd Zede v pUde v ddd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Z d5d6 Z!d7d8 Z"d9d: Z#d;d< Z$d=d> Z%d?d@ Z&dAdB Z'dCdD Z(dEdF Z)dGdH Z*dIdJ Z+dKdL Z,dMdN Z-dOdP Z.dQdR Z/dSdT Z0dUdV Z1dWdX Z2dYdZ Z3d[d\ Z4d]d^ Z5d_d` Z6dadb Z7dcdd Z8dedf Z9dgdh Z:didj Z;dkS )lGeneralSurfaceTestsr   r   r   c                 C   s   t j  zet jd t jttj	dd}t jttj	dd}| 
| d | 
| d | 
t|dd | 
t|dd	 |d
}| 
t|d | 
| |  W t j  d S t j  w )Nr   rO   zcity.pngz	brick.png)r$   r%   r%   r%   r%   )r$   r$   r=   z<Surface(24x24x32 SW)>z<Surface(469x137x32 SW)>rr   z<Surface(24x24x8 SW)>)r   r)   rR   r*   rS   rT   r   rU   rV   rW   r   get_paletter>   r   rX   )r   imim2im3r   r   r    test_image_convert_bug_131)  s   

z.GeneralSurfaceTests.test_image_convert_bug_131c                 C   s   t j  t d}| t jd|j t j  zTz|d |t d W n t jy7   | d Y nw | t jd|j t j	d z|  W n t jy\   | d Y n	w W t j  dS W t j  dS t j  w )zGEnsure initialization exceptions are raised
        for surf.convert().r   display initializedr=   z-convert() should not raise an exception here.No video moder   N)
r   r)   rX   r   assertRaisesRegexr   r   rR   failr*   r+   r   r   r    test_convert_initF  s,   



z%GeneralSurfaceTests.test_convert_initc                 C   s   t j  t d}| t jd|j t j  z5| t jd|j t jd z|  W n t jy=   | 	d Y n	w W t j  dS W t j  dS t j  w )zMEnsure initialization exceptions are raised
        for surf.convert_alpha().r   r  r  r   z3convert_alpha() should not raise an exception here.N)
r   r)   rX   r   r  r   convert_alpharR   r*   r  r+   r   r   r    test_convert_alpha_initd  s    


z+GeneralSurfaceTests.test_convert_alpha_initc                 C   sn   t j  z+t jd t ddd}| }| | t@ t | |	 d W t j
  dS t j
  w )z[Ensure that the surface returned by surf.convert_alpha()
        has alpha blending enabledr   rF   r   r=   r%   N)r   r)   rR   r*   r   r  r   r   r   r   rX   )r   r   s1_alphar   r   r    test_convert_alpha_SRCALPHA|  s   
z/GeneralSurfaceTests.test_convert_alpha_SRCALPHAc                 C   sp   t dt jd}|d t dt jd}| |dd ||d | |dd | |dd dS )zblit should be white.r   r=   )r%   r%   r%   rG   r#   rj   N)r   r   r   rK   r   r(   r   )r   surf1r]   r   r   r    test_src_alpha_issue_1289  s   
z-GeneralSurfaceTests.test_src_alpha_issue_1289c                 C   st  i dddddddddd	d
ddddddddddddd	ddddddddddi ddd d!d"d#d$d%d&d'd(dd)dd*d+d,d-d.d/d0d1d2d3d4d5d6d7d8dd9d:d;d+i d<d=d>d?d@dAdBdCdDdEdFddGdHdIdJdKdLdMdNdOdPdQdRdSdEdTddUdVdWdXdYdZd[d\d]dEdd^d_d`dadbdcdddde}g df}i }t |t|t|D ]r\}}}t |t||D ]d\}}}	| j|||	|||dgK tdhtjdi}
|
|dj||	f tdhtjdi}||dj||f ||
dk |||f|||	ff}|dl||< | 	|| ||  W dm   n	1 s+w   Y  qq| 	|| dmS )n9 "What pygame 1.9.x did". Is the alpha blitter as before?r   r%   r%   rJ  r   r%   r%   r%   r  rJ      rJ   r  A      r  r	   r%      r%   r  ~   r   r  >   r%   r   r%   r  r   r  r   rw  r%   r   r%   r  r  r  r     r%   k   r%   r  r  rJ   r     r%   r2   r%   r  r   r%   r%   r   r%   rJ   r  r  rJ  rJ   r%   r  r  r  r  rJ   r%   r  r%   r  r     r%      r%   r  r  r  r  rd  r%      r%   r  r  r  r  r  r   r  r  r  rJ  r  r%   r  r  r  r  rd  r%   ra   ra   r  r  r  r%   r     r  r  _   r%         r  r  `   r%      r  r  r     r%   r     r  r  r  r   r  r   r   rJ  r  r%   r   r   r  r  }   r%   r6  r6  r  r  n   r%         r  r  r  r%   r   r   r  r  r  r%   r  r   r  r     r%   O   r  r  r  r  r%   rJ   r%   r  r   r   r  r  rJ  r   r%   r  r  r  r  r  r  o   r%         r  r  r   r%   r  r  r  r  r   r%   r  r   r  r  r  r%   N   r  r  r  r  r%   rJ   r%   r  r   r  r  r  rJ  r  r%   r  r  r0  r     r%   B   r5  r0  r     r%   rO  r   r0  r  r  r%   r  r$  r0  r  r  r%   r  r  r0  r  r  r%   r  r  r0  r  r0  r   r  rJ   rJ   rJ  r  r%   rJ   rJ   rC  r  r  r%   r2   r2   rC  r     r%   4   r5  r   r%   rw  r   r   r%   rw  r6     r%   3   ra   r   r%   r%   r   rJ   r%   r  rJ   r  r%   r  r  r  r%   r   r  r   r%   r  r   r  r%   r  r  r  r%   rJ   r  )rC  r  )rC  r  )rC  r  )rC  r  )rC  r   )rI  rJ  )rI  r  )rI  r  )rI  r  )rI  r  )rI  r  )rI  r  )rI  r   r   rJ   r  r  r   r  r  r%   src_rsrc_bsrc_adest_rdest_bdest_ar5  r5  r=   r%   r#   r  !   N
zipreversedsubTestr   r   r   rK   r   r(   r   r   results_expectednumsresultsdst_rdst_bdst_arZ  r[  r\  src_surf	dest_surfkeyr   r   r    test_src_alpha_compatible    	
 !"#$%&'()*+,-./01234Dz-GeneralSurfaceTests.test_src_alpha_compatiblec                 C   st  i ddddddddddd	d
dddddddddddddddd
ddddddi ddddddddddd dd!dd"d#d$d#d%d&d'd(d)d(d*d+d,dd-dd.d#d/d#i d0d&d1d(d2d(d3d+d4dd5dd6d7d8d7d9d:d;d<d=d<d>d?d@ddAddBdCdDdCdEdFd#d#dGdddCdCdFd#d#dGdddH}g dI}i }t |t|t|D ]r\}}}t |t||D ]d\}}}	| j|||	|||dJK tdKtjdL}
|
|dM||	f tdKtjdL}||dM||f ||
dN |||f|||	ff}|dO||< | 	|| ||  W dP   n	1 s+w   Y  qq| 	|| dPS )Qr  r  r  r  r  )r  r%   r%   r%   r  )rO  r%      r%   r  r  )   r%   f   r%   r  r  r  r  r  r  r  r  r  r  r  r  )D   r%   rs  rs  r  r  )rv  r%   rs     r  )U   r%   rt     r  r   )   r%   rx  r%   r  r  r  )w   r%   r{  r{  r	  r  )ru  r%         r  )r{  r%   r{  rz  r  r  )rz  r%   rv  ry  r  r  r  r  r   r%  r'  r)  r,  r.  r/  )rs  r%   rv  rv  r2  r6  )rt  r%   ru  r{  r:  )rt  r%   rx  r}  r<  r>  )rs  r%   rv  rw  r@  rA  rB  rP  rE  rG  )rv  r%   rs  rv  )rs  r%   rv  rs  rW  rX  rY  r`  r	   r%   r#   ra  Nrc  rg  r   r   r    test_src_alpha_compatible_16bit  rr  z3GeneralSurfaceTests.test_src_alpha_compatible_16bitc                 C   s~  i dddddddddd	d
ddddddddddddd	ddddddddddi ddd d!d"d#d$d%d&d'd(dd)dd*d+d,d-d.d/d0d1d2d3d4d5d6d7d8dd9d:d;d+i d<d=d>d?d@dAdBdCdDdEdFddGdHdIdJdKdLdMdNdOdPdQdRdSdEdTddUdVdWdXdYdZd[d\d]dEdd^d_d`dadbdcdddde}g df}i }t |t|t|D ]w\}}}t |t||D ]i\}}}	| j|||	|||dgP tdhtjdi}
|
|dj|djf |
|	 tdhtjdi}||dj||f ||
dk |||f|||	ff}|	dl||< | 
|| ||  W dm   n	1 s0w   Y  qq| 
|| dmS )nzdoes the SDL 1 style blitter in pygame 2 work with set_alpha(),
        this feature only exists in pygame 2/SDL2 SDL1 did not support
        combining surface and pixel alphar  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r%  r&  r'  r(  r)  r*  r,  r-  r.  r/  r1  r2  r3  r6  r7  r:  r;  r<  r=  r>  r?  r@  rA  rB  rD  rE  rF  rG  rH  rK  rL  rM  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  r`  r=   r%   r#   ra  N)rd  re  rf  r   r   r   rK   r   r   r(   r   rg  r   r   r    &test_sdl1_mimic_blitter_with_set_alphau  s  	
 !"#$%&'()*+,-./01234D
z:GeneralSurfaceTests.test_sdl1_mimic_blitter_with_set_alphaarmaarch64z.sdl2 blitter produces different results on armc                 C   s  i ddddddddd	d
dddddddddddddddd
ddddddddi dd d!d"d#d$d%d&d'd(d)dd*dd+d,d-d.d/d0d1d2d3d4d5d6d7dd8dd9d:d;d<i d=d>d?d2d@d4dAd6dBddCddDdEdFdGdHdIdJdKdLdMdNdOdPddQddRdSdTdUdVdWdXdYdZddd[d\d]d^dYdZddd_}g d`}i }t |t|t|D ]\}}}t |t||D ]w\}}}	| j|||	|||da^ tdbtjdc}
|
|dd||	f tdbtjdc}||dd||f |j|
detjdf |||f|||	ff}t	|
dg||< tdhD ]}| j|| | || | dhdi qW dj   n	1 s>w   Y  qqdjS )kz`Checking that the BLEND_ALPHA_SDL2 flag works - this feature
        only exists when using SDL2r  r  r  )r   r  r  r  r  )r	   r     r  r  )r  r  r  r  r  )rw  r  r5  r  r  )   r  i   r  r  )   r  r   r  r  r  r  r  r  )r   r  r  r  r  )r	   r  ry  r  r  )r  r  r5  r  r  r  r  r  r  r  r  )rd  r     r  r  )rd  r  r     r  )^   r        r  )r  r     r  r   )   r  ]   r  r  r  r  r  r	  )r  r  r  r  r  )m   r        r  )r  r  r     r  )r  r  r  r5  r  )   r  M   r  r  r  r  r  r  )r  r  r  r  r   )r  r        r%  r'  r)  r,  r.  r/  r1  r2  )r  r  rd  rd  r6  )r  r  b   p   r:  )r  r  r  r  r<  )r  r  r  r  r>  )r  r  rd  rN  r@  rA  rB  rD  rE  )r  r  r   r   rG  )rs  r  r   rd  )r5  r  r  r  )r  r  r  r  )   r  r   r4  )r%   r%   r   r   )r  r  r   r   )   r  r   rd  )r  r  r  r  rW  rX  rY  r`  r=   r%   r#   r   ra  rq   r   N)rd  re  rf  r   r   r   rK   r   BLEND_ALPHA_SDL2r   r(   r   r   )r   rh  ri  rj  rk  rl  rm  rZ  r[  r\  rn  ro  rp  r  r   r   r    test_src_alpha_sdl2_blitter  s&  	
 !"#$%&'()*+,-./01234D
z/GeneralSurfaceTests.test_src_alpha_sdl2_blitterc                 C   s~   t dt jd}|d t d}|d ||d |d}|d |d ||d |d}| || d S )Nr   r=   )r%   r%   r%   ra   )rG   rG   rG   r#   ra   )r   r   r   rK   r   r(   r   r   )r   rn  ro  no_surf_alpha_colsurf_alpha_colr   r   r    +test_opaque_destination_blit_with_set_alphaA  s   






z?GeneralSurfaceTests.test_opaque_destination_blit_with_set_alphac                 C   s   |    d S r   )r  r   r   r   r    todo_test_convertT  s   z%GeneralSurfaceTests.todo_test_convertc                 C   s   d}t |dd}t ddd}tj  z.||}| || | || | |tj | |t  | |	 | W tj
  dS tj
  w )z3Ensure convert accepts a Surface subclass argument.r7  r  r   r=   )rp   =   N)r   r   r)   rR   r   r   r   r   r   r   rX   r   r   convert_surfacer   r   r   r   r    .test_convert__pixel_format_as_surface_subclassp  s   

zBGeneralSurfaceTests.test_convert__pixel_format_as_surface_subclassc                 C   s
  t j  zt jd t ddd}t j|}t ddd}| }t ddd}| }t ddd}| }t ddd}	|	 }
t ddd}| }t ddd	}| }| | d
 | | d
 | | d
 | | d
 | |
 d
 | | d
 | | d
 | | d | | d | | d | | d | |
 d | | d | | d | 	t j
 t j }t j  |  W d   n1 sw   Y  W t j  dS W t j  dS t j  w )zPEnsure the surface returned by surf.convert_alpha
        has alpha values addedr   rF   r   r=   rr   r   r   r	   rH   r%   N)r   r)   rR   r*   r   r  r   r   r   rZ   r   rX   )r   r   r  r   s2_alphas3s3_alphas4s4_alphas5s5_alphas6s6_alphas7s7_alphar   r   r   r    test_convert_alpha  sN   



z&GeneralSurfaceTests.test_convert_alphac                 C   s   d}t |td}t dtd}tj  z4tjd ||}| || | || | |tj	 | |t  | 
| | W tj  dS tj  w )z9Ensure convert_alpha accepts a Surface subclass argument.r  r=   )rp   9   rn   N)r   r   r   r)   rR   r*   r  r   r   r   r   r   rX   r  r   r   r    4test_convert_alpha__pixel_format_as_surface_subclass  s   

zHGeneralSurfaceTests.test_convert_alpha__pixel_format_as_surface_subclassc                 C   s*  t j  zt dtd}|dd}|dd}|dd}|d	d
}|dd}| | d | | d | | d | | d | | d | | d | t j	 t j
 }t j  |  W d    n1 szw   Y  W t j  d S W t j  d S t j  w )Nrc  r=   rE  )"   r   r#   )rk   rl   )r   r   )r"   r   )   rJ   )   r  r   r  r   rq   )r   	   )r   r1   r   )r   r)   rR   r   r   r   r   get_abs_offsetrZ   r   r*   rX   )r   r   sub_level_1sub_level_2sub_level_3sub_level_4sub_level_5r   r   r   r    test_get_abs_offset  s,   



z'GeneralSurfaceTests.test_get_abs_offsetc           	      C   s  t j  zt dtd}|dd}|dd}|dd}|dd}|dd	}|d
d}| t|jdd | t|jd
d | t|jd
d | |	 | | |	 |
  | |	 | | |	 | | |	 | | |	 | | |	 |
 	  | t j t j }t j  |	  W d    n1 sw   Y  W t j  d S W t j  d S t j  w )Nr   r=   r   )r   r   )r   r   r  r  )rr   rr   rE  r  r#   r2   rJ   r   r   rF   )r   r   )r   r)   rR   r   r   r   rZ   r[   r   get_abs_parentr   r   r*   rX   )	r   r   r  r  r  r  r  sub_level_6r   r   r   r    test_get_abs_parent  s:   



z'GeneralSurfaceTests.test_get_abs_parentc                 C   s   t ddd}t ddd}t ddd	}t d
dd}t ddd}|d| |d| |d| |d| |d}| |t j | || | |d| | |d| | |d| dD ]
}| t|j| qjd S )NrE  r   rH   rJ   r2   r   r   r1   r   rG   r   rq   r  r#   )r   rJ   rJ   r   r   ))rr  r   )r   rr  )r2   r   r   r2   )	r   r   rM   rL   r(   r   r   rZ   
IndexError)r   r,   c00c01c10c11r   pr   r   r    test_get_at  s$   
zGeneralSurfaceTests.test_get_atc              
   C   sb   t ddd}dD ]%}t dd|}|| |d}| |||d||||f  q	d S )	Nr1   r"   rk   r$  rE  r   r#   z%i != %i, bitsize: %i)r   rM   r   rK   get_at_mappedr   map_rgb)r   r   r'  r,   pixelr   r   r    test_get_at_mapped%  s   

z&GeneralSurfaceTests.test_get_at_mappedc                 C   sf  t j  zd}d}t |t j|}| | | | | | d}t |t j|}| | | | | | d}t |d|}| | | | | | d}| t	t j|d| d}| t	t j|d| d}| t	t j|d| | t j
 t j }t j  |  W d    n1 sw   Y  W t j  d S W t j  d S t j  w )	Nr   r=   r	   r   r   rr  r      )r   r)   rR   r   r   r   r   r   rZ   r[   r   r*   rX   )r   r   r   r   r   r   r    test_get_bitsize1  sF   



z$GeneralSurfaceTests.test_get_bitsizec                 C   s"   t d}| }| |d d S )Nr.   )r   r   r/   r0   )r   r   r6   r   )r   r7   	rectangler   r   r    test_get_clipZ  s   
z!GeneralSurfaceTests.test_get_clipc                 C   s  t j  zt ddd}| |  |d  | |  d\}}}}t |||}|| | | |||df ||t j	 | | |||df |t |d |d |d  | 
| |||df |t |||| | | |||df W t jddd}t j  | t j |  W d    d S 1 sw   Y  d S t jddd}t j  | t j |  W d    w 1 sw   Y  w )Nr.   r   r=   )r"   rQ   ro   r   r%   rJ   r   )r   r)   rR   r   assertIsNoner   rz   rM   r   r   r   r*   rX   rZ   r   )r   r7   r8   r   r   r  r9  r   r   r    test_get_colorkey_  s4   


 

"

z%GeneralSurfaceTests.test_get_colorkeyc                 C   s8   d}|D ]\}}t ||f}| }| || qd S )N)r   r{  r1   )r1   r{  )rJ     )r  rJ   r  r  )r   r   ry   r   )r   sizesrt   ru   r,   found_heightr   r   r    test_get_height  s   z#GeneralSurfaceTests.test_get_heightc                 C   sb  dd }t d}| | || |  | | || |  | | || t d}|  |  | | || |  | | || |  | | || t d}tdD ]}|  qk| | || tdD ]}|  q| |  t d}|  | | || |  | | || d S )Nc                 S   s4   t d}z	|| d W dS  t jy   Y dS w )NrP   r#   TF)r   r   r   r   )r   newSurfr   r   r    blit_locked_test  s   
z=GeneralSurfaceTests.test_get_locked.<locals>.blit_locked_testrF   r  )r   r   r   r  lockunlockr   r   )r   r  r,   r  r   r   r    test_get_locked  s6   
	




z#GeneralSurfaceTests.test_get_lockedc                 C   s  t d}| | d |  | | |f |  | | d t |}| | d |  | | d | 	t
 d  W d    n1 sSw   Y  |  |  |  | | |||f |  |  | | |f |  | | d d S )NrF   r   DUMMY)r   r   r   	get_locksr  r  
PixelArrayr   closerZ   AttributeError)r   r   pxarrayr   r   r    test_get_locks  s,   
	

z"GeneralSurfaceTests.test_get_locksc                 C   s  t j  zd}d}d}d}d}t jd}t d}t jdd|d}t jdd	|d}	t jdd
|d}
t jdd|d}t jdd|d}| }| |t | t	|d |D ]}| |t
 | |d | |d qW| dkry| |d n| dkr| |d | | d | |	 d | |
 d | | d | | d | t j t jd}t j  |  W d   n1 sw   Y  W t j  dS W t j  dS t j  w )z*Ensure a surface's losses can be retrieved)      r   r   i |  i  rp   r   i   i  rp   r   rg   rh   r%   r   )rf   rg   rh   r%   rF   rr   )rA   rd   r   r	   rH   r=   rq   r   )r   r   r   rr   )rr   rr   rr   rr   )r   r   r  rr   )r   r   r   rr   )r   r2   r   rr   rj   N)r   r)   rR   r*   r   
get_lossesr   r   r   lenintassertGreaterEqualassertLessEqualrZ   r   rX   )r   mask8mask15mask16mask24mask32display_surfr,   	surf_8bit
surf_15bit
surf_16bit
surf_24bit
surf_32bitlosseslossr   r   r   r    test_get_losses  sL   



z#GeneralSurfaceTests.test_get_lossesc                 C   sL   ddg}ddg}t t||D ]\}}tdtj|}| ||  qdS )z<
        Ensure that get_mask can return RGBA mask.
        )   r  r   i   )rg   rh   r%   rf   r	   r=   rP   N)listrd  r   r   r   r   r=  r   rd   depthsexpectedrA   r   r   r   r    test_get_masks__rgba  s   z(GeneralSurfaceTests.test_get_masks__rgbac                 C   sV   g d}g d}t t||D ]\}}tdd|}|dkr d}| ||  qdS )z;
        Ensure that get_mask can return RGB mask.
        ))r  r  r   r   )r  r  r   r   r  r  r  r  )rr   r   r   r	   rH   r=   rP   r   rr   rj   N)r  rd  r   r   r   r=  r  r   r   r    test_get_masks__rgb%  s   z'GeneralSurfaceTests.test_get_masks__rgbc                 C   sP   |  tj tjd}tj  |  W d   dS 1 s!w   Y  dS )zX
        Ensure that after display.quit, calling get_masks raises pygame.error.
        rP   N)rZ   r   r   r)   r*   rX   r=  )r   r   r   r   r    test_get_masks__no_surface8  s
   

"z.GeneralSurfaceTests.test_get_masks__no_surfacec                 C   s   t j  zQt d}| | d |dddd}| | d | t j t j	 }t j
  |  W d   n1 sBw   Y  W t j
  dS W t j
  dS t j
  w )zget_offset returns the (0,0) if surface is not a child
        returns the position of child subsurface inside of parent
        rF   r#   rJ   r1   r   N)r   r)   rR   r   r   
get_offsetr   rZ   r   r*   rX   )r   r,   subsurfr   r   r   r    test_get_offsetA  s   




z#GeneralSurfaceTests.test_get_offsetc                 C   s   dd t dD }tddd}|| | }| t|t| t||D ]
\}}| || q(|D ]	}| |tj	 q5d S )Nc                 S   s   g | ]}t |||qS r   )rM   rj  r  r   r   r    rl  V      z8GeneralSurfaceTests.test_get_palette.<locals>.<listcomp>rb  rE  r   rr   )
r   r   r   set_paletter  r   r  rd  r   rM   )r   paletter,   palette2r   r   r   r   r    test_get_paletteU  s   
z$GeneralSurfaceTests.test_get_palettec                 C   sr   t ddd}t dddd}|d| |d}| |t j | || | t|jd | t|jd	 d S )
NrE  r   rr   rJ   r2   r   r%   rr  rb  )	r   r   rM   set_palette_atr  r   r   rZ   r  )r   r,   r   r   r   r   r    test_get_palette_ata  s   
z'GeneralSurfaceTests.test_get_palette_atc                 C   s   d}g d}|D ]m\}}|D ]f}t j||f|d}| }|j|  }| }	| ||	 | }
||
}| }|j|  }| }| || |
	| d | d }||}| }|jt
|  }| }| || qqd S )N)rE  )r   rb  )rb  r   )r2     )r  r2   )r  r  rr   rH   r=   rB   r2   )r   r   r&  r  ry   r%  r   r   r   inflatefloat)r   r  r  rt   ru   rA   r,   buffpitch
test_pitchrect1subsurf1	sub_buff1
sub_pitch1test_sub_pitch1rect2subsurf2	sub_buff2
sub_pitch2test_sub_pitch2r   r   r    test_get_pitchl  s.   

z"GeneralSurfaceTests.test_get_pitchc                 C   s|   g d}d}d}|D ]1}t jd|d}|| | \}}}}	|| | \}
}}}| ||||	f|
|||f q
dS )zo
        Tests whether Surface.get_shifts returns proper
        RGBA shifts under various conditions.
        r  r6  Nr   rB   )r   r   r   rB  r   )r   r  r   off	bit_depthr   r   g1b1a1r   g2b2a2r   r   r    test_get_shifts  s   

z#GeneralSurfaceTests.test_get_shiftsc                 C   s<   d}|D ]\}}t ||f}| }| ||f| qd S )N)r   r  r  )rJ   i  )i  rJ   )rO  i  )r   r   r   r   )r   r  rt   ru   r,   
found_sizer   r   r    test_get_size  s   z!GeneralSurfaceTests.test_get_sizec                 C   s   t d}|  | |  t d}|  |  |  | |  |  |  |  | |  |  | |  |  | |  t d}|  |  | |  |  | |  |  | |  d S NrF   )r   r   r  r   r  r  r   r+   r   r   r    	test_lock  s0   


zGeneralSurfaceTests.test_lockc                 C   s   t dddd}tdtd}||}| ||| | |dd || | |d| |d | |dd |	d| | |d| d S )	Nr   r6  r%   rd  r  r=   r#   rj   )
rM   r   r   r   r  r   	unmap_rgbr(   rK   rL   )r   r   r,   r   r   r   r    test_map_rgb  s   


z GeneralSurfaceTests.test_map_rgbc                 C   s   t d}|d}| |  | |  d}g }|| || |D ]}||d | | |d   | |d   q(d S )N)r  r  )r   r   r  r  ))r   r      r8  )r   r   rb  rb  )r   r   r6  r6  rr  )r   r   r   r   r   r   append)r   r,   r  rects
surf_stackr   r   r   r    test_mustlock  s   



z!GeneralSurfaceTests.test_mustlockc                 C   sr   t dtd}|d |d | d|  t dtd}|d ||d | |dd dd dS )	z&surf.set_alpha(None) disables blendingr   r=   r   r%   r   r6  Nr%   r   r   r%   r#   r   zthe red component should be 0)	r   r   r   rK   r   r   r   r   r(   r   r7   r   r   r   r    test_set_alpha_none  s   


z'GeneralSurfaceTests.test_set_alpha_nonec                 C   sb   t dtd}|d |d t dtd}|d ||d | |dd dd d	S )
z4surf.set_alpha(x), where x != None, enables blendingr   r=   r>  r%   r?  r#   r   z#the red component should be above 0N)r   r   r   rK   r   r   assertGreaterr(   r@  r   r   r    test_set_alpha_value	  s   


z(GeneralSurfaceTests.test_set_alpha_valuec                 C   s@   t jttjdd}| }| |	 |
| | dS )zbtest bug discovered by robertpfeiffer
        https://github.com/pygame/pygame/issues/721
        rO   
alien2.pngN)r   rS   rT   r   rU   rV   rW   r   r   r  r  r   r,   rp  r   r   r    test_palette_colorkey	  s   z)GeneralSurfaceTests.test_palette_colorkeyc                 C   sD   t jttjdd}| }|d| | 	|
d| d S NrO   rD  r#   )r   rS   rT   r   rU   rV   rW   r   rL   r   r(   rE  r   r   r    test_palette_colorkey_set_px 	  s   z0GeneralSurfaceTests.test_palette_colorkey_set_pxc                 C   sB   t jttjdd}| }|| | 	|
d| d S rG  )r   rS   rT   r   rU   rV   rW   r   rK   r   r(   rE  r   r   r    test_palette_colorkey_fill&	  s   
z.GeneralSurfaceTests.test_palette_colorkey_fillc              	   C   sh  dd t dD }t|d |d< t|d dd |d< tddd	}|| t dD ]'}| ||| |d
|f  || }|| | |d|d
|f  q-t dD ]}t	d| dd||< qY||dd  t dD ]'}| ||| |d
|f  || }|| | |d|d
|f  qt| 
t|jt	ddddg | 
t|jd d S )Nc                 S   s   g | ]	}t |||qS r   )r   rM   r  r   r   r    rl  -	  s    z8GeneralSurfaceTests.test_set_palette.<locals>.<listcomp>rb  r1   r   r   r   rE  rr   zpalette color %ir#   r%   rJ   r2   r  )rJ   r2   r   r  )r   r   r   r   r  r   r  rK   r(   rM   rZ   r[   )r   r  r,   r  r   r   r   r    test_set_palette,	  s(   


z$GeneralSurfaceTests.test_set_palettec                 C   s.   ddg }t ddd}| t j|j| d S )Nrb  r1   r"   rk   rE  r   r=   )r   r   rZ   r   r  )r   r  r,   r   r   r    test_set_palette__failC	  s   
z*GeneralSurfaceTests.test_set_palette__failc                 C   s^   t jddd}ddg }d|d< || |dd	 | |dd
 | |dd d S )NrE  rr   rB   rb  rK  )r   rQ   rk   rJ   r#   )ro   r   rQ   )r   rQ   rk   r%   r  )r1   r"   rk   r%   )r   r   r  rL   r   r(   r   r,   r  r   r   r    test_set_palette__set_atH	  s   

z,GeneralSurfaceTests.test_set_palette__set_atc                 C   s   t ddd}|d}tdddd}||krtdddd}|d| | |d| t|}|d| | |d| t|dd }|d| | |d| | t|jd	| | t|jd
| d S )NrE  r   rr   r1   rJ   r%   r2   r   rb  rr  )	r   r   r  rM   r  r   r   rZ   r  )r   r,   originalreplacementnextr   r   r    test_set_palette_atT	  s   
z'GeneralSurfaceTests.test_set_palette_atc                 C   s   t d}|dddd}|d}| t|jd | | |  | | |  | | |  t j	t j}| t j
|jd d S )Nr   r   rJ   )r   r   rJ   rJ   )r   r   rJ   rJ   i  rj   )r   r   r   rZ   r[   r   rB  r=  r  __new__r   )r   r,   r7   r   r   r    test_subsurfacee	  s   

z#GeneralSurfaceTests.test_subsurfacec                 C   s   t d}|  |  | |  t d}|  |  |  | |  |  | |  t d}|  | |  |  | |  t d}|  |  | |  |  |  | |  d S r4  )r   r   r  r  r   r  r   r+   r   r   r    test_unlock	  s.   



zGeneralSurfaceTests.test_unlockc           	   
   C   s   t ddd}d}d}||| ||}| || | |t j d}ddd	td
ftdfg}|D ]1\}}t d||}|||}|	| |
d}| ||d||||f  | |t j q2d S )NrE  r   rr   )rJ   rJ   rJ   C   )r6  rd  r   r%   )r   r	   )r   rH   )r   r=   r	   r=   r#   z %s != %s, flags: %i, bitsize: %i)r   r   r  r6  r   r   rM   r   r  rK   r(   )	r   r,   r   r  
unmapped_cformatsr@   r'  comparison_cr   r   r    test_unmap_rgb	  s.   



z"GeneralSurfaceTests.test_unmap_rgbc                 C   sh  g d}|D ]v\}}}t dd|}|d |dd | }||||f ||| | \}}t|D ]B}	t|D ];}
| j|	|
d* | 	|
|	|
f|
|	|
fd|
|	|
f|
|	|
f|||f  W d    n1 suw   Y  q?q9qt d	dd
}|d |dd | }tdddd}|| || |||jd |jd f|  |dd | \}}t|D ]}	t|D ]}
| 	|
|	|
f|
|	|
f qqd}t dt jd
}|d |d| |jdd | 	|
d| |jdd | 	|
d| |jddd | 	|
d| |jddd | 	|
d| d S )N))rr   r2   r   )r	   r2   r   )rH   r2   r   )r=   r2   r   )r=   rr  r   )r=   r   r   )r=   r   r   )r=   r   r   )r=   r   )r=   r   r[  )r=   r[  r2   )r=   r2   r[  rP   r   rI  rJ  r}  )rk  r  z %s != %s, bpp:, %i, x: %i, y: %i)r"   r
   r=   )r   rJ   r  r  r   rJ   rr   r  r2   r>  r   r?  r   )dxr  )dyrE  )r]  r\  r  r   )r\  r]  r#   )r   r   rK   r   r   scrollr   r   rf  r   r(   r3   r4   rk  r  r6   r   rL   )r   scrollsr'  r\  r]  r,   compr   r   rk  r  clip
spot_colorr   r   r    test_scroll	  sl   



""
zGeneralSurfaceTests.test_scrollN)<rV  rW  rX  rY  rZ  rU   r[  r\  r  r  r  r  r  rq  r~  r  platformmachiner  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r(  r1  r3  r5  r7  r=  rA  rC  rF  rH  rI  rJ  rL  rN  rR  rT  rU  rZ  rc  r   r   r   r    r  (  s    


oob
f4 &)&.,2	:( r  c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )SurfaceSubtypeTestzAIssue #280: Methods that return a new Surface preserve subclassesc                 C      t j  d S r   r   r)   rR   r   r   r   r    rg  
     zSurfaceSubtypeTest.setUpc                 C   rg  r   r   r)   rX   r   r   r   r    tearDown
  ri  zSurfaceSubtypeTest.tearDownc                 C   s   d}t |td}| }| || | |tj | |tj | |t  | |t  | |j | 	t
t|d | | | dS )a   Ensure method copy() preserves the surface's class

        When Surface is subclassed, the inherited copy() method will return
        instances of the subclass. Non Surface fields are uncopied, however.
        This includes instance attributes.
        r   r=   test_attributeN)r   r   r   r   r   r   r   r   rl  rZ   r  getattrr   r   r   r   ms1ms2r   r   r    r   
  s   zSurfaceSubtypeTest.test_copyc                 C   s   d}t |dd}|d}| || | |tj | |tj | |t  | |t  | |j | t	t
|d | | | dS )a  Ensure method convert() preserves the surface's class

        When Surface is subclassed, the inherited convert() method will return
        instances of the subclass. Non Surface fields are omitted, however.
        This includes instance attributes.
        r   r   rH   rl  N)r   r   r   r   r   r   r   rl  rZ   r  rm  r   r   rn  r   r   r    test_convert)
  s   
zSurfaceSubtypeTest.test_convertc                 C   s   t jd d}t |td}t|td}||}| || | |t j | |t j | |t | |t | 	|j
 | tt|d | | | dS )a  Ensure method convert_alpha() preserves the surface's class

        When Surface is subclassed, the inherited convert_alpha() method will
        return instances of the subclass. Non Surface fields are omitted,
        however. This includes instance attributes.
        )rQ   rQ   r   r	   r=   rl  N)r   r)   r*   r   r   r   r  r   r   r   rl  rZ   r  rm  r   r   )r   r   r7   ro  rp  r   r   r    r  =
  s   
z%SurfaceSubtypeTest.test_convert_alphac                 C   s   d}t dtd}|d|}| || | |tj | |tj | |t  | |t  | |j | 	t
t|d | | | dS )a  Ensure method subsurface() preserves the surface's class

        When Surface is subclassed, the inherited subsurface() method will
        return instances of the subclass. Non Surface fields are uncopied,
        however. This includes instance attributes.
        r1   r   r   r=   rq   r   rl  N)r   r   r   r   r   r   r   r   rl  rZ   r  rm  r   r   rn  r   r   r    rT  S
  s   z"SurfaceSubtypeTest.test_subsurfaceN)
rV  rW  rX  r  rg  rk  r   rq  r  rT  r   r   r   r    rf  
  s    rf  c                   @   s  e Zd Zze W n ey   dZY nw e ejkZ	dd Z
dd Zdd Zdd	 Zd
d Zdd Zdd Zeej ddd Zeej ddd Zeej ddd Zeej ddd Zeej ddd Zeej ddd ZdS )SurfaceGetBufferTest)ignoresubprocess_ignorec           
      C   s   |  \}}| }| }|j}|d}ts~ttB tB }| || kr*|t	O }t
|}	| |	jd | |	jd | |	jd | |	j| | |	jd | | |	jd | | |	jd | | |	jd | | |	j| | |	j| d S d S )Nr   r2   ur   rJ   )r   rC   r%  r-  r  r  PAI_ALIGNEDPAI_NOTSWAPPEDPAI_WRITEABLEPAI_FORTRANr  r   twor  typekinditemsizeshapestridesr@   rO   )
r   r7   s_ws_h
s_bytesizes_pitchs_pixelsr  r@   interr   r   r    _check_interface_2Dr
  s*   
z(SurfaceGetBufferTest._check_interface_2Dc                 C   s  |  \}}| }| }|j}t| }|dd g dkr0| jr)d}d}	nT|d }d}	nM|dd g dkrI| jrBd}d}	n;|d }d}	n4|dd g dkrb| jr[d}d}	n"|d }d}	n|dd g d	kr{| jrtd}d}	n	|d
 }d}	nd S |d}
tst	|
}t
tB tB }| |jd | |jd | |jd | |jd | |jd | | |jd | | |jd d | |jd | | |jd | | |jd |	 | |j| | |j||  d S d S )Nr   r   )r   rr   r	   rJ   rr  )rr   r	   rH   r2   )r	   rr   r   )rH   r	   rr   rq   r  rw  )r   rC   r%  r-  r  rB  	lilendianr  r  r  rx  ry  rz  r   r|  r  r}  r~  r  r  r@   rO   )r   r7   r  r  r  r  r  s_shiftsoffsetstepr  r  r@   r   r   r    _check_interface_3D
  s^   
z(SurfaceGetBufferTest._check_interface_3Dc                 C   s.  |  \}}| }| }|j}| }| }	|	| sd S || }
|
d }| js0|| d }|d| }tst	|}t
tB tB }| |jd | |jd | |jd | |jd | |jd | | |jd | | |jd | | |jd | | |j| | |j||  d S d S )Nrr   rJ   rgbar2   rw  r   )r   rC   r%  r-  rB  r=  r  r  r  r  rx  ry  rz  r   r|  r  r}  r~  r  r  r@   rO   )r   r7   planer  r  r  r  r  r  s_masksalpha_shiftr  r  r  r@   r   r   r    _check_interface_rgba
  s6   z*SurfaceGetBufferTest._check_interface_rgbac                 C   s   |  tddd |  tddd |  tdtjd | tddd | tddd |  tddd | tddd |  tdtjd | tdtjd d S )Nr   r   rr   r	   rH   )rr   rq   r=   )r  r   r   r   r  r   r   r   r    test_array_interface
  s   z)SurfaceGetBufferTest.test_array_interfacec                 C   s  d}t |dd}t| }g d}|dd |ks(|dd |ddd kr@|ddd |dd	  }| t |dd| t |dd
}t| }g d}|dd |ksf|dd |ddd kr~|ddd |dd	  }| t |dd
| g d}| t |dd| dS )z.Test non-default color byte orders on 3D viewsr   r   r=   )r%   rh   rg   r   Nrr  r2   rq   rH   )rh   rg   rf   r   )r   r   r  r=  r  )r   szr7   r  rd   r   r   r    test_array_interface_masks
  s   **z/SurfaceGetBufferTest.test_array_interface_masksc                 C   sR   g dg dg dg dfD ]}dd |D }t dt jd|}| |d	 qd S )
Nr   rr   r	   rH   rr   r	   rH   r   rH   r	   rr   r   r	   rr   r   rH   c                 S      g | ]}d |> qS r%   r   rj  r7   r   r   r    rl    rm  zCSurfaceGetBufferTest.test_array_interface_alpha.<locals>.<listcomp>rq   r2   r=   r   )r   r   r   r  )r   shiftsrd   r7   r   r   r    test_array_interface_alpha  s
    z/SurfaceGetBufferTest.test_array_interface_alphac                 C   s~   g dg dg dg dfD ].}dd |D }d|d< t dD ]}td	dd
}| || td	dd}| || qqd S )Nr  r  r  r  c                 S   r  r  r   r  r   r   r    rl    rm  zASurfaceGetBufferTest.test_array_interface_rgb.<locals>.<listcomp>r   r   r  rH   r=   )r   r   r   r  )r   r  rd   r  r7   r   r   r    test_array_interface_rgb  s    z-SurfaceGetBufferTest.test_array_interface_rgbznewbuf not implementedc                 C   s
  ddl m} |j}tddd}| }|||j}| |jd | 	|j
d u  | |j|j | |jd | 	|jd u  | 	|jd u  | 	|jd u  | |j | |j|j |||j}| |jd | 	|j
d u  | |j |||j}| |jd | |j
d |||j}| |jd | 	|j
d u  | |j|j | |jd | |j|jf | 	|jd u  | 	|jd u  | |j | |j|j |||j}| |jd | 	|j
d u  | |jd |d}| }|||j}| |jd | 	|j
d u  | |j|j | |jd | 	|jd u  | 	|jd u  | 	|jd u  | |j | |j|j |||j}| |jd | |jd |||j}| |jd | |jd |||j}| |jd | |jd d S )	Nr   buftoolsr1   r  r=   rJ   r  )rJ   rJ   rJ   r   rq   )pygame.tests.test_utilsr  Importerr   r   r&  PyBUF_SIMPLEr   ndimr   formatr  r  r~  r  r  
suboffsetsr   readonlybufr-  PyBUF_WRITABLEPyBUF_FORMATPyBUF_NDPyBUF_STRIDESr   PyBUF_C_CONTIGUOUSPyBUF_F_CONTIGUOUSPyBUF_ANY_CONTIGUOUSr   r  r  r7   r  r   r   r   r   r    test_newbuf_PyBUF_flags_bytes  sp   
z2SurfaceGetBufferTest.test_newbuf_PyBUF_flags_bytesc                 C   s   ddl m} |j}tddd}|d}|||j}| |jd | 	|j
d u  | |j|j | |jd | 	|jd u  | 	|jd u  | 	|jd u  | |j | |j|j d S )Nr   r  r  r=   r   rJ   )r  r  r  r   r   r  r  r   r  r   r  r  r  r~  r  r  r  r   r  r  r-  r   r  r  r7   r  r   r   r   r    test_newbuf_PyBUF_flags_0DY  s   
z/SurfaceGetBufferTest.test_newbuf_PyBUF_flags_0Dc                 C   s  ddl m} |j}tddd}|d}|||j}| |jd | 	|j
d u  | |j|j | |j|  | 	|jd u  | 	|jd u  | 	|jd u  | |j | |j|j |||j}| |jd | 	|j
d u  | |j |||j}| |jd | |j
d |||j}| |jd | 	|j
d u  | |j|j | |j|  | |j| |  f | 	|jd u  | 	|jd u  | |j | |j|j |||j}| |jd | 	|j
d u  | |j| f d S )Nr   r  r  r=   r  =IrJ   )r  r  r  r   r   r  r  r   r  r   r  r  r  r~  rC   r  r  r  r   r  r  r-  r  r  r  rx   ry   r  r  r   r   r    test_newbuf_PyBUF_flags_1Dm  sF   
z/SurfaceGetBufferTest.test_newbuf_PyBUF_flags_1Dc                 C   s  ddl m} |j}tddd}|d}|||j}| |jd | 	|j
d u  | |j|j | |j|  | 	|jd u  | 	|jd u  | 	|jd u  | |j | |j|j |||j}| |jd | 	|j
d u  | |j|j | |j|  | |j|  | |j| | f | 	|jd u  | |j | |j|j |||j}| |jd | |j
d | |j| | f |||j}| |jd | |j
d | |j| | f |||j}| |jd | |j
d  | |j| | f |||j}| |jd | |j
d  | |j| | f | t|||j | t|||j  |!d}|d}|||j}| |jd | 	|j
d u  | |j|j | |j|  | |j|  | |j| | f | 	|jd u  | |j | |j|j |||j}| |jd | |j
d | t|||j | t|||j" | t|||j# | t|||j | t|||j  | t|||j | t|||j d S )	Nr   r  r  r=   r   r2   r  r  )$r  r  r  r   r   r  r  r   r  r   r  r  r  r~  rC   r  r  r  r   r  r  r-  r  r   r%  PyBUF_RECORDS_ROPyBUF_RECORDSr  r  rZ   BufferErrorr  r  r   r  r  r  r   r   r    test_newbuf_PyBUF_flags_2D  s   


z/SurfaceGetBufferTest.test_newbuf_PyBUF_flags_2Dc                 C   s  ddl m} |j}tddd}| \}}}}| jr)|dkr$d}d}	nd}d}	n|d	kr2d}d}	nd}d}	|d
}
||
|j}|	 \}}||df}d|
 |f}| |jd | |jd u  | |j|
j | |jd | |j| | |j| | |jd u  | |j | |j|j|	  ||
|j}| |jd | |jd | |j| ||
|j}| |jd | |jd | |j| | t||
|j | t||
|j | t||
|j | t||
|j  | t||
|j! | t||
|j" | t||
|j# d S )Nr   r  r   r  rH   r%   rJ   rr  r2   rg   r  r   r  )$r  r  r  r   r   r=  r  r  r  r   r%  r   r  r   r  r  r  r~  r  r  r  r   r  r  r-  r  r  rZ   r  r  r  r  r  r  r  r  )r   r  r  r7   rmaskgmaskbmaskamask
color_stepaddr_offsetr  r   r   r   r  r  r   r   r    test_newbuf_PyBUF_flags_3D  sX   

z/SurfaceGetBufferTest.test_newbuf_PyBUF_flags_3Dc                 C   s  ddl m} |j}tddd}| \}}}}| jr%|dkr"d}nd}n	|dkr,d}nd}|d}	||	|j}
|	 \}}||f}|
 | f}| |
jd | |
jd u  | |
j|	j | |
jd	 | |
j| | |
j| | |
jd u  | |
j | |
j|j|  ||	|j}
| |
jd | |
jd
 | |
j| ||	|j}
| |
jd | |
jd
 | |
j| | t||	|j | t||	|j | t||	|j  | t||	|j! | t||	|j" | t||	|j# | t||	|j$ d S )Nr   r  r  rH   r%   r2   rg   r  rJ   r  )%r  r  r  r   r   r=  r  r  r  r   rC   r%  r   r  r   r  r  r  r~  r  r  r  r   r  r  r-  r  r  rZ   r  r  r  r  r  r  r  r  )r   r  r  r7   r  r  r  r  r  r  r   r   r   r  r  r   r   r    test_newbuf_PyBUF_flags_rgba  sP   
z1SurfaceGetBufferTest.test_newbuf_PyBUF_flags_rgbaN)rV  rW  rX  r  	NameError__tags__r   get_sdl_byteorder
LIL_ENDIANr  r  r  r  r  r  r  r  rY  rZ  HAVE_NEWBUFr  r  r  r  r  r  r   r   r   r    rt  h
  s4    A 

;

&
F
2rt  c                   @   s   e Zd Zdd Zdd Zg dZdZg dZd#d
dZd$ddZ	d#ddZ
d%ddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd	S )&SurfaceBlendTestc                 C   rg  r   rh  r   r   r   r    rg  A     zSurfaceBlendTest.setUpc                 C   rg  r   rj  r   r   r   r    rk  E  ri  zSurfaceBlendTest.tearDown)r$   )r1   rk   ro   r   )r~   K   rG   r6  )ra      rG   ra   )r   rG   ra   r%   rr  ))r#   rJ   )rs  rJ   ))r  r   r2   )r  r2   ))r   r   r   ))rq   r  r   ))r  r   rq   )r  rq   FNc                 C   sN   |d u r| j }d}|r|tO }t| j||}|dkr%|dd |D  |S )Nr   rr   c                 S      g | ]}|d d qS Nr   r   rj  r   r   r   r    rl  c  r  z2SurfaceBlendTest._make_surface.<locals>.<listcomp>)_test_paletter   r   r   	surf_sizer  r   r'  srcalphar  r@   r,   r   r   r    _make_surface[  s   zSurfaceBlendTest._make_surfacec                 C   sR   |d u r| j }||d d ||d d ||d d ||d d d S )	NrJ   )r   r   r   r  r2   )r   r   r   r  r   )r   r  r   r  rq   )r   r  r   r  r  rK   rM  r   r   r    _fill_surfacef  s   zSurfaceBlendTest._fill_surfacec                 C   s   |  |||}| || |S r   )r  r  )r   r'  r  r  r,   r   r   r    _make_src_surfacen  s   z"SurfaceBlendTest._make_src_surfacer	  c                    sz   |d u r| j }  dkr fdd|D }| jD ]!\}}|  ||| d |||     ||f  qd S )Nr	   c                       g | ]
}   |qS r   r6  r  r  r,   r   r    rl  w      z4SurfaceBlendTest._assert_surface.<locals>.<listcomp>z(%s != %s: flags: %i, bpp: %i, posn: %s%s)r  r   _test_pointsr   r(   r   )r   r,   r  msgposnr  r   r  r    _assert_surfaces  s&   z SurfaceBlendTest._assert_surfacec                    sb  |  d|  d| j ddd|  d|  d| j dddg}| d| d| jddd| d| d| jdddg}ddd	d
 fdddd
 fdddd
 fddtfddtfg}|D ]ufdd| jD }|D ]f}|D ]a\}|| g }|D ]/ fddtdD }| d r|	 d  n|	d |||}|	| q}|
 |jdtt|d | ||d|  f  qlqhqZ|  d }	t dd|	d |	d |	d |	d g}|D ]@\}g }| jD ]fd dtdD }|	d |	t| q|
 |jdtt|d | ||d!|  q|  d}
|
 }	t|	d"krJd#d |	D }	nd$d |	D }	t|
 dd|	|  t dd|	}|D ]B\}g }| jD ]fd%dtdD }|	d |	t| qv|
 |jdtt|d | ||d!|  qld S )&Nrr   r	   Tr  rH   r=   r   r   r~   rG   r%   c                 S      t | | dS Nr%   minr  r   r   r   r    <lambda>      z2SurfaceBlendTest.test_blit_blend.<locals>.<lambda>	BLEND_SUB)rG   r~   r   rG   c                 S      t | | dS Nr   maxr  r   r   r    r    r  
BLEND_MULT)rG   ra   r   r   c                 S      | | d d? S Nr%   rr   r   r  r   r   r    r        	BLEND_MINr?  	BLEND_MAXr   r%   r   r%   c                    r  r   r  r  r  r   r    rl    r  z4SurfaceBlendTest.test_blit_blend.<locals>.<listcomp>c                       g | ]} | | qS r   r   r  dcopscr   r    rl        r   r%   r#   r  $, op: %s, src bpp: %i, src flags: %ir   r2   rJ   c                    r  r   r   r  	dst_colorr  	src_colorr   r    rl    r  , rf   c                 S   s   g | ]}|d ? qS rr   r   rj  mr   r   r    rl    rm  c                 S   s   g | ]}|d > qS r  r   r  r   r   r    rl    rm  c                    r  r   r   r  r  r   r    rl    r  )r  r  r  r  r  r6  r  r   r=  r:  rK   r   rm  r   r  r   r   r   r   r   r  )r   sourcesdestinationsblendsrc_paletter  
blend_namer  r   rd   patr   )r  r   r  r  r  r  r    test_blit_blend  s   		


$







z SurfaceBlendTest.test_blit_blendc                    s  |  d|  d| j ddd|  d|  d| j dddg}| d| d| jddd| d| d| jdddg}ddd	d
 fdddd
 fdddd
 fddtfddtfg}|D ]lfdd| jD }|D ]]}|D ]X\}|| g }|D ]& fddtdD }| d sd|d< |||}|	| q}|
 |jdtt|d | ||d|  f  qlqhqZ| j ddd }	t td|	d |	d |	d |	d f}|D ]*\}fdd| jD }|
 |jdtt|d | ||d |  qtd!tdtd!td}td!td}

d" |
d# d$}|d$}|j|dtd |

d# |

d%d$ tdD ],}td&D ]$}| |||f|
||fd'|||f|
||f||f  q[qUd S )(Nrr   r	   Tr  rH   r=   BLEND_RGBA_ADDr  c                 S   r  r  r  r  r   r   r    r    r  z7SurfaceBlendTest.test_blit_blend_rgba.<locals>.<lambda>BLEND_RGBA_SUBc                 S   r  r  r  r  r   r   r    r    r  BLEND_RGBA_MULTr   r   rG   r%   c                 S   r  r  r   r  r   r   r    r    r  BLEND_RGBA_MINr  BLEND_RGBA_MAXc                    r  r   r  r  r  r   r    rl    r  z9SurfaceBlendTest.test_blit_blend_rgba.<locals>.<listcomp>c                    r  r   r   r  r  r   r    rl     r  rq   r   r%   r#   r  r  r2   rJ   r   c                    s*   g | ] t  fd dtdD qS )c                 3   s"    | ]} | | V  qd S r   r   r  r  r   r    r    s     zCSurfaceBlendTest.test_blit_blend_rgba.<locals>.<listcomp>.<genexpr>rq   )r   r   )rj  )r   r  )r  r    rl    s    r  )rr   r1   )rJ   r2   r   rq   )rQ   rk   r"   r1   )r2   r   rq   rq   ))   r=   r7  r  r1   z%s != %s at (%i, %i))r  r  r  r  r  r6  r  r   r=  r:  rK   r   rm  r   r  r   r   r   r   r   r   r  r   r(   )r   r  r  r  r	  r  r
  r  r   rd   tstsubsrcsubdstrk  r  r   )r  r   r  r  r  r    test_blit_blend_rgba  s   		
$





z%SurfaceBlendTest.test_blit_blend_rgbac                 C   s^  						d"dd}| j |tdddd	tdddd	  | j |tddddtdddd	  | j |tdddd	tdddd  | j |tddddtdddd  | j |td
d
d
d
tdddd	  | j |tdddd	td
d
d
d
  | j |td
d
d
d
td
d
d
d
  | j |tddddtdddd	  | j |tdddd	tdddd  | j |tddddtdddd  | j |tddddtdddd	  | j |tdddd	tdddd  | j |tddddtdddd  | j |tddddtdddd	  | j |tdddd	tdddd  | j |tddddtdddd  | j |tddddtdddd	  | j |tdddd	tdddd  | j |tddddtdddd  | jt|tddddtddddddd | j |tdddd	tdddd	ddd  | j |tdddd	tdddd	ddd  | j |tddddtdddd	dddd  | j |tdddd	tdddddddd  | j |tddddtddddddddd  | j |tddddtdddddddddd  | j |tddddtdddddddddd  | j |tddddtddddddddddd  | j |tddddtdddddddd  | j |tddddtdddddddd   | j |tddddtddddddddd!  d S )#Nr   r=   Tc                 S   s  |dkrt |d|}| |g}	||	 ||	d  n|r+t |t|}||  nt |d|}||  |dkrSt |d|}
| |g}	|
|	 |
|	d  n|rbt |t|}
|
| nt |d|}
|
| |
j|dtd |
tt	|d d tt	|d d f}| j
dkr|}nH| j
dkr| }n@t | j|j |jd | j
 d?  | j|j |jd | j
 d?  | j|j |jd | j
 d?  | j
|j
 |j
d | j
 d?  }|sd|_
||fS )Nrr   r   rJ   r#   r  g       @r%   )r   r   r  rK   r   r   BLEND_PREMULTIPLIEDr(   r  r  r  rM   r8   r   r   )src_coldst_colsrc_sizedst_sizesrc_bit_depthdst_bit_depthsrc_has_alphadst_has_alphar  r  r  
actual_colexpected_colr   r   r    test_premul_surf8  sJ   




&

zHSurfaceBlendTest.test_blit_blend_premultiplied.<locals>.test_premul_surfrQ   r"   r   rO  r2   r  r   ra   r%   r#   )r  r  rk   r   r  )r  rV  )E   r$  )r  r  r  F)r  r  r   )r  r  r  r   rH   )r  r  r  r  r   )r  r  r  r  r   )r  r  r  r  r  r   rr   )r  r  r  )r  r  r  )r  r  r  r  )r   r   r=   r=   TT)r   r   rM   rZ   r  )r   r#  r   r   r    test_blit_blend_premultiplied7  s  
;          				


z.SurfaceBlendTest.test_blit_blend_premultipliedc           	      C   s<  d}d}t ddd}|jt j||d}| t d| | |dd	 | |d
| t d}t d}| || t ddd}|| |	t dddd}| |d| | |d| ||dt j
 | |d| | |d| ||dt j
 | |d| | |d| dS )z%test that an oversized rect works ok.r   )rJ   rJ   rk   rk   r   r   r=   r   )rJ   rJ   r   r   r#   r$   r   blackredrP   rJ   r1   rr   )r   r  )r   rr  r1   rJ   )r   rr   r1   rJ   N)r   r   rK   r   r   r3   r(   rM   r   r   BLEND_RGB_ADD)	r   r   r   r   r8   r&  r'  r,   r  r   r   r    test_blit_blend_big_rectO  s*   


z)SurfaceBlendTest.test_blit_blend_big_rectc                 C   sV   | j ddd}|d |d  | j ddd}|j|dtd | |dd d S )Nr=   Tr  )r   r   r   r6  r#   r  r$   )r  rK   r   r   r  r   r(   )r   r  r  r   r   r    test_GET_PIXELVALSl  s   

z#SurfaceBlendTest.test_GET_PIXELVALSc              	      sP  |  d|  d| j ddd|  d|  d| j dddg}ddd	d
 fdddd
 fdddd
 fddtfddtfg}|D ]ifdd| jD }|D ]Z\}}||  g }|D ]/  fddtdD } d r}|	 d  n|	d |}|	| q`j
|tt|d | |d|  qJq<d S )Nrr   r	   Tr  rH   r=   r   r  c                 S   r  r  r  r  r   r   r    r    r  z2SurfaceBlendTest.test_fill_blend.<locals>.<lambda>r  c                 S   r  r  r  r  r   r   r    r    r  r  r  c                 S   r  r  r   r  r   r   r    r    r  r  r  r  c                    r  r   r  r  r  r   r    rl    r  z4SurfaceBlendTest.test_fill_blend.<locals>.<listcomp>c                       g | ]} | | qS r   r   r  r  fcr  r   r    rl    r  r   r%   r  r  r  r  r  r  r6  r  r  r   r=  r:  rK   rm  r   r  r   r  r  dst_paletter
  
fill_colorr  r   r   r  r  r.  r  r    test_fill_blendx  s<   	

z SurfaceBlendTest.test_fill_blendc              	      s>  |  d|  d| j ddd|  d|  d| j dddg}ddd	d
 fdddd
 fdddd
 fddtfddtfg}|D ]`fdd| jD }|D ]Q\}}||  g }|D ]&  fddtdD } d syd|d< |}|	| q`j
|tt|d | |d|  qJq<d S )Nrr   r	   Tr  rH   r=   r  r  c                 S   r  r  r  r  r   r   r    r    r  z7SurfaceBlendTest.test_fill_blend_rgba.<locals>.<lambda>r  c                 S   r  r  r  r  r   r   r    r    r  r  r  c                 S   r  r  r   r  r   r   r    r    r  r  r  r  c                    r  r   r  r  r+  r   r    rl    r  z9SurfaceBlendTest.test_fill_blend_rgba.<locals>.<listcomp>c                    r,  r   r   r  r-  r   r    rl    r  rq   r   r%   r  r  r/  r0  r   r3  r    test_fill_blend_rgba  s:   	
z%SurfaceBlendTest.test_fill_blend_rgbac                 C   s  t dt jd}|t dddd | }| |dt dddd t dt jd}|t dddd | }| |dt dddd t ddd}|t dddd | t	 |  W d	   n1 srw   Y  g d
}|D ]\\}}}	t
dD ]R}
| j|||	|
d? t dt jd}|t |||	|
 | }| |dt|d |
 d? |d |
 d? |	d |
 d? |
 W d	   n1 sw   Y  qq}d	S )z+Ensure that .premul_alpha() works correctlyrF   r=   r%   rG   r   r	   rt  r   N))ra   rk   J   L   S   rH   )   r   r  )r6  rq   r6  r7  )r:  r      )r  rk   r6  )r     rs  )r4  rM  ro   )   Y   r6  )   r  r  )r:  r  r  )r8   r   r   r  rP   r  rJ   rr   )r   r   r   rK   rM   premul_alphar   r(   rZ   r[   r   rf  )r   r   r  r   r  invalid_surftest_colorsr8   r   r   r  r,   r   r   r    test_surface_premul_alpha  sB   
z*SurfaceBlendTest.test_surface_premul_alphaFNr   )Nr	  )rV  rW  rX  rg  rk  r  r  r  r  r  r  r  r  r  r%  r)  r*  r4  r5  rC  r   r   r   r    r  @  s(    



YW  " r  c                   @   s   e Zd ZdZdd Zdd Zg dZdZd"d	d
Zd#ddZ	dd Z
dd Zede v ddd Zede v ddd Zdd Zdd Zdd Zdd Zd d! ZdS )$SurfaceSelfBlitTestziBlit to self tests.

    This test case is in response to https://github.com/pygame/pygame/issues/19
    c                 C   rg  r   rh  r   r   r   r    rg    r  zSurfaceSelfBlitTest.setUpc                 C   rg  r   rj  r   r   r   r    rk    ri  zSurfaceSelfBlitTest.tearDown)r$   )r%   r   r   r   r  )r  r  Nc                 C   s0   |d u r| j }||d  ||d d d S )NrJ   r2   )rJ   r2   rJ   r2   r  rM  r   r   r    r     s   z!SurfaceSelfBlitTest._fill_surfaceFc                 C   sZ   |d u r| j }d}|r|tO }t| j||}|dkr%|dd |D  | || |S )Nr   rr   c                 S   r  r  r   r  r   r   r    rl    r  z5SurfaceSelfBlitTest._make_surface.<locals>.<listcomp>)r  r   r   r   r  r  r  r  r   r   r    r    s   z!SurfaceSelfBlitTest._make_surfacec                 C   sp   |  \}}t|D ]+}t|D ]$}| |||f|||fd|||f|||f| f  qq
d S )Nz%s != %s, bpp: %i)r   r   r   r(   r   )r   r  r   r   r   rk  r  r   r   r    _assert_same  s    z SurfaceSelfBlitTest._assert_samec              
   C   s   d}d}d}ddg}g d}t dtdg}t ddd}|d || t ddd}|d	 || |D ]3}|D ].\}}	}
}}|| ||d
 ||d |||
|f||	ddf | |	|| q>q:d S )Nr$   )r6  rd  r=   r%   r  ))r   r   rJ   r   )r   r   )r   r   1   rJ   )r  r2   )r   r   rG  rG  )r  r  )rG  r   r   rJ   r  )rG  r   r   rG  )r   r  rF   r=   r   r%   )r   rJ   r   )r~   r   r~   r   )r   r   r~   r   r   )
r   r   r   r   r:  rz   rK   r   r   r(   )r   bgc
rectc_leftrectc_rightcolorsoverlapssurfsr,   s_xs_yd_xd_y	test_posnr   r   r    test_overlap_check  s*   




z&SurfaceSelfBlitTest.test_overlap_checkppc64lezknown ppc64le issuec                 C   s   t jd g d}|D ]b}| |}|| jd  ||d g }| jD ]}|||}|	| q&|d d |d d |d d df|d< | jdd|d	}||d |
d  | |}||d
 | || qd S )NrG   r   r$  rJ   r   r   r   r2   r=   Tr  r  r#   )r   r)   r*   r  rz   r  r   r6  r  r:  r   rF  r   bitsizesr'  r,   r  r   tmpr`  r   r   r    test_colorkeyA  s$   

(

z!SurfaceSelfBlitTest.test_colorkeyc                 C   s   t jd g d}|D ]U}| |}|d ||d g }| jD ]}|||}|	|d |d |d df q#| jdd	|d
}||d |d  | |}||d | 
|| qd S )NrU  r$  r6  rV  r   rJ   r2   r=   TrW  r#   )r   r)   r*   r  r   r   r  r6  r  r:  rF  rX  r   r   r    test_blanket_alphaX  s"   


 

z&SurfaceSelfBlitTest.test_blanket_alphac                 C   sV   ddg}|D ]"}| j |dd}| j |dd}||d ||d | || qd S )Nr	   r=   Tr  rV  )r  r   rF  )r   rY  r'  r,   r`  r   r   r    test_pixel_alpham  s   z$SurfaceSelfBlitTest.test_pixel_alphac                 C   s   g d}g d}|D ]7}|  |}|  |}|D ](}| | | | |j|dtt|d |j|dtt|d | || qq
d S )Nr$  )r   r  r  r  r  rV  r  r  r  r   rm  r   rF  r   rY  blendsr'  r,   r`  r  r   r   r    
test_blendv  s   



zSurfaceSelfBlitTest.test_blendc                 C   s   ddg}g d}|D ];}| j |dd}| j |dd}|D ](}| | | | |j|dtt|d |j|dtt|d | || qq
d S )Nr	   r=   )r  r  r  r  r  Tr  rV  r  r^  r_  r   r   r    test_blend_rgba  s   

z#SurfaceSelfBlitTest.test_blend_rgbac                 C   sn   | j ddd}| }||d |d}||d ~| || dd }|d	}| tj||| d S )
Nr=   Tr  rV  )r   r   r  r  r#   c                 S   s   |  |d d S )Nr#   )r   )dr7   r   r   r    do_blit  s   z4SurfaceSelfBlitTest.test_subsurface.<locals>.do_blitr   )r  r   r   r   rF  rZ   r   r   )r   r,   r`  subrd  r   r   r    rT    s   

z#SurfaceSelfBlitTest.test_subsurfacec                 C   s<   t dt jd}| | d | }| | d dS )z;issue 581: alpha of surface copy with SRCALPHA is set to 0.r   r=   r%   N)r   r   r   r   r   r   r\   r   r   r    test_copy_alpha  s   z#SurfaceSelfBlitTest.test_copy_alphar   rD  )rV  rW  rX  r  rg  rk  r  r  r  r  rF  rS  rY  rZ  rd  unamer[  r\  r]  ra  rb  rT  rf  r   r   r   r    rE    s&    

"

	rE  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SurfaceFillTestc                 C   rg  r   rh  r   r   r   r    rg    ri  zSurfaceFillTest.setUpc                 C   rg  r   rj  r   r   r   r    rk    ri  zSurfaceFillTest.tearDownc              	   C   s  t jd}|dd |dd |dd |dd |d |d	d
d |d	dt j |ddt j |ddt j |ddt j |ddt j	 |d	dt j
 |ddt j |ddt j |ddt j |ddt j |d	dt j |ddt j |ddt j |ddt j |d	dt j t j  tddd D ]}| |d |f|d!d| f qd S )"Nr   rJ  )r   r   r`   r  )r`   r  r`   r  r   )r`   r   r`   r  )r   r  r`   r  )r   r   r`   r   )r%   r   r   r   )r  r   r`   rk   r   )r  rk   r`   rk   )r   r   r   r   )r  ro   r`   rk   )r   rw  rw  r   )r  r   r`   rk   )r  x   r`   rk   )r   r   r   r   )r  r  r`   rk   )r     r`   rk   )r     r`   rk   )r  r  r`   rk   )r  i  r`   rk   )r  rK  r`   rk   )r  J  r`   rk   )r  ih  r`   rk   )r  i  r`   rk   )r  i  r`   rk   )r  rP  r`   rk   r   r   r1   rl  )r   r)   r*   rK   r4   r   r  r  r  r  r  r  r  r  r  r(  BLEND_RGB_SUBBLEND_RGB_MULTBLEND_RGB_MINBLEND_RGB_MAXflipr   r   r(   )r   screenr  r   r   r    r     s4   

&zSurfaceFillTest.test_fillN)rV  rW  rX  rg  rk  r   r   r   r   r    rh    s    rh  __main__)rU   rY  pygame.testsr   r  r   r    pygame.tests.test_utils.arrinterImportErrorr  r   pygame.localsr,  r   rd  r  r  ctypespython_implementationr  TestCaser   r`  r  rf  rt  r  rE  rh  rV  mainr   r   r   r    <module>   sn          C S           o\   [     5 B.