131 lines
5.6 KiB
Python
131 lines
5.6 KiB
Python
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")
|