Index: tools/telemetry/telemetry/png_bitmap.py |
diff --git a/tools/telemetry/telemetry/png_bitmap.py b/tools/telemetry/telemetry/png_bitmap.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6914dfbbbaaad0b287e34cc2f8d6a09967466f17 |
--- /dev/null |
+++ b/tools/telemetry/telemetry/png_bitmap.py |
@@ -0,0 +1,69 @@ |
+# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+import sys |
+import os |
+import base64 |
+ |
+PNG_PATH = os.path.join(os.path.dirname(__file__), '../third_party/png') |
+if PNG_PATH not in sys.path: |
+ sys.path.append(PNG_PATH) |
+ |
+import png # pylint: disable=F0401 |
+ |
+class PngColor(object): |
+ """Encapsulates an RGB color retreived from a PngBitmap""" |
+ |
+ def __init__(self, r, g, b, a=255): |
+ self.r = r |
+ self.g = g |
+ self.b = b |
+ self.a = a |
+ |
+ def IsEqual(self, expected_color, tolerance=0): |
+ """Verifies that the color is within a given tolerance of |
+ the expected color""" |
+ r_diff = abs(self.r - expected_color.r) |
+ g_diff = abs(self.g - expected_color.g) |
+ b_diff = abs(self.b - expected_color.b) |
+ a_diff = abs(self.a - expected_color.a) |
+ return (r_diff <= tolerance and g_diff <= tolerance |
+ and b_diff <= tolerance and a_diff <= tolerance) |
+ |
+ def AssertIsRGB(self, r, g, b, tolerance=0): |
+ assert self.IsEqual(PngColor(r, g, b), tolerance) |
+ |
+ def AssertIsRGBA(self, r, g, b, a, tolerance=0): |
+ assert self.IsEqual(PngColor(r, g, b, a), tolerance) |
+ |
+class PngBitmap(object): |
+ """Utilities for parsing and inspecting inspecting a PNG""" |
+ |
+ def __init__(self, base64_png): |
+ self._png_data = base64.b64decode(base64_png) |
+ self._png = png.Reader(bytes=self._png_data) |
+ rgba8_data = self._png.asRGBA8() |
+ self._width = rgba8_data[0] |
+ self._height = rgba8_data[1] |
+ self._pixels = list(rgba8_data[2]) |
+ self._metadata = rgba8_data[3] |
+ |
+ @property |
+ def width(self): |
+ """Width of the snapshot""" |
+ return self._width |
+ |
+ @property |
+ def height(self): |
+ """Height of the snapshot""" |
+ return self._height |
+ |
+ def GetPixelColor(self, x, y): |
+ """Returns a PngColor for the pixel at (x, y)""" |
+ row = self._pixels[y] |
+ offset = x * 4 |
+ return PngColor(row[offset], row[offset+1], row[offset+2], row[offset+3]) |
+ |
+ def WriteFile(self, path): |
+ with open(path, "wb") as f: |
+ f.write(self._png_data) |