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