fune/gfx/layers/LayersLogging.cpp
Sebastian Hengst 6d4637aebb Backed out 15 changesets (bug 951793) because it landed before the necessary servo changes. r=backout requested by emilio on a CLOSED TREE
Backed out changeset ca8c86e229df (bug 951793)
Backed out changeset 6eef6403fa71 (bug 951793)
Backed out changeset a5e529f52fb1 (bug 951793)
Backed out changeset 054e837609d0 (bug 951793)
Backed out changeset 713a3c9617ce (bug 951793)
Backed out changeset 884913aa1668 (bug 951793)
Backed out changeset c3340b84e534 (bug 951793)
Backed out changeset 50fe3c6ac486 (bug 951793)
Backed out changeset be4e22e5c257 (bug 951793)
Backed out changeset 7055bd5dfc4e (bug 951793)
Backed out changeset fa6da1e723cf (bug 951793)
Backed out changeset 386f77004d89 (bug 951793)
Backed out changeset fa82cdc01408 (bug 951793)
Backed out changeset 867d8ea5355c (bug 951793)
Backed out changeset e61ac8e48971 (bug 951793)
2017-11-25 01:01:41 +02:00

455 lines
13 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "LayersLogging.h"
#include <stdint.h> // for uint8_t
#include "ImageTypes.h" // for ImageFormat
#include "mozilla/gfx/Matrix.h" // for Matrix4x4, Matrix
#include "mozilla/gfx/Point.h" // for IntSize
#include "nsDebug.h" // for NS_ERROR
#include "nsPoint.h" // for nsPoint
#include "nsRect.h" // for nsRect
#include "base/basictypes.h"
using namespace mozilla::gfx;
namespace mozilla {
namespace layers {
void
AppendToString(std::stringstream& aStream, const void* p,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString("%p", p).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, FrameMetrics::ViewID n,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << n;
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const Color& c,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString(
"rgba(%d, %d, %d, %f)",
uint8_t(c.r*255.f), uint8_t(c.g*255.f), uint8_t(c.b*255.f), c.a).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const nsPoint& p,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString("(x=%d, y=%d)", p.x, p.y).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const nsRect& r,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString(
"(x=%d, y=%d, w=%d, h=%d)",
r.x, r.y, r.Width(), r.Height()).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const wr::ColorF& c,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString(
"rgba(%d, %d, %d, %f)",
uint8_t(c.r*255.f), uint8_t(c.g*255.f), uint8_t(c.b*255.f), c.a).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const wr::LayoutRect& r,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString(
"(x=%f, y=%f, w=%f, h=%f)",
r.origin.x, r.origin.y, r.size.width, r.size.height).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const wr::LayoutSize& s,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString(
"(w=%f, h=%f)",
s.width, s.height).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const nsSize& sz,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString(
"(w=%d, h=%d)",
sz.width, sz.height).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const wr::StickyOffsetBounds& s,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString("(min=%f max=%f)",
s.min, s.max).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const nsRegion& r,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << "< ";
for (auto iter = r.RectIter(); !iter.Done(); iter.Next()) {
AppendToString(aStream, iter.Get());
aStream << "; ";
}
aStream << ">";
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const nsIntRegion& r,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << "< ";
for (auto iter = r.RectIter(); !iter.Done(); iter.Next()) {
AppendToString(aStream, iter.Get());
aStream << "; ";
}
aStream << ">";
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const EventRegions& e,
const char* pfx, const char* sfx)
{
aStream << pfx << "{";
if (!e.mHitRegion.IsEmpty()) {
AppendToString(aStream, e.mHitRegion, " hitregion=", "");
}
if (!e.mDispatchToContentHitRegion.IsEmpty()) {
AppendToString(aStream, e.mDispatchToContentHitRegion, " dispatchtocontentregion=", "");
}
if (!e.mNoActionRegion.IsEmpty()) {
AppendToString(aStream, e.mNoActionRegion, " NoActionRegion=","");
}
if (!e.mHorizontalPanRegion.IsEmpty()) {
AppendToString(aStream, e.mHorizontalPanRegion, " HorizontalPanRegion=", "");
}
if (!e.mVerticalPanRegion.IsEmpty()) {
AppendToString(aStream, e.mVerticalPanRegion, " VerticalPanRegion=", "");
}
aStream << "}" << sfx;
}
void
AppendToString(std::stringstream& aStream, const ScrollMetadata& m,
const char* pfx, const char* sfx)
{
aStream << pfx;
AppendToString(aStream, m.GetMetrics(), "{ [metrics=");
AppendToString(aStream, m.GetBackgroundColor(), "] [color=");
if (m.GetScrollParentId() != FrameMetrics::NULL_SCROLL_ID) {
AppendToString(aStream, m.GetScrollParentId(), "] [scrollParent=");
}
if (m.HasScrollClip()) {
AppendToString(aStream, m.ScrollClip().GetClipRect(), "] [clip=");
}
if (m.HasMaskLayer()) {
AppendToString(aStream, m.ScrollClip().GetMaskLayerIndex().value(), "] [mask=");
}
aStream << "] }" << sfx;
}
void
AppendToString(std::stringstream& aStream, const FrameMetrics& m,
const char* pfx, const char* sfx, bool detailed)
{
aStream << pfx;
AppendToString(aStream, m.GetCompositionBounds(), "{ [cb=");
AppendToString(aStream, m.GetScrollableRect(), "] [sr=");
AppendToString(aStream, m.GetScrollOffset(), "] [s=");
if (m.GetDoSmoothScroll()) {
AppendToString(aStream, m.GetSmoothScrollOffset(), "] [ss=");
}
AppendToString(aStream, m.GetDisplayPort(), "] [dp=");
AppendToString(aStream, m.GetCriticalDisplayPort(), "] [cdp=");
if (!detailed) {
AppendToString(aStream, m.GetScrollId(), "] [scrollId=");
if (m.IsRootContent()) {
aStream << "] [rcd";
}
AppendToString(aStream, m.GetZoom(), "] [z=", "] }");
} else {
AppendToString(aStream, m.GetDisplayPortMargins(), " [dpm=");
aStream << nsPrintfCString("] um=%d", m.GetUseDisplayPortMargins()).get();
AppendToString(aStream, m.GetRootCompositionSize(), "] [rcs=");
AppendToString(aStream, m.GetViewport(), "] [v=");
aStream << nsPrintfCString("] [z=(ld=%.3f r=%.3f",
m.GetDevPixelsPerCSSPixel().scale,
m.GetPresShellResolution()).get();
AppendToString(aStream, m.GetCumulativeResolution(), " cr=");
AppendToString(aStream, m.GetZoom(), " z=");
AppendToString(aStream, m.GetExtraResolution(), " er=");
aStream << nsPrintfCString(")] [u=(%d %d %" PRIu32 ")",
m.GetScrollUpdateType(), m.GetDoSmoothScroll(),
m.GetScrollGeneration()).get();
aStream << nsPrintfCString("] [i=(%" PRIu32 " %" PRIu64 " %d)] }",
m.GetPresShellId(), m.GetScrollId(), m.IsRootContent()).get();
}
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const ScrollableLayerGuid& s,
const char* pfx, const char* sfx)
{
aStream << pfx
<< nsPrintfCString("{ l=0x%" PRIx64 ", p=%u, v=%" PRIu64 " }", s.mLayersId, s.mPresShellId, s.mScrollId).get()
<< sfx;
}
void
AppendToString(std::stringstream& aStream, const ZoomConstraints& z,
const char* pfx, const char* sfx)
{
aStream << pfx
<< nsPrintfCString("{ z=%d dt=%d min=%f max=%f }", z.mAllowZoom, z.mAllowDoubleTapZoom, z.mMinZoom.scale, z.mMaxZoom.scale).get()
<< sfx;
}
void
AppendToString(std::stringstream& aStream, const Matrix& m,
const char* pfx, const char* sfx)
{
aStream << pfx;
if (m.IsIdentity()) {
aStream << "[ I ]";
} else {
aStream << nsPrintfCString(
"[ %g %g; %g %g; %g %g; ]",
m._11, m._12, m._21, m._22, m._31, m._32).get();
}
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const Matrix5x4& m,
const char* pfx, const char* sfx)
{
aStream << pfx;
aStream << nsPrintfCString(
"[ %g %g %g %g; %g %g %g %g; %g %g %g %g; %g %g %g %g; %g %g %g %g]",
m._11, m._12, m._13, m._14,
m._21, m._22, m._23, m._24,
m._31, m._32, m._33, m._34,
m._41, m._42, m._43, m._44,
m._51, m._52, m._53, m._54).get();
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, const SamplingFilter filter,
const char* pfx, const char* sfx)
{
aStream << pfx;
switch (filter) {
case SamplingFilter::GOOD: aStream << "SamplingFilter::GOOD"; break;
case SamplingFilter::LINEAR: aStream << "SamplingFilter::LINEAR"; break;
case SamplingFilter::POINT: aStream << "SamplingFilter::POINT"; break;
default:
NS_ERROR("unknown SamplingFilter type");
aStream << "???";
}
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, TextureFlags flags,
const char* pfx, const char* sfx)
{
aStream << pfx;
if (flags == TextureFlags::NO_FLAGS) {
aStream << "NoFlags";
} else {
#define AppendFlag(test) \
{ \
if (!!(flags & test)) { \
if (previous) { \
aStream << "|"; \
} \
aStream << #test; \
previous = true; \
} \
}
bool previous = false;
AppendFlag(TextureFlags::USE_NEAREST_FILTER);
AppendFlag(TextureFlags::ORIGIN_BOTTOM_LEFT);
AppendFlag(TextureFlags::DISALLOW_BIGIMAGE);
#undef AppendFlag
}
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, mozilla::gfx::SurfaceFormat format,
const char* pfx, const char* sfx)
{
aStream << pfx;
switch (format) {
case SurfaceFormat::B8G8R8A8: aStream << "SurfaceFormat::B8G8R8A8"; break;
case SurfaceFormat::B8G8R8X8: aStream << "SurfaceFormat::B8G8R8X8"; break;
case SurfaceFormat::R8G8B8A8: aStream << "SurfaceFormat::R8G8B8A8"; break;
case SurfaceFormat::R8G8B8X8: aStream << "SurfaceFormat::R8G8B8X8"; break;
case SurfaceFormat::R5G6B5_UINT16:
aStream << "SurfaceFormat::R5G6B5_UINT16"; break;
case SurfaceFormat::A8: aStream << "SurfaceFormat::A8"; break;
case SurfaceFormat::YUV: aStream << "SurfaceFormat::YUV"; break;
case SurfaceFormat::NV12: aStream << "SurfaceFormat::NV12"; break;
case SurfaceFormat::YUV422: aStream << "SurfaceFormat::YUV422"; break;
case SurfaceFormat::UNKNOWN: aStream << "SurfaceFormat::UNKNOWN"; break;
default:
NS_ERROR("unknown surface format");
aStream << "???";
}
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, gfx::SurfaceType aType,
const char* pfx, const char* sfx)
{
aStream << pfx;
switch(aType) {
case SurfaceType::DATA:
aStream << "SurfaceType::DATA"; break;
case SurfaceType::D2D1_BITMAP:
aStream << "SurfaceType::D2D1_BITMAP"; break;
case SurfaceType::D2D1_DRAWTARGET:
aStream << "SurfaceType::D2D1_DRAWTARGET"; break;
case SurfaceType::CAIRO:
aStream << "SurfaceType::CAIRO"; break;
case SurfaceType::CAIRO_IMAGE:
aStream << "SurfaceType::CAIRO_IMAGE"; break;
case SurfaceType::COREGRAPHICS_IMAGE:
aStream << "SurfaceType::COREGRAPHICS_IMAGE"; break;
case SurfaceType::COREGRAPHICS_CGCONTEXT:
aStream << "SurfaceType::COREGRAPHICS_CGCONTEXT"; break;
case SurfaceType::SKIA:
aStream << "SurfaceType::SKIA"; break;
case SurfaceType::DUAL_DT:
aStream << "SurfaceType::DUAL_DT"; break;
case SurfaceType::D2D1_1_IMAGE:
aStream << "SurfaceType::D2D1_1_IMAGE"; break;
case SurfaceType::RECORDING:
aStream << "SurfaceType::RECORDING"; break;
case SurfaceType::TILED:
aStream << "SurfaceType::TILED"; break;
case SurfaceType::DATA_SHARED:
aStream << "SurfaceType::DATA_SHARED"; break;
default:
NS_ERROR("unknown surface type");
aStream << "???";
}
aStream << sfx;
}
void
AppendToString(std::stringstream& aStream, ImageFormat format,
const char* pfx, const char* sfx)
{
aStream << pfx;
switch (format) {
case ImageFormat::PLANAR_YCBCR:
aStream << "ImageFormat::PLANAR_YCBCR"; break;
case ImageFormat::SHARED_RGB:
aStream << "ImageFormat::SHARED_RGB"; break;
case ImageFormat::CAIRO_SURFACE:
aStream << "ImageFormat::CAIRO_SURFACE"; break;
case ImageFormat::MAC_IOSURFACE:
aStream << "ImageFormat::MAC_IOSURFACE"; break;
case ImageFormat::SURFACE_TEXTURE:
aStream << "ImageFormat::SURFACE_TEXTURE"; break;
case ImageFormat::D3D9_RGB32_TEXTURE:
aStream << "ImageFormat::D3D9_RBG32_TEXTURE"; break;
case ImageFormat::OVERLAY_IMAGE:
aStream << "ImageFormat::OVERLAY_IMAGE"; break;
case ImageFormat::D3D11_SHARE_HANDLE_TEXTURE:
aStream << "ImageFormat::D3D11_SHARE_HANDLE_TEXTURE"; break;
default:
NS_ERROR("unknown image format");
aStream << "???";
}
aStream << sfx;
}
} // namespace layers
} // namespace mozilla
void
print_stderr(std::stringstream& aStr)
{
#if defined(ANDROID)
// On Android logcat output is truncated to 1024 chars per line, and
// we usually use std::stringstream to build up giant multi-line gobs
// of output. So to avoid the truncation we find the newlines and
// print the lines individually.
std::string line;
while (std::getline(aStr, line)) {
printf_stderr("%s\n", line.c_str());
}
#else
printf_stderr("%s", aStr.str().c_str());
#endif
}
void
fprint_stderr(FILE* aFile, std::stringstream& aStr)
{
if (aFile == stderr) {
print_stderr(aStr);
} else {
fprintf_stderr(aFile, "%s", aStr.str().c_str());
}
}