mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-29 21:25:35 +00:00
7ae5cf1e52
Create an Iterator type with classes ForwardIterator and ReverseIterator, having GetFirstChild/GetNextSibling and GetLastChild/GetPrevSibling methods, respectively. Specify the iterator type for each call to ForEachNode. With this, we can support trees with forward and reverse sibling structures. Additionally, apply these algorithms to all Layer recursive traversals, where applicable. Update tests to ensure both directions yield expected results. MozReview-Commit-ID: iYpX22XHTa --HG-- extra : rebase_source : 016d3c37e0679df7037dacd3366d3fa7748d0703 extra : amend_source : 089c4a62bd4716be087669742bb542c39a9f97c6
83 lines
2.6 KiB
C++
83 lines
2.6 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
* 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 "RenderTrace.h"
|
|
|
|
// If rendertrace is off let's no compile this code
|
|
#ifdef MOZ_RENDERTRACE
|
|
#include "Layers.h"
|
|
#include "TreeTraversal.h" // for ForEachNode
|
|
|
|
|
|
namespace mozilla {
|
|
namespace layers {
|
|
|
|
static gfx::Matrix4x4 GetRootTransform(Layer *aLayer) {
|
|
gfx::Matrix4x4 layerTrans = aLayer->GetTransform();
|
|
layerTrans.ProjectTo2D();
|
|
if (aLayer->GetParent() != nullptr) {
|
|
return GetRootTransform(aLayer->GetParent()) * layerTrans;
|
|
}
|
|
return layerTrans;
|
|
}
|
|
|
|
void RenderTraceLayers(Layer *aLayer, const char *aColor, const gfx::Matrix4x4 aRootTransform) {
|
|
int colorId = 0;
|
|
ForEachNode<ForwardIterator>(
|
|
aLayer,
|
|
[&colorId] (Layer *layer)
|
|
{
|
|
gfx::Matrix4x4 trans = aRootTransform * layer->GetTransform();
|
|
trans.ProjectTo2D();
|
|
gfx::IntRect clipRect = layer->GetLocalVisibleRegion().GetBounds();
|
|
Rect rect(clipRect.x, clipRect.y, clipRect.width, clipRect.height);
|
|
trans.TransformBounds(rect);
|
|
|
|
if (strcmp(layer->Name(), "ContainerLayer") != 0 &&
|
|
strcmp(layer->Name(), "ContainerLayerComposite") != 0) {
|
|
printf_stderr("%s RENDERTRACE %u rect #%02X%s %i %i %i %i\n",
|
|
layer->Name(), (int)PR_IntervalNow(),
|
|
colorId, aColor,
|
|
(int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
|
|
}
|
|
colorId++;
|
|
});
|
|
}
|
|
|
|
void RenderTraceInvalidateStart(Layer *aLayer, const char *aColor, const gfx::IntRect aRect) {
|
|
gfx::Matrix4x4 trans = GetRootTransform(aLayer);
|
|
gfx::Rect rect(aRect.x, aRect.y, aRect.width, aRect.height);
|
|
trans.TransformBounds(rect);
|
|
|
|
printf_stderr("%s RENDERTRACE %u fillrect #%s %i %i %i %i\n",
|
|
aLayer->Name(), (int)PR_IntervalNow(),
|
|
aColor,
|
|
(int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
|
|
}
|
|
void RenderTraceInvalidateEnd(Layer *aLayer, const char *aColor) {
|
|
// Clear with an empty rect
|
|
RenderTraceInvalidateStart(aLayer, aColor, gfx::IntRect());
|
|
}
|
|
|
|
void renderTraceEventStart(const char *aComment, const char *aColor) {
|
|
printf_stderr("%s RENDERTRACE %u fillrect #%s 0 0 10 10\n",
|
|
aComment, (int)PR_IntervalNow(), aColor);
|
|
}
|
|
|
|
void renderTraceEventEnd(const char *aComment, const char *aColor) {
|
|
printf_stderr("%s RENDERTRACE %u fillrect #%s 0 0 0 0\n",
|
|
aComment, (int)PR_IntervalNow(), aColor);
|
|
}
|
|
|
|
void renderTraceEventEnd(const char *aColor) {
|
|
renderTraceEventEnd("", aColor);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|