aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/gdb/bitmap.py
diff options
context:
space:
mode:
authorGravatar Ben Wagner <bungeman@google.com>2017-10-18 17:34:09 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-23 20:45:09 +0000
commit85c6aad62db7c7c5daa47eff871fbd1483c8dff9 (patch)
tree495073e82d945b28f38a1086041b57a6a84172e5 /tools/gdb/bitmap.py
parente252f08982b0c747cd4d34c00ce413ab1005e99a (diff)
Add a gdb viewer for skbitmap.
Change-Id: I0d021e5006c3424d1fcb5498385c192d569f2c42 Reviewed-on: https://skia-review.googlesource.com/61860 Commit-Queue: Ben Wagner <bungeman@google.com> Reviewed-by: Herb Derby <herb@google.com>
Diffstat (limited to 'tools/gdb/bitmap.py')
-rw-r--r--tools/gdb/bitmap.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/tools/gdb/bitmap.py b/tools/gdb/bitmap.py
new file mode 100644
index 0000000000..e9e18f973e
--- /dev/null
+++ b/tools/gdb/bitmap.py
@@ -0,0 +1,83 @@
+# Copyright 2017 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Visualize bitmaps in gdb.
+
+(gdb) source <path to this file>
+(gdb) sk_bitmap <symbol>
+
+This should pop up a window with the bitmap displayed.
+Right clicking should bring up a menu, allowing the
+bitmap to be saved to a file.
+"""
+
+import gdb
+from enum import Enum
+try:
+ from PIL import Image
+except ImportError:
+ import Image
+
+class ColorType(Enum):
+ unknown = 0
+ alpha_8 = 1
+ rgb_565 = 2
+ argb_4444 = 3
+ rgba_8888 = 4
+ bgra_8888 = 5
+ gray_8 = 6
+ rgba_F16 = 7
+
+class AlphaType(Enum):
+ unknown = 0
+ opaque = 1
+ premul = 2
+ unpremul = 3
+
+class sk_bitmap(gdb.Command):
+ """Displays the content of an SkBitmap image."""
+
+ def __init__(self):
+ super(sk_bitmap, self).__init__('sk_bitmap',
+ gdb.COMMAND_SUPPORT,
+ gdb.COMPLETE_FILENAME)
+
+ def invoke(self, arg, from_tty):
+ frame = gdb.selected_frame()
+ val = frame.read_var(arg)
+ if str(val.type.strip_typedefs()) == 'SkBitmap':
+ pixels = val['fPixels']
+ row_bytes = val['fRowBytes']
+ info = val['fInfo']
+ width = info['fWidth']
+ height = info['fHeight']
+ color_type = info['fColorType']
+ alpha_type = info['fAlphaType']
+
+ process = gdb.selected_inferior()
+ memory_data = process.read_memory(pixels, row_bytes * height)
+ size = (width, height)
+ image = None
+ # See Unpack.c for the values understood after the "raw" parameter.
+ if color_type == ColorType.bgra_8888.value:
+ if alpha_type == AlphaType.unpremul.value:
+ image = Image.frombytes("RGBA", size, memory_data.tobytes(),
+ "raw", "BGRA", row_bytes, 1)
+ elif alpha_type == AlphaType.premul.value:
+ # RGBA instead of RGBa, because Image.show() doesn't work with RGBa.
+ image = Image.frombytes("RGBA", size, memory_data.tobytes(),
+ "raw", "BGRa", row_bytes, 1)
+
+ if image:
+ # Fails on premultiplied alpha, it cannot convert to RGB.
+ image.show()
+ else:
+ print ("Need to add support for %s %s." % (
+ str(ColorType(int(color_type))),
+ str(AlphaType(int(alpha_type)))
+ ))
+
+sk_bitmap()