blob: 1ad9a37a7f162b98b59f803d0b63afec3b23be2e [file] [log] [blame]
import lldb
def summarize_nscolor(valobj, internal_dict):
colors = {
"#800000": "maroon",
"#ff0000": "red",
"#ffa500": "orange",
"#ffff00": "yellow",
"#808000": "olive",
"#800080": "purple",
"#ff00ff": "fuchsia",
"#ffffff": "white",
"#00ff00": "lime",
"#008000": "green",
"#000080": "navy",
"#0000ff": "blue",
"#00ffff": "aqua",
"#008080": "teal",
"#000000": "black",
"#c0c0c0": "silver",
"#808080": "gray"
}
value = valobj.GetValueAsUnsigned(0)
if value == 0:
return "transparent"
if value & 0xff000000 != 0xff000000:
return "rgba(%d, %d, %d, %f)" % (value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, ((value >> 24) & 0xff) / 255.0)
color = "#%02x%02x%02x" % (value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff)
if color in colors:
return colors[color]
return color
class RegionSyntheticChildrenProvider:
def __init__(self, valobj, internal_dict, rect_type = "nsRect"):
self.rect_type = rect_type
self.valobj = valobj
self.pixman_region = self.valobj.GetChildMemberWithName("mImpl")
self.pixman_data = self.pixman_region.GetChildMemberWithName("data")
self.pixman_extents = self.pixman_region.GetChildMemberWithName("extents")
self.num_rects = self.pixman_region_num_rects()
self.box_type = self.pixman_extents.GetType()
self.box_type_size = self.box_type.GetByteSize()
self.box_list_base_ptr = self.pixman_data.GetValueAsUnsigned(0) + self.pixman_data.GetType().GetPointeeType().GetByteSize()
def pixman_region_num_rects(self):
if self.pixman_data.GetValueAsUnsigned(0):
return self.pixman_data.Dereference().GetChildMemberWithName("numRects").GetValueAsUnsigned(0)
return 1
def num_children(self):
return 2 + self.num_rects
def get_child_index(self, name):
if name == "numRects":
return 0
if name == "bounds":
return 1
return None
def convert_pixman_box_to_rect(self, valobj, name):
x1 = valobj.GetChildMemberWithName("x1").GetValueAsSigned()
x2 = valobj.GetChildMemberWithName("x2").GetValueAsSigned()
y1 = valobj.GetChildMemberWithName("y1").GetValueAsSigned()
y2 = valobj.GetChildMemberWithName("y2").GetValueAsSigned()
return valobj.CreateValueFromExpression(name,
'%s(%d, %d, %d, %d)' % (self.rect_type, x1, y1, x2 - x1, y2 - y1))
def get_child_at_index(self, index):
if index == 0:
return self.pixman_data.CreateValueFromExpression('numRects', '(uint32_t)%d' % self.num_rects)
if index == 1:
return self.convert_pixman_box_to_rect(self.pixman_extents, 'bounds')
rect_index = index - 2
if rect_index >= self.num_rects:
return None
if self.num_rects == 1:
return self.convert_pixman_box_to_rect(self.pixman_extents, 'bounds')
box_address = self.box_list_base_ptr + rect_index * self.box_type_size
box = self.pixman_data.CreateValueFromAddress('', box_address, self.box_type)
return self.convert_pixman_box_to_rect(box, "[%d]" % rect_index)
class IntRegionSyntheticChildrenProvider:
def __init__(self, valobj, internal_dict):
wrapped_region = valobj.GetChildMemberWithName("mImpl")
self.wrapped_provider = RegionSyntheticChildrenProvider(wrapped_region, internal_dict, "nsIntRect")
def num_children(self):
return self.wrapped_provider.num_children()
def get_child_index(self, name):
return self.wrapped_provider.get_child_index(name)
def get_child_at_index(self, index):
return self.wrapped_provider.get_child_at_index(index)
def summarize_rect(valobj, internal_dict):
x = valobj.GetChildMemberWithName("x").GetValue()
y = valobj.GetChildMemberWithName("y").GetValue()
width = valobj.GetChildMemberWithName("width").GetValue()
height = valobj.GetChildMemberWithName("height").GetValue()
return "%s, %s, %s, %s" % (x, y, width, height)
def rect_is_empty(valobj):
width = valobj.GetChildMemberWithName("width").GetValueAsSigned()
height = valobj.GetChildMemberWithName("height").GetValueAsSigned()
return width <= 0 or height <= 0
def summarize_region(valobj, internal_dict):
# This function makes use of the synthetic children generated for ns(Int)Regions.
bounds = valobj.GetChildMemberWithName("bounds")
bounds_summary = summarize_rect(bounds, internal_dict)
num_rects = valobj.GetChildMemberWithName("numRects").GetValueAsUnsigned(0)
if num_rects <= 1:
if rect_is_empty(bounds):
return "empty"
if num_rects == 1:
return "one rect: " + bounds_summary
return str(num_rects) + " rects, bounds: " + bounds_summary
def init(debugger):
debugger.HandleCommand("type summary add nscolor -v -F lldbutils.gfx.summarize_nscolor")
debugger.HandleCommand("type summary add nsRect -v -F lldbutils.gfx.summarize_rect")
debugger.HandleCommand("type summary add nsIntRect -v -F lldbutils.gfx.summarize_rect")
debugger.HandleCommand("type summary add gfxRect -v -F lldbutils.gfx.summarize_rect")
debugger.HandleCommand("type synthetic add nsRegion -l lldbutils.gfx.RegionSyntheticChildrenProvider")
debugger.HandleCommand("type synthetic add nsIntRegion -l lldbutils.gfx.IntRegionSyntheticChildrenProvider")
debugger.HandleCommand("type summary add nsRegion -v -F lldbutils.gfx.summarize_region")
debugger.HandleCommand("type summary add nsIntRegion -v -F lldbutils.gfx.summarize_region")