2012-03-24 00:36:37 +00:00
#encoding: utf8
from nose . tools import *
import os , sys
from utilities import execution_path
from utilities import Todo
import mapnik
def setup ( ) :
# All of the paths used are relative, if we run the tests
# from another directory we need to chdir()
os . chdir ( execution_path ( ' . ' ) )
2012-08-03 21:13:13 +00:00
def validate_pixels_are_demultiplied ( image ) :
bad_pixels = [ ]
for x in range ( 0 , image . width ( ) , 2 ) :
for y in range ( 0 , image . height ( ) , 2 ) :
pixel = image . get_pixel ( x , y )
r = pixel & 0xff
g = ( pixel >> 8 ) & 0xff
b = ( pixel >> 16 ) & 0xff
a = ( pixel >> 24 ) & 0xff
is_valid = ( r > = 0 and r < 256 ) and \
( g > = 0 and g < 256 ) and \
( b > = 0 and b < 256 ) and \
( a > = 0 and a < 256 )
if not is_valid :
bad_pixels . append ( " rgba( %s , %s , %s , %s ) at %s , %s " % ( r , g , b , a , x , y ) )
num_bad = len ( bad_pixels )
return ( num_bad == 0 , num_bad )
def validate_pixels_are_premultiplied ( image ) :
bad_pixels = [ ]
for x in range ( 0 , image . width ( ) , 2 ) :
for y in range ( 0 , image . height ( ) , 2 ) :
pixel = image . get_pixel ( x , y )
red = pixel & 0xff
green = ( pixel >> 8 ) & 0xff
blue = ( pixel >> 16 ) & 0xff
alpha = ( pixel >> 24 ) & 0xff
a2 = alpha
if a2 == 0 :
a2 = 1
else :
a2 = a2 * 256
is_valid = ( red > = 0 and red / a2 < 256 ) and \
( green > = 0 and red / a2 < 256 ) and \
( blue > = 0 and red / a2 < 256 ) and \
( alpha > = 0 and alpha < 256 )
if not is_valid :
import pdb ; pdb . set_trace ( )
bad_pixels . append ( " rgba( %s , %s , %s , %s ) at %s , %s " % ( red , green , blue , alpha , x , y ) )
num_bad = len ( bad_pixels )
return ( num_bad == 0 , bad_pixels )
2012-03-24 00:36:37 +00:00
def test_compare_images ( ) :
b = mapnik . Image . open ( ' ./images/support/b.png ' )
2012-06-21 19:44:57 +00:00
b . premultiply ( )
2012-03-24 00:36:37 +00:00
for name in mapnik . CompositeOp . names :
a = mapnik . Image . open ( ' ./images/support/a.png ' )
2012-06-21 19:44:57 +00:00
a . premultiply ( )
2012-03-24 00:36:37 +00:00
a . composite ( b , getattr ( mapnik . CompositeOp , name ) )
actual = ' /tmp/mapnik-comp-op-test- ' + name + ' .png '
expected = ' images/composited/ ' + name + ' .png '
2012-08-03 21:13:13 +00:00
valid = validate_pixels_are_premultiplied ( a )
if not valid [ 0 ] :
print ' %s not validly pre-: \n \t %s pixels ( %s ) ' % ( name , len ( valid [ 1 ] ) , valid [ 1 ] [ 0 ] )
2012-06-21 19:44:57 +00:00
a . demultiply ( )
2012-08-03 21:13:13 +00:00
valid = validate_pixels_are_demultiplied ( a )
if not valid [ 0 ] :
print ' %s not validly de-: \n \t %s pixels ( %s ) ' % ( name , len ( valid [ 1 ] ) , valid [ 1 ] [ 0 ] )
2012-03-24 00:36:37 +00:00
a . save ( actual )
expected_im = mapnik . Image . open ( expected )
# compare them
eq_ ( a . tostring ( ) , expected_im . tostring ( ) , ' failed comparing actual ( %s ) and expected( %s ) ' % ( actual , ' tests/python_tests/ ' + expected ) )
2012-06-21 19:44:57 +00:00
b . demultiply ( )
# b will be slightly modified by pre and then de multiplication rounding errors
# TODO - write test to ensure the image is 99% the same.
#expected_b = mapnik.Image.open('./images/support/b.png')
#b.save('/tmp/mapnik-comp-op-test-original-mask.png')
#eq_(b.tostring(),expected_b.tostring(), '/tmp/mapnik-comp-op-test-original-mask.png is no longer equivalent to original mask: ./images/support/b.png')
2012-03-24 00:36:37 +00:00
if __name__ == " __main__ " :
setup ( )
[ eval ( run ) ( ) for run in dir ( ) if ' test_ ' in run ]