o
    OZhц                 	   @   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assertIsInstanceZassertNotIsInstanceassertEqualget_size	get_flagsget_bitsize)selfexpected_depthZexpected_flagsexpected_sizedepth_surfacesurface r   H/var/www/auris/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_clipZ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   r9   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 )Nr8   r:   )flagsdepthr   r	   r0   r>   )r   r   r   r   r   r   get_bytesize)r   r*   Z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   rC   r      r   r   r   r!   )r/   r/   r/   r#   r"   )r/      r#   )r   r   r#   r#   )r   r   fillset_atr&   r   Colorr   )r   r4   r5   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r/   r/   r#   r   )r/   r    )r/   (   N)r   r'   initimageloadr   ospathjoinr   r&   rI   rH   quit)r   rO   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 )Nr8   r:   rB   rD   )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.r8   r   N)r   r'   rT   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.)@     r8   r   N)r   r'   r(   r   r   r   r   rT   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 )NrL   )r   r   )Zbppr=   masksr   r   r   	make_surf   s   z-SurfaceTypeTest.test_masks.<locals>.make_surf)      ~       r   r:   r   )i   rc   r#   r   rD   )i  o rc   r#   r   )r   rV   rW   )r   r`   r_   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 )Nr8   r:   r   r   r   r   r   )   rf   )r#   r#   r#   rF   rf   rF   )   rg   rg   r0   rD   rE   r#   r#   r#   <   rj      )   rF      )r   r   r   rG   Zget_bounding_rectr   widthheightrH   lefttop	get_width
get_heightset_colorkeyr'   rN   rT   )r   r*   Z
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.   rw   rw   rw   r:   r:   r:   rL   N)	r   r   r   rG   copyget_rectr   sizer&   )r   colors1s2Zs1rectZ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.rv   r   r	   rx   r:   N)r   r1   r   r   rG   r   rect_area_ptsr   r&   Z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()   rw   rw   r#   rx   r#   r   r#   r!   r   N)r   r   rt   RLEACCEL
assertTruer   
RLEACCELOKblitrG   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()rB   r   r   r#   r!   N)	r   r   rt   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 SDL2rB   r:   )r>   r=   )      r   r#   r!   N)
r   r   r   rt   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 encodingrx   rD   r   N)r   r   rt   r   r   r   r   ry   )r   r}   Z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   )r]   r]   r   r#   r	   rx   rD   r   r!   N)
r   r1   r   rt   r   rG   
subsurfacer   r   r   r   r|   color2Z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   r1   r   rt   r   rG   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_colorkeyrt   r   r   convert)Zimgclearr   r   r   optimizeF  s   z:SurfaceTypeTest.test_solarwolf_rle_usage.<locals>.optimizei    rK   
alien1.pngN)r   r'   rN   r(   rO   rP   r   rQ   rR   rS   r   r   r   r   r   r   r   
isinstancer   rT   )r   r   rO   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:   r?   rB   rK   r   r!   Z   N)r   r'   rN   r(   r   rO   rP   r   rQ   rR   rS   r   r   rt   r   r   r   r   r   	set_alpharT   )r   blit_to_surfrO   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   rh   rK   r   r   r!   2   r   r0   delta)r   r'   rN   r(   r   rG   rO   rP   r   rQ   rR   rS   r   r   r   r   r   r&   r   rt   assertAlmostEqualr5   gbrT   )r   r   rO   r   Zsample_pixel_rleZ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 )Nrv   )r    r    r    rw   ir	   rx   r:   r!   )   r   r   r   )r   r   r   rl   rl   )r   r   r   re   )	r   r1   r   r   rG   r&   r   r   tuple)r   r|   r   r   r}   r1cr~   r2c2Z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.rF   r0      r#   rF   rF   r0   r0   r   r   r:   special_flagsr|   rectr!   r"   rF   rF   N)r   r   rG   	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.rx   r:   r#   )r   r:      r#   rl   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:   rl   rx      r0   r      N)r   r'   rN   r   r   r   r@   r   rV   errorr(   rT   )r   r>   Z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.rx   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)r.     r   )r=   r]   r]   r:   )r   r'   rN   r(   assertFalser   Z
FULLSCREENr   ZNOFRAMEZ	RESIZABLEZOPENGLr   rT   )r   Z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'   rN   r   r   assertIs
get_parentrV   r   r(   rT   )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   rz   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   rr   rs   r   )r   whr4   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   rm   2013)rm   r   r	   rD   r:   )r   r   rl   r   N)
r   r   aAr5   Rr   Gr   Br0   rl   r0    9ZRGBA   2)rW   r   r   get_viewrV   r   r   r@   rr   rs   r   lengthr   r   IS_PYPYArrayInterfacendr   
get_lockedZ__array_interface__r   gccollect	TypeErrorweakrefref)r   Errorr4   v2r   Zv0v1Zv3r~   kindvZair   Zweak_sZ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rm   r	   rD   r:   r   r   z<BufferProxy(z)>)r   r/   r:   )rF   r0   r   r   r   )r   r   	get_pitchrs   
get_bufferr   r   r   r   r;   r   r   r   r   r   r   )r   bitsizer4   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:   rF   )pygame.bufferproxyr  r  r   r   r   r	  r   r  rs   _pixels_address	r   r  r  r4   r  ZsegcountbuflenZseglenZ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   rm   r   )r  r  r  r   r   r   r   r   r  rs   r  r@   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#   rl   )r   r   r   rt   r   r   r   )r   r4   Z	colorkeyscolorkeyr   r   r   r   test_set_colorkey  s   
z!SurfaceTypeTest.test_set_colorkeyc                 C   6   t d}| \}}}}| t|j||||f d S Nrx   )r   r   	get_masksrV   r   Z	set_masksr   r4   r5   r   r   r   r   r   r   test_set_masks'     
zSurfaceTypeTest.test_set_masksc                 C   r  r  )r   r   
get_shiftsrV   r   Z
set_shiftsr  r   r   r   test_set_shifts,  r  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:   r0   r0   )rF   r0   r   r   )r   sourcedestr   r!   r"   )r   r   rG   r   r   rz   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.)rC   i	 r   r:   r#   r   r   r$   r   r#   r   rB   )r   i>  rC   rC   )r   r   )r   i }  rC   rC   ),  r(  )r   i rC   rC   )e   r)  )   r*  )-  r+  )r   r+  )r   r*  )rC   r*  )c   r,  )  r-  N)r   r   rG   r   r   r&   )r   Zbig_surfZ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+   r7   r<   rA   rJ   rU   rZ   r[   r^   rd   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   unittestskipIfrQ   environgetr   r   r   r   r  r  hasattrr   ZbufferproxyZOLDBUFr  r  r  r  r!  r%  r0  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.   r;  r:   r#   @   r=  r   N)r   r   src_surfacerG   rI   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!   r<  c                 S      g | ]}||fqS r   r   .0xr   r   r   
<listcomp>      z<TestSurfaceBlit.test_blit_overflow_coord.<locals>.<listcomp>r=  rh   N)
r?  r   r>  r   r   r1   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 Rectr(  r<  c                 S   rA  r   r   rB  r   r   r   rE    rF  z;TestSurfaceBlit.test_blit_overflow_rect.<locals>.<listcomp>r=  rh   N
r?  r   r>  r   r1   r   r   r{   r   r&   rG  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)rF   rF   rF   rF   )r$  ?   rP  r!   rE   rP  r   r   rP  r   rh   N	r?  r   r>  r   r1   r   r   r{   r&   r   rH  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 constraintrN  r0   r0   r0   r0   r$  r   r"  r!   rE   rQ  rR  rO  r   rh   r   r   NrS  rT  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.) rZ  rF   rF   )r0   r0   r;  r;  rW  r!   c                 S   rA  r   r   rB  r   r   r   rE    rF  z:TestSurfaceBlit.test_blit_zero_overlap.<locals>.<listcomp>r=  rE   rQ  rR  NrL  rG  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 )Nr:  r:   r   r#   r!   rF   )r   r   r   ry   r   r   rz   rH   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.)r  r  r:   r!   r;  N)r   r   r   rz   r   Zgradientrn   ro   rH   ry   r   r   r&   r   )r   Ztest_surfacer   r   
test_colorZreference_surfacerD  yr5   r   r   r   Z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.
        rx   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.rF   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   rB  low_alpha_colorr   r   	<genexpr>      
zdTestSurfaceBlit.test_blit__SRCALPHA_to_SRCALPHA_non_zero.<locals>.high_a_onto_low.<locals>.<genexpr>N
r   r   r   ry   rI   rG   r   r   r   r&   )highlowhigh_alpha_surfacelow_alpha_surfacehigh_alpha_colorrc  rh  r   r{   rl  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   ri  rj  rk  rB  ru  r   r   rn    ro  zdTestSurfaceBlit.test_blit__SRCALPHA_to_SRCALPHA_non_zero.<locals>.low_a_onto_high.<locals>.<genexpr>Nrp  )rq  rr  rs  rt  rm  rc  rv  ry  r   low_a_onto_high  rx  zQTestSurfaceBlit.test_blit__SRCALPHA_to_SRCALPHA_non_zero.<locals>.low_a_onto_highr   r  r;  N)r   )r   rw  rz  Zlow_aZhigh_ar   rv  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   rm   r   rm   r0   r   r:   r!   )r   r   get_palette_atr   rH   r   )r   targetra  r#  r   r   r   test_blit__SRCALPHA32_to_8  s
   
z*TestSurfaceBlit.test_blit__SRCALPHA32_to_8N)r1  r2  r3  __doc__r@  rJ  rM  rU  rY  r[  r`  rd  r{  r~  r   r   r   r   r9  V  s    @r9  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   rK   zcity.pngz	brick.png)r"   r#   r#   r#   r#   )r"   r"   r:   z<Surface(24x24x32 SW)>z<Surface(469x137x32 SW)>rm   z<Surface(24x24x8 SW)>)r   r'   rN   r(   rO   rP   r   rQ   rR   rS   r   get_paletter;   r   rT   )r   ZimZim2Z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'   rT   r   assertRaisesRegexr   r   rN   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'   rT   r   r  r   convert_alpharN   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   rB   r   r:   r#   N)r   r'   rN   r(   r   r  r   r   r   r   rT   )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#   rC   r!   re   N)r   r   r   rG   r   r&   r   )r   Zsurf1rY   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#   r'  r   r#   r#   r#   r  rF      rF   r  A      r  r	   r#      r#   r  ~   r   r  >   r#   r   r#   r  r   r  r   rP  r#   r   r#   r  r  r  r     r#   k   r#   r  r  rF   r     r#   r0   r#   r  r   r#   r#   r   r#   rF   r  r  r'  rF   r#   r  r  r  r  rF   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  n   r#         r  r  r  r#   r   r   r  r  r  r#   r  r   r  r     r#   O   r  r  r  r  r#   rF   r#   r  r   r   r  r  r'  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#   rF   r#   r  r   r  r  r  r'  r  r#   r  r  r  r     r#   B   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  rF   rF   r'  r  r#   rF   rF   r  r  r  r#   r0   r0   r  r     r#   4   r  r   r#   rP  r   r   r#   rP  r     r#   3   r]   r   r#   r#   r   rF   r#   r  rF   r  r#   r  r  r  r#   r   r  r   r#   r  r   r  r#   r  r  r  r#   rF   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   rF   r  r  r   r  r  r#   src_rsrc_bsrc_aZdest_rZdest_bZdest_ar  r  r:   r#   r!   r  !   N
zipreversedsubTestr   r   r   rG   r   r&   r   r   results_expectednumsresultsdst_rdst_bdst_ar)  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  )r  r#      r#   r  r  )   r#   f   r#   r  r  r  r  r  r  r  r  r  r  r  r  )D   r#   r?  r?  r  r  )rB  r#   r?     r  )U   r#   r@     r  r  )   r#   rD  r#   r  r  r  )w   r#   rG  rG  r  r  )rA  r#         r  )rG  r#   rG  rF  r  r  )rF  r#   rB  rE  r  r  r  r  r  r  r  r  r  r  r  )r?  r#   rB  rB  r  r  )r@  r#   rA  rG  r	  )r@  r#   rD  rI  r  r  )r?  r#   rB  rC  r  r  r  r  r  r  )rB  r#   r?  rB  )r?  r#   rB  r?  r&  r'  r(  r,  r	   r#   r!   r-  Nr/  r3  r   r   r   test_src_alpha_compatible_16bit  r>  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  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-  N)r0  r1  r2  r   r   r   rG   r   r   r&   r   r3  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  )rP  r  r  r  r  )   r  i   r  r  )   r  r   r  r  r  r  r  r  )r   r  rQ  rQ  r  )r	   r  rE  rQ  r  )r  r  r  rQ  r  r  r  r  r  r  r  )r=  r     rR  r  )r=  r  rR     r  )^   r        r  )r  r     rV  r  )   r  ]   r  r  r  r  r  r  )r  r  r  r  r  )m   r        r  )r  r  r     r  )r  r  r  r  r  )   r  M   rV  r  r  r  r  r  )r  r  r  r  r  )r  r        r  r  r  r  r  r  r   r  )rR  r  r=  r=  r  )r  r  b   p   r	  )rU  r  rT  ra  r  )rU  r  rT  r\  r  )rR  r  r=  r  r  r  r  r  r  )rQ  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-  rl   r   N)r0  r1  r2  r   r   r   rG   r   ZBLEND_ALPHA_SDL2r   r&   r   r   )r   r4  r5  r6  r7  r8  r9  r)  r*  r+  r:  r;  r<  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 )Nrx   r:   )r#   r#   r#   r]   )rC   rC   rC   r!   r]   )r   r   r   rG   r   r&   r   r   )r   r:  r;  Zno_surf_alpha_colZ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.r  r  r   r:   )rk   =   N)r   r   r'   rN   r   r   r   r   r   r   rT   r   r   Z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   rB   r   r:   rm   r   r   r	   rD   r#   N)r   r'   rN   r(   r   r  r   r   r   rV   r   rT   )r   r}   r  r~   s2_alphaZs3Zs3_alphaZs4Zs4_alphaZs5Zs5_alphaZs6Zs6_alphaZs7Z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.rj  r:   )rk   9   ri   N)r   r   r   r'   rN   r(   r  r   r   r   r   r   rT   rl  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 )Nr<  r:   r"  )"   r   r!   )rf   rg   )r   r   )r    r   )   rF   )   rt  r   rs  r   rl   )r   	   )r   r/   r   )r   r'   rN   r   r   r   r   Zget_abs_offsetrV   r   r(   rT   )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 )Nrx   r:   r   )r   r   )r   r   rw  rw  )rm   rm   r"  rv  r!   r0   rF   r   r   rB   )r   r   )r   r'   rN   r   r   r   rV   rW   r   Zget_abs_parentr   r   r(   rT   )	r   r   rx  ry  rz  r{  r|  Z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 )Nr"  r   rD   rF   r0   r   r   r/   r   rC   r   rl   rs  r!   )r   rF   rF   r   r   ))rK  r   )r   rK  )r0   r   r   r0   )	r   r   rI   rH   r&   r   r   rV   
IndexError)r   r*   Zc00Zc01Zc10Z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 )	Nr/   r    rf   r  r"  r   r!   z%i != %i, bitsize: %i)r   rI   r   rG   Zget_at_mappedr   map_rgb)r   r|   r
  r*   Z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   rK  r      )r   r'   rN   r   r   r   r   r   rV   rW   r   r(   rT   )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-   r.   )r   r   r3   r   )r   r4   Z	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    rM   rj   r   r#   rF   r   )r   r'   rN   r   ZassertIsNoner   rt   rI   r   r   r   r(   rT   rV   r   )r   r4   r5   r   r   r   r  r   r   r   test_get_colorkey_  s4   


 

"

z%GeneralSurfaceTests.test_get_colorkeyc                 C   s8   d}|D ]\}}t ||f}| }| || qd S )N)r   rG  r/   )r/   rG  )rF     )r  rF   r  r  )r   r   rs   r   )r   sizesrn   ro   r*   Z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 )NrL   r!   TF)r   r   r   r   )r   ZnewSurfr   r   r   blit_locked_test  s   
z=GeneralSurfaceTests.test_get_locked.<locals>.blit_locked_testrB   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 )NrB   r   ZDUMMY)r   r   r   Z	get_locksr  r  Z
PixelArrayr   closerV   AttributeError)r   r   Z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  rk   r   i   i  rk   r   rb   rc   r#   r   )ra   rb   rc   r#   rB   rm   )r>   r_   r   r	   rD   r:   rl   r   )r   r   r   rm   )rm   rm   rm   rm   )r   r   rs  rm   )r   r   r   rm   )r   r0   r   rm   re   N)r   r'   rN   r(   r   
get_lossesr   r   r   lenintZassertGreaterEqualZassertLessEqualrV   r   rT   )r   Zmask8Zmask15Zmask16Zmask24Zmask32Zdisplay_surfr*   Z	surf_8bitZ
surf_15bitZ
surf_16bitZ
surf_24bitZ
surf_32bitZlossesZ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   )rb   rc   r#   ra   r	   r:   rL   N)listr0  r   r   r   r   r  r   r_   depthsexpectedr>   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  )rm   r   r   r	   rD   r:   rL   r   rm   re   N)r  r0  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.
        rL   N)rV   r   r   r'   r(   rT   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
        rB   r!   rF   r/   r   N)r   r'   rN   r   r   Z
get_offsetr   rV   r   r(   rT   )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   )rI   rC  r^  r   r   r   rE  V      z8GeneralSurfaceTests.test_get_palette.<locals>.<listcomp>r;  r"  r   rm   )
r   r   r   set_paletter  r   r  r0  r   rI   )r   paletter*   Z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 )
Nr"  r   rm   rF   r0   r   r#   rK  r;  )	r   r   rI   set_palette_atr|  r   r   rV   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)r"  )r   r.  )r.  r   )r0     )r  r0   )r  r  rm   rD   r:   r?   r0   )r   r   r	  r   rs   r  r   rz   r   Zinflatefloat)r   r  r  rn   ro   r>   r*   ZbuffZpitchZ
test_pitchZrect1Zsubsurf1Z	sub_buff1Z
sub_pitch1Ztest_sub_pitch1Zrect2Zsubsurf2Z	sub_buff2Z
sub_pitch2Z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  r  Nrx   r?   )r   r   r   r   r   )r   r  r   offZ	bit_depthr   r   g1b1Za1r   g2b2Z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  )rF   i  )i  rF   )r,  i  )r   r   r   r   )r   r  rn   ro   r*   Z
found_sizer   r   r   test_get_size  s   z!GeneralSurfaceTests.test_get_sizec                 C   s   t d}|  | |  t d}|  |  |  | |  |  |  |  | |  |  | |  |  | |  t d}|  |  | |  |  | |  |  | |  d S NrB   )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   r  r#   r=  r  r:   r!   re   )
rI   r   r   r   r  r   	unmap_rgbr&   rG   rH   )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      r  )r   r   r;  r;  )r   r   r  r  rK  )r   r   r   r   r   r   append)r   r*   r  ZrectsZ
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   r  Nr#   r   r   r#   r!   r   zthe red component should be 0)	r   r   r   rG   r   r   r   r   r&   r   r4   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   rG   r   r   Z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
        rK   
alien2.pngN)r   rO   rP   r   rQ   rR   rS   r   r   r  r  r   r*   r<  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 NrK   r  r!   )r   rO   rP   r   rQ   rR   rS   r   rH   r   r&   r  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 r  )r   rO   rP   r   rQ   rR   rS   r   rG   r   r&   r  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   rI   r  r   r   r   rE  -	  s    z8GeneralSurfaceTests.test_set_palette.<locals>.<listcomp>r;  r/   r   r   r   r"  rm   zpalette color %ir!   r#   rF   r0   r  )rF   r0   r   r  )r   r   r   r   r  r   r  rG   r&   rI   rV   rW   )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 )Nr;  r/   r    rf   r"  r   r:   )r   r   rV   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 )Nr"  rm   r?   r;  r  )r   rM   rf   rF   r!   )rj   r   rM   )r   rM   rf   r#   r  )r/   r    rf   r#   )r   r   r  rH   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 )Nr"  r   rm   r/   rF   r#   r0   r   r;  rK  )	r   r   r|  rI   r  r   r   rV   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   rF   )r   r   rF   rF   )r   r   rF   rF   i  re   )r   r   r   rV   rW   r   r   r  r  __new__r   )r   r*   r4   r   r   r   test_subsurfacee	  s   

z#GeneralSurfaceTests.test_subsurfacec                 C   s   t d}|  |  | |  t d}|  |  |  | |  |  | |  t d}|  | |  |  | |  t d}|  |  | |  |  |  | |  d S r  )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 )Nr"  r   rm   )rF   rF   rF   C   )r  r=  r   r#   )r   r	   )r   rD   )r   r:   r	   r:   r!   z %s != %s, flags: %i, bitsize: %i)r   r   r  r  r   r   rI   r   r  rG   r&   )	r   r*   r   r^  Z
unmapped_cformatsr=   r
  Z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))rm   r0   r   )r	   r0   r   )rD   r0   r   )r:   r0   r   )r:   rK  r   )r:   r   r   )r:   r   r   )r:   r   r   )r:   r   )r:   r   r  )r:   r  r0   )r:   r0   r  rL   r   r&  r'  rV  )rD  rb  z %s != %s, bpp:, %i, x: %i, y: %i)r    r
   r:   )r   rF   rs  rs  r   rF   rm   rt  r0   r  r   r  r   )dxr  )dyr"  )r  r  rX  r   )r  r  r!   )r   r   rG   ry   r   scrollr   r   r2  r   r&   r1   r2   rD  rb  r3   r   rH   )r   Zscrollsr
  r  r  r*   compr   r   rD  rb  ZclipZ
spot_colorr   r   r   test_scroll	  sl   



""
zGeneralSurfaceTests.test_scrollN)<r1  r2  r3  r4  r5  rQ   r6  r7  r  r  r  r  r  r=  rJ  rK  platformmachinerg  rh  ri  rm  ro  rq  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  (  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'   rN   r   r   r   r   r@  
     zSurfaceSubtypeTest.setUpc                 C   r  r   r   r'   rT   r   r   r   r   tearDown
  r  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.
        rx   r:   test_attributeN)r   r   ry   r   r   r   r   r   r  rV   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.
        rx   r   rD   r  N)r   r   r   r   r   r   r   r  rV   r  r  r   r   r  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.
        )rM   rM   rx   r	   r:   r  N)r   r'   r(   r   r   r   r  r   r   r   r  rV   r  r  r   r   )r   r   r4   r  r  r   r   r   ro  =
  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.
        r/   r   rx   r:   rl   r   r  N)r   r   r   r   r   r   r   r   r  rV   r  r  r   r   r  r   r   r   r  S
  s   z"SurfaceSubtypeTest.test_subsurfaceN)
r1  r2  r3  r  r@  r  r   r  ro  r  r   r   r   r   r  
  s    r  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)ignoreZ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   r0   ur   rF   )r   r@   r  r  r   r   PAI_ALIGNEDPAI_NOTSWAPPEDPAI_WRITEABLEZPAI_FORTRANr   r   twor   typekinditemsizeshapestridesr=   rK   )
r   r4   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   rm   r	   rF   rK  )rm   r	   rD   r0   )r	   rm   r   )rD   r	   rm   rl   r   r  )r   r@   r  r  r  r   	lilendianr   r   r   r  r  r  r   r  r   r  r  r  r   r=   rK   )r   r4   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 )Nrm   rF   Zrgbar0   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   r4   planer  r  r  r  r  r	  s_masksZ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   rm   r	   rD   )rm   rl   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#   rc   rb   r   NrK  r0   rl   rD   )rc   rb   ra   r   )r   r   r  r  r  )r   szr4   r  r_   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   rm   r	   rD   rm   r	   rD   r   rD   r	   rm   r   r	   rm   r   rD   c                 S      g | ]}d |> qS r#   r   rC  r4   r   r   r   rE    rF  zCSurfaceGetBufferTest.test_array_interface_alpha.<locals>.<listcomp>rl   r0   r:   r   )r   r   r   r  )r   shiftsr_   r4   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   rE    rF  zASurfaceGetBufferTest.test_array_interface_rgb.<locals>.<listcomp>r   r   r  rD   r:   )r   r   r   r  )r   r  r_   r  r4   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r/   rs  r:   rF   r   )rF   rF   rF   r   rl   )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#  r4   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   rF   )r"  r  r#  r   r   r   r$  r   r%  r   r&  r  r   r  r  r   r'  r   r(  r)  r  r   r  r#  r4   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   =IrF   )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,  rr   rs   r-  r3  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   r0   r5  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  PyBUF_RECORDS_ROPyBUF_RECORDSr/  r0  rV   BufferErrorr,  r.  r   r+  r*  r1  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   rs  rD   r#   rF   rK  r0   rb   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  r7  r8  rV   r9  r$  r+  r*  r,  r.  r/  r0  )r   r  r#  r4   rmaskgmaskbmaskamaskZ
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;  rD   r#   r0   rb   r   rF   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  r7  r8  rV   r9  r$  r+  r*  r,  r.  r/  r0  )r   r  r#  r4   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)r1  r2  r3  r   	NameErrorZ__tags__r   Zget_sdl_byteorderZ
LIL_ENDIANr  r  r  r  r  r  r  r  r4  r5  ZHAVE_NEWBUFr2  r4  r6  r:  rA  rB  r   r   r   r   r  h
  s4    A 

;

&
F
2r  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   r  r   r  r   r   r   r   r@  A     zSurfaceBlendTest.setUpc                 C   r  r   r  r   r   r   r   r  E  r  zSurfaceBlendTest.tearDown)r"   )r/   rf   rj   r   )rw   K   rC   r  )r]      rC   r]   )r   rC   r]   r#   r  ))r!   rF   )r  rF   ))rw  r   r0   )r  r0   ))r   r   r   ))rl   rs  r   ))rw  r   rl   )ru  rl   FNc                 C   sN   |d u r| j }d}|r|tO }t| j||}|dkr%|dd |D  |S )Nr   rm   c                 S      g | ]}|d d qS Nr   r   rC  r   r   r   r   rE  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 )	NrF   )r   r   r   rs  r0   )r   r   r   rs  r   )r   rs  r   rs  rl   )r   rs  r   rs  rK  rG   r  r   r   r   _fill_surfacef  s   zSurfaceBlendTest._fill_surfacec                 C   s   |  |||}| || |S r   )rO  rQ  )r   r
  rN  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   r  r  rJ  r*   r   r   rE  w      z4SurfaceBlendTest._assert_surface.<locals>.<listcomp>z(%s != %s: flags: %i, bpp: %i, posn: %s%s)rK  r   _test_pointsr   r&   r   )r   r*   r  msgZposnr^  r   rU  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 )&Nrm   r	   TrN  rD   r:   r   r   rw   rC   r#   c                 S      t | | dS Nr#   minr   r   r   r   r   <lambda>      z2SurfaceBlendTest.test_blit_blend.<locals>.<lambda>	BLEND_SUB)rC   rw   r   rC   c                 S      t | | dS Nr   maxr`  r   r   r   ra    rb  
BLEND_MULT)rC   r]   r   r   c                 S      | | d d? S Nr#   rm   r   r`  r   r   r   ra        	BLEND_MINr  	BLEND_MAXr   r#   r   r#   c                    rS  r   rT  rJ  r\  r   r   rE    rV  z4SurfaceBlendTest.test_blit_blend.<locals>.<listcomp>c                       g | ]} | | qS r   r   r  dcopscr   r   rE        r   r#   r!   rf  $, op: %s, src bpp: %i, src flags: %ir   r0   rF   c                    rp  r   r   r  	dst_colorrs  	src_colorr   r   rE    ru  , ra   c                 S   s   g | ]}|d ? qS rm   r   rC  mr   r   r   rE    rF  c                 S   s   g | ]}|d > qS r{  r   r|  r   r   r   rE    rF  c                    rp  r   r   r  rw  r   r   rE    ru  )rR  rO  r_  rg  rK  r  r  r   r  r  rG   r   r  r   rY  r   r   r   r   r   rQ  )r   sourcesdestinationsblendsrc_paletter]  
blend_namer  r   r_   patr   )rr  rx  rs  rt  r\  ry  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 )(Nrm   r	   TrZ  rD   r:   BLEND_RGBA_ADDr[  c                 S   r\  r]  r^  r`  r   r   r   ra    rb  z7SurfaceBlendTest.test_blit_blend_rgba.<locals>.<lambda>BLEND_RGBA_SUBc                 S   rd  re  rf  r`  r   r   r   ra    rb  BLEND_RGBA_MULTr   r   rC   r#   c                 S   ri  rj  r   r`  r   r   r   ra    rk  BLEND_RGBA_MINrn  BLEND_RGBA_MAXc                    rS  r   rT  rJ  ro  r   r   rE    rV  z9SurfaceBlendTest.test_blit_blend_rgba.<locals>.<listcomp>c                    rp  r   r   r  rq  r   r   rE     ru  rl   r   r#   r!   rf  rv  r0   rF   r   c                    s*   g | ] t  fd dtdD qS )c                 3   s"    | ]} | | V  qd S r   r   r  rw  r   r   rn    s     zCSurfaceBlendTest.test_blit_blend_rgba.<locals>.<listcomp>.<genexpr>rl   )r   r   )rC  )rx  rs  )ry  r   rE    s    rz  )rm   r/   )rF   r0   r   rl   )rM   rf   r    r/   )r0   r   rl   rl   ))   r:   r  rt  r/   z%s != %s at (%i, %i))rR  rO  r_  rg  rK  r  r  r   r  r  rG   r   r  r   rY  r   r   r   r   r   r   r  r   r&   )r   r~  r  r  r  r]  r  r  r   r_   ZtstZsubsrcZsubdstrD  rb  r   )rr  rx  rs  rt  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 )Nrm   r   rF   r!   rf  g       @r#   )r   r   r  rG   r   r   ZBLEND_PREMULTIPLIEDr&   r  r  r   rI   r5   r   r   )Zsrc_colZdst_colsrc_sizedst_sizesrc_bit_depthdst_bit_depthsrc_has_alphadst_has_alphar\  r  r]  Z
actual_colZexpected_colr   r   r   test_premul_surf8  sJ   




&

zHSurfaceBlendTest.test_blit_blend_premultiplied.<locals>.test_premul_surfrM   r    r   r  r0   rw  r   r]   r#   r!   )r  r  rf   r   r~  )r  r  )E   r  )r  r  r  F)r  r  r  )r  r  r  r  rD   )r  r  r  r  r  )r  r  r  r  r  )r  r  r  r  r  r  rm   )r  r  r  )r  r  r  )r  r  r  r  )r   r   r:   r:   TT)r   r   rI   rV   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   )rF   rF   rf   rf   r   r   r:   r   )rF   rF   r   r   r!   r"   r   blackredrL   rF   r/   rm   )r   rw  )r   rK  r/   rF   )r   rm   r/   rF   N)r   r   rG   r   r   r1   r&   rI   r   r   BLEND_RGB_ADD)	r   r|   r   r}   r5   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:   TrZ  )r   r   r   r  r!   rf  r"   )rO  rG   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 )Nrm   r	   TrZ  rD   r:   r   r[  c                 S   r\  r]  r^  r`  r   r   r   ra    rb  z2SurfaceBlendTest.test_fill_blend.<locals>.<lambda>rc  c                 S   rd  re  rf  r`  r   r   r   ra    rb  rh  r  c                 S   ri  rj  r   r`  r   r   r   ra    rk  rl  rn  rm  c                    rS  r   rT  rJ  r]  r   r   rE    rV  z4SurfaceBlendTest.test_fill_blend.<locals>.<listcomp>c                       g | ]} | | qS r   r   r  rr  fcrs  r   r   rE    ru  r   r#   rf  rz  rO  r_  rg  rK  r  r  rQ  r   r  r  rG   r  r   rY  r   r  r  Zdst_paletter  Z
fill_colorr  r   r   rr  r]  r  rs  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 )Nrm   r	   TrZ  rD   r:   r  r[  c                 S   r\  r]  r^  r`  r   r   r   ra    rb  z7SurfaceBlendTest.test_fill_blend_rgba.<locals>.<lambda>r  c                 S   rd  re  rf  r`  r   r   r   ra    rb  r  r  c                 S   ri  rj  r   r`  r   r   r   ra    rk  r  rn  r  c                    rS  r   rT  rJ  r  r   r   rE    rV  z9SurfaceBlendTest.test_fill_blend_rgba.<locals>.<listcomp>c                    r  r   r   r  r  r   r   rE    ru  rl   r   r#   rf  rz  r  r  r   r  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 correctlyrB   r:   r#   rC   r   r	   r@  r   N))r]   rf   J   L   S   rD   )   r   rs  )r  rl   r  r  )r  r      )r  rf   r  )r     r?  )r  r*  rj   )   Y   r  )   rw  r  )r  rc  rs  )r5   r   r   r   rL   r  rF   rm   )r   r   r   rG   rI   Zpremul_alphar   r&   rV   rW   r   r2  )r   r}   r  r~   rn  Zinvalid_surfZtest_colorsr5   r   r   r   r*   r   r   r   test_surface_premul_alpha  sB   
z*SurfaceBlendTest.test_surface_premul_alphaFNr   )Nr   )r1  r2  r3  r@  r  rK  rL  rW  rO  rQ  rR  rY  r  r  r  r  r  r  r  r  r   r   r   r   rD  @  s(    



YW  " rD  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   r  r   r  r   r   r   r   r@    rE  zSurfaceSelfBlitTest.setUpc                 C   r  r   r  r   r   r   r   r    r  zSurfaceSelfBlitTest.tearDown)r"   )r#   r   r   r   rn  )rw  rs  Nc                 C   s0   |d u r| j }||d  ||d d d S )NrF   r0   )rF   r0   rF   r0   rP  r  r   r   r   rQ     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   rm   c                 S   rH  rI  r   rJ  r   r   r   rE    r  z5SurfaceSelfBlitTest._make_surface.<locals>.<listcomp>)rK  r   r   r   rL  r  rQ  rM  r   r   r   rO    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   rD  rb  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"   )r  r=  r:   r#   r  ))r   r   rF   r   )r   r   )r   r   1   rF   )rb  r0   )r   r   r  r  )rb  rb  )r  r   r   rF   r  )r  r   r   r  )r   rb  rB   r:   r   r#   )r   rF   r   )rw   r   rw   r   )r   r   rw   r   r   )
r   r   r   r   r  rt   rG   r   r   r&   )r   ZbgcZ
rectc_leftZrectc_rightcolorsoverlapsZsurfsr*   Zs_xZs_yZd_xZd_yZ	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rC   r   r  rF   r   r   r   r0   r:   TrN  r  r!   )r   r'   r(   rO  rt   rK  r   r  r  r  r   r  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 )Nr  r  r  r  r   rF   r0   r:   Tr  r!   )r   r'   r(   rO  r   r   rK  r  r  r  r  r  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:   TrZ  r  )rO  r   r  )r   r  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   rc  rh  rl  rm  r  rf  rO  rQ  r   r  r   r  r   r  Z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  TrZ  r  rf  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:   TrZ  r  )r   r   rs  rs  r!   c                 S   s   |  |d d S )Nr!   )r   )dr4   r   r   r   do_blit  s   z4SurfaceSelfBlitTest.test_subsurface.<locals>.do_blitr   )rO  ry   r   r   r  rV   r   r   )r   r*   r  subr  r   r   r   r    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   ry   rX   r   r   r   test_copy_alpha  s   z#SurfaceSelfBlitTest.test_copy_alphar   r  )r1  r2  r3  r  r@  r  rK  rL  rQ  rO  r  r  r4  r5  r  unamer  r  r  r  r  r  r  r   r   r   r   r    s&    

"

	r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SurfaceFillTestc                 C   r  r   r  r   r   r   r   r@    r  zSurfaceFillTest.setUpc                 C   r  r   r  r   r   r   r   r    r  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   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\   rf   r   )r  rf   r\   rf   )r   r   r   r   )r  rj   r\   rf   )r   rP  rP  r   )r  r   r\   rf   )r  x   r\   rf   )r   r   r   r   )r  rG  r\   rf   )r     r\   rf   )r     r\   rf   )r  r  r\   rf   )r  i  r\   rf   )r  r(  r\   rf   )r  J  r\   rf   )r  ih  r\   rf   )r  i  r\   rf   )r  i  r\   rf   )r  r-  r\   rf   r   r   r/   r  )r   r'   r(   rG   r2   r   rc  rh  rl  rm  r  r  r  r  r  r  ZBLEND_RGB_SUBZBLEND_RGB_MULTZBLEND_RGB_MINZBLEND_RGB_MAXflipr   r   r&   )r   screenrb  r   r   r   r     s4   

&zSurfaceFillTest.test_fillN)r1  r2  r3  r@  r  r   r   r   r   r   r    s    r  __main__)rQ   r4  Zpygame.testsr   r"  r   r   Z pygame.tests.test_utils.arrinterImportErrorrC  r   Zpygame.localsr  r   r  r   r   ctypespython_implementationr   ZTestCaser   r9  r  r  r  rD  r  r  r1  mainr   r   r   r   <module>   sn          C S           o\   [     5 B.