1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# found in the LICENSE file. 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import os 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import tempfile 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import unittest 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry import benchmark 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)from telemetry.core import bitmap 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)from telemetry.core import util 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# This is a simple base64 encoded 2x2 PNG which contains, in order, a single 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)# Red, Yellow, Blue, and Green pixel. 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)test_png = """ 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)JpzAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACx 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)MBAJqcGAAAABZJREFUCNdj/M/AwPCfgYGB4T/DfwY 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)AHAAD/iOWZXsAAAAASUVORK5CYII= 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)""" 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)test_png_path = os.path.join(util.GetUnittestDataDir(), 'test_png.png') 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)test_png_2_path = os.path.join(util.GetUnittestDataDir(), 'test_png_2.png') 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class HistogramDistanceTest(unittest.TestCase): 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) def testNoData(self): 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist1 = [] 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist2 = [] 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertRaises( 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ValueError, lambda: bitmap.HistogramDistance(hist1, hist2)) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist1 = [0, 0, 0] 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist2 = [0, 0, 0] 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertRaises( 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ValueError, lambda: bitmap.HistogramDistance(hist1, hist2)) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) def testWrongSizes(self): 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist1 = [1] 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist2 = [1, 0] 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertRaises( 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ValueError, lambda: bitmap.HistogramDistance(hist1, hist2)) 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) def testNoDistance(self): 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist1 = [2, 4, 1, 8, 0, -1] 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist2 = [2, 4, 1, 8, 0, -1] 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual(bitmap.HistogramDistance(hist1, hist2), 0) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) def testNormalizeCounts(self): 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist1 = [0, 0, 1, 0, 0] 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist2 = [0, 0, 0, 0, 7] 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual(bitmap.HistogramDistance(hist1, hist2), 2) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual(bitmap.HistogramDistance(hist2, hist1), 2) 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) def testDistance(self): 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist1 = [2, 0, 1, 3, 4] 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist2 = [3, 1, 2, 4, 0] 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual(bitmap.HistogramDistance(hist1, hist2), 1) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual(bitmap.HistogramDistance(hist2, hist1), 1) 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist1 = [0, 1, 3, 1] 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist2 = [2, 2, 1, 0] 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual(bitmap.HistogramDistance(hist1, hist2), 1.2) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual(bitmap.HistogramDistance(hist2, hist1), 1.2) 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class BitmapTest(unittest.TestCase): 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) # pylint: disable=C0324 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def testReadFromBase64Png(self): 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bmp = bitmap.Bitmap.FromBase64Png(test_png) 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(2, bmp.width) 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(2, bmp.height) 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bmp.GetPixelColor(0, 0).AssertIsRGB(255, 0, 0) 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bmp.GetPixelColor(1, 1).AssertIsRGB(0, 255, 0) 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bmp.GetPixelColor(0, 1).AssertIsRGB(0, 0, 255) 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bmp.GetPixelColor(1, 0).AssertIsRGB(255, 255, 0) 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def testReadFromPngFile(self): 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_bmp = bitmap.Bitmap.FromPngFile(test_png_path) 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(2, file_bmp.width) 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(2, file_bmp.height) 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_bmp.GetPixelColor(0, 0).AssertIsRGB(255, 0, 0) 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_bmp.GetPixelColor(1, 1).AssertIsRGB(0, 255, 0) 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_bmp.GetPixelColor(0, 1).AssertIsRGB(0, 0, 255) 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_bmp.GetPixelColor(1, 0).AssertIsRGB(255, 255, 0) 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def testWritePngToPngFile(self): 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) orig = bitmap.Bitmap.FromPngFile(test_png_path) 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) temp_file = tempfile.NamedTemporaryFile().name 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) orig.WritePngFile(temp_file) 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new_file = bitmap.Bitmap.FromPngFile(temp_file) 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertTrue(orig.IsEqual(new_file)) 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @benchmark.Disabled 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def testWriteCroppedBmpToPngFile(self): 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pixels = [255,0,0, 255,255,0, 0,0,0, 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 255,255,0, 0,255,0, 0,0,0] 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) orig = bitmap.Bitmap(3, 3, 2, pixels) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) orig.Crop(0, 0, 2, 2) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temp_file = tempfile.NamedTemporaryFile().name 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) orig.WritePngFile(temp_file) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_file = bitmap.Bitmap.FromPngFile(temp_file) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertTrue(orig.IsEqual(new_file)) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def testIsEqual(self): 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bmp = bitmap.Bitmap.FromBase64Png(test_png) 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_bmp = bitmap.Bitmap.FromPngFile(test_png_path) 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertTrue(bmp.IsEqual(file_bmp)) 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) def testDiff(self): 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_bmp = bitmap.Bitmap.FromPngFile(test_png_path) 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_bmp_2 = bitmap.Bitmap.FromPngFile(test_png_2_path) 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp = file_bmp.Diff(file_bmp) 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(2, diff_bmp.width) 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(2, diff_bmp.height) 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(0, 0).AssertIsRGB(0, 0, 0) 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(1, 1).AssertIsRGB(0, 0, 0) 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(0, 1).AssertIsRGB(0, 0, 0) 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(1, 0).AssertIsRGB(0, 0, 0) 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp = file_bmp.Diff(file_bmp_2) 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(3, diff_bmp.width) 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) self.assertEquals(3, diff_bmp.height) 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(0, 0).AssertIsRGB(0, 255, 255) 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(1, 1).AssertIsRGB(255, 0, 255) 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(0, 1).AssertIsRGB(255, 255, 0) 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(1, 0).AssertIsRGB(0, 0, 255) 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(0, 2).AssertIsRGB(255, 255, 255) 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(1, 2).AssertIsRGB(255, 255, 255) 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(2, 0).AssertIsRGB(255, 255, 255) 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(2, 1).AssertIsRGB(255, 255, 255) 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) diff_bmp.GetPixelColor(2, 2).AssertIsRGB(255, 255, 255) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @benchmark.Disabled 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def testGetBoundingBox(self): 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pixels = [0,0,0, 0,0,0, 0,0,0, 0,0,0, 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0,0,0, 1,0,0, 1,0,0, 0,0,0, 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0,0,0, 0,0,0, 0,0,0, 0,0,0] 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bmp = bitmap.Bitmap(3, 4, 3, pixels) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) box, count = bmp.GetBoundingBox(bitmap.RgbaColor(1, 0, 0)) 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(box, (1, 1, 2, 1)) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(count, 2) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) box, count = bmp.GetBoundingBox(bitmap.RgbaColor(0, 1, 0)) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(box, None) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(count, 0) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @benchmark.Disabled 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def testCrop(self): 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pixels = [0,0,0, 1,0,0, 2,0,0, 3,0,0, 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0,1,0, 1,1,0, 2,1,0, 3,1,0, 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0,2,0, 1,2,0, 2,2,0, 3,2,0] 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bmp = bitmap.Bitmap(3, 4, 3, pixels) 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bmp.Crop(1, 2, 2, 1) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(bmp.width, 2) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(bmp.height, 1) 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bmp.GetPixelColor(0, 0).AssertIsRGB(1, 2, 0) 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bmp.GetPixelColor(1, 0).AssertIsRGB(2, 2, 0) 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEquals(bmp.pixels, bytearray([1,2,0, 2,2,0])) 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @benchmark.Disabled 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def testHistogram(self): 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pixels = [1,2,3, 1,2,3, 1,2,3, 1,2,3, 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1,2,3, 8,7,6, 5,4,6, 1,2,3, 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1,2,3, 8,7,6, 5,4,6, 1,2,3] 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bmp = bitmap.Bitmap(3, 4, 3, pixels) 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bmp.Crop(1, 1, 2, 2) 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histogram = bmp.ColorHistogram() 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for i in xrange(3): 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(sum(histogram[i]), bmp.width * bmp.height) 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[1], 0) 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[5], 2) 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[8], 2) 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[2], 0) 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[4], 2) 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[7], 2) 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.b[3], 0) 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.b[6], 4) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @benchmark.Disabled 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def testHistogramIgnoreColor(self): 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pixels = [1,2,3, 1,2,3, 1,2,3, 1,2,3, 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1,2,3, 8,7,6, 5,4,6, 1,2,3, 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1,2,3, 8,7,6, 5,4,6, 1,2,3] 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bmp = bitmap.Bitmap(3, 4, 3, pixels) 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histogram = bmp.ColorHistogram(ignore_color=bitmap.RgbaColor(1, 2, 3)) 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[1], 0) 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[5], 2) 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[8], 2) 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[2], 0) 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[4], 2) 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[7], 2) 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.b[3], 0) 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.b[6], 4) 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @benchmark.Disabled 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def testHistogramIgnoreColorTolerance(self): 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pixels = [1,2,3, 4,5,6, 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7,8,9, 8,7,6] 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bmp = bitmap.Bitmap(3, 2, 2, pixels) 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histogram = bmp.ColorHistogram(ignore_color=bitmap.RgbaColor(0, 1, 2), 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tolerance=1) 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[1], 0) 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[4], 1) 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[7], 1) 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.r[8], 1) 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[2], 0) 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[5], 1) 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[7], 1) 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.g[8], 1) 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.b[3], 0) 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.b[6], 2) 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(histogram.b[9], 1) 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @benchmark.Disabled 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) def testHistogramDistanceIgnoreColor(self): 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pixels = [1,2,3, 1,2,3, 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1,2,3, 1,2,3] 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bmp = bitmap.Bitmap(3, 2, 2, pixels) 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist1 = bmp.ColorHistogram(ignore_color=bitmap.RgbaColor(1, 2, 3)) 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hist2 = bmp.ColorHistogram() 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEquals(hist1.Distance(hist2), 0) 240