void BeginCompositingDisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const
{
    DisplayItem::dumpPropertiesAsDebugString(stringBuilder);
    stringBuilder.append(WTF::String::format(", xferMode: %d, opacity: %f", m_xferMode, m_opacity));
    if (m_hasBounds)
        stringBuilder.append(WTF::String::format(", bounds: [%f, %f, %f, %f]", m_bounds.location().x(), m_bounds.location().y(), m_bounds.size().width(), m_bounds.size().height()));
}
WTF::String DisplayItem::asDebugString() const
{
    WTF::StringBuilder stringBuilder;
    stringBuilder.append('{');
    dumpPropertiesAsDebugString(stringBuilder);
    stringBuilder.append('}');
    return stringBuilder.toString();
}
WTF::String DisplayItem::asDebugString() const
{
    if (!isValid())
        return "null";
    WTF::StringBuilder stringBuilder;
    stringBuilder.append('{');
    dumpPropertiesAsDebugString(stringBuilder);
    stringBuilder.append('}');
    return stringBuilder.toString();
}
void BeginTransform3DDisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const
{
    PairedBeginDisplayItem::dumpPropertiesAsDebugString(stringBuilder);
    TransformationMatrix::DecomposedType decomposition;
    if (m_transform.decompose(decomposition)) {
        stringBuilder.append(WTF::String::format(
            ", translate: [%lf,%lf,%lf], scale: [%lf,%lf,%lf], skew: [%lf,%lf,%lf], quarternion: [%lf,%lf,%lf,%lf], perspective: [%lf,%lf,%lf,%lf]",
            decomposition.translateX, decomposition.translateY, decomposition.translateZ,
            decomposition.scaleX, decomposition.scaleY, decomposition.scaleZ,
            decomposition.skewXY, decomposition.skewXZ, decomposition.skewYZ,
            decomposition.quaternionX, decomposition.quaternionY, decomposition.quaternionZ, decomposition.quaternionW,
            decomposition.perspectiveX, decomposition.perspectiveY, decomposition.perspectiveZ, decomposition.perspectiveW));
    }
    stringBuilder.append(String::format(", transformOrigin: [%f,%f,%f]", m_transformOrigin.x(), m_transformOrigin.y(), m_transformOrigin.z()));
}
void BeginClipPathDisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const
{
    DisplayItem::dumpPropertiesAsDebugString(stringBuilder);
    stringBuilder.append(WTF::String::format(", pathVerbs: %d, pathPoints: %d, windRule: \"%s\"",
        m_clipPath.countVerbs(), m_clipPath.countPoints(),
        m_clipPath.getFillType() == SkPath::kWinding_FillType ? "nonzero" : "evenodd"));
}
void BeginFilterDisplayItem::dumpPropertiesAsDebugString(
    WTF::StringBuilder& stringBuilder) const {
  DisplayItem::dumpPropertiesAsDebugString(stringBuilder);
  stringBuilder.append(
      WTF::String::format(", filter bounds: [%f,%f,%f,%f]", m_bounds.x(),
                          m_bounds.y(), m_bounds.width(), m_bounds.height()));
}
void DrawingDisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const
{
    DisplayItem::dumpPropertiesAsDebugString(stringBuilder);
    if (m_picture) {
        stringBuilder.append(WTF::String::format(", rect: [%f,%f %fx%f]",
            m_picture->cullRect().x(), m_picture->cullRect().y(),
            m_picture->cullRect().width(), m_picture->cullRect().height()));
    }
}
void DisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const
{
    if (!hasValidClient()) {
        stringBuilder.append("validClient: false, originalDebugString: ");
        // This is the original debug string which is in json format.
        stringBuilder.append(clientDebugString());
        return;
    }

    stringBuilder.append(String::format("client: \"%p", &client()));
    if (!clientDebugString().isEmpty()) {
        stringBuilder.append(' ');
        stringBuilder.append(clientDebugString());
    }
    stringBuilder.append("\", type: \"");
    stringBuilder.append(typeAsDebugString(type()));
    stringBuilder.append('"');
    if (m_skippedCache)
        stringBuilder.append(", skippedCache: true");
    if (m_scope)
        stringBuilder.append(String::format(", scope: %d", m_scope));
}
void DisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const
{
    stringBuilder.append(String::format("client: \"%p", client()));
    if (!clientDebugString().isEmpty()) {
        stringBuilder.append(' ');
        stringBuilder.append(clientDebugString());
    }
    stringBuilder.append("\", type: \"");
    stringBuilder.append(typeAsDebugString(type()));
    stringBuilder.append('"');
    if (m_skippedCache)
        stringBuilder.append(", skippedCache: true");
    if (m_scopeContainer)
        stringBuilder.append(String::format(", scope: \"%p,%d\"", m_scopeContainer, m_scopeId));
}
void BeginScrollDisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const
{
    PairedBeginDisplayItem::dumpPropertiesAsDebugString(stringBuilder);
    stringBuilder.append(WTF::String::format(", currentOffset: [%d,%d]", m_currentOffset.width(), m_currentOffset.height()));
}
void ClipDisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const
{
    DisplayItem::dumpPropertiesAsDebugString(stringBuilder);
    stringBuilder.append(WTF::String::format(", clipRect: [%d,%d,%d,%d]",
        m_clipRect.x(), m_clipRect.y(), m_clipRect.width(), m_clipRect.height()));
}
void BeginTransformDisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const
{
    PairedBeginDisplayItem::dumpPropertiesAsDebugString(stringBuilder);
    stringBuilder.append(WTF::String::format(", transform: [%lf,%lf,%lf,%lf,%lf,%lf]",
        m_transform.a(), m_transform.b(), m_transform.c(), m_transform.d(), m_transform.e(), m_transform.f()));
}