diff options
author | Ben Wagner <bungeman@google.com> | 2017-10-18 17:34:09 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-10-23 20:45:09 +0000 |
commit | 85c6aad62db7c7c5daa47eff871fbd1483c8dff9 (patch) | |
tree | 495073e82d945b28f38a1086041b57a6a84172e5 | |
parent | e252f08982b0c747cd4d34c00ce413ab1005e99a (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>
-rw-r--r-- | tools/gdb/bitmap.py | 83 |
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() |