/* -*- 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"mozilla/layers/Compositor.h" #include"mozilla/layers/CompositionRecorder.h" #include"base/message_loop.h"// for MessageLoop #include"mozilla/gfx/Types.h" #include"mozilla/layers/CompositorBridgeParent.h"// for CompositorBridgeParent #include"mozilla/layers/Diagnostics.h" #include"mozilla/layers/Effects.h"// for Effect, EffectChain, etc #include"mozilla/layers/TextureClient.h" #include"mozilla/layers/TextureHost.h" #include"mozilla/layers/CompositorThread.h" #include"mozilla/mozalloc.h"// for operator delete, etc #include"GeckoProfiler.h" #include"gfx2DGlue.h" #include"gfxUtils.h" #include"nsAppRunner.h"
namespace mozilla::layers {
class CompositorRecordedFrame final : public RecordedFrame { public:
CompositorRecordedFrame(const TimeStamp& aTimeStamp,
RefPtr<AsyncReadbackBuffer>&& aBuffer)
: RecordedFrame(aTimeStamp), mBuffer(aBuffer) {}
Compositor::Compositor(widget::CompositorWidget* aWidget)
: mWidget(aWidget),
mIsDestroyed(false), #ifdefined(MOZ_WIDGET_ANDROID) // If the default color isn't white for Fennec, there is a black // flash before the first page of a tab is loaded.
mClearColor(gfx::ToDeviceColor(gfx::sRGBColor::OpaqueWhite())) #else
mClearColor(gfx::DeviceColor()) #endif
{
}
#ifdef DEBUG staticinlinebool FuzzyEqual(float a, float b) { return fabs(a - b) < 0.0001f;
} staticinlinebool FuzzyLTE(float a, float b) { return a <= b + 0.0001f; } #endif
// If the texture should be flipped, it will have negative height. Detect that // here and compensate for it. We will flip each rect as we emit it. bool flipped = false; if (texCoordRect.Height() < 0) {
flipped = true;
texCoordRect.MoveByY(texCoordRect.Height());
texCoordRect.SetHeight(-texCoordRect.Height());
}
// Wrap the texture coordinates so they are within [0,1] and cap width/height // at 1. We rely on this below.
texCoordRect = gfx::Rect(gfx::Point(WrapTexCoord(texCoordRect.X()),
WrapTexCoord(texCoordRect.Y())),
gfx::Size(std::min(texCoordRect.Width(), 1.0f),
std::min(texCoordRect.Height(), 1.0f)));
// Get the top left and bottom right points of the rectangle. Note that // tl.x/tl.y are within [0,1] but br.x/br.y are within [0,2].
gfx::Point tl = texCoordRect.TopLeft();
gfx::Point br = texCoordRect.BottomRight();
// Then check if we wrap in either the x or y axis. bool xwrap = br.x > 1.0f; bool ywrap = br.y > 1.0f;
// If xwrap is false, the texture will be sampled from tl.x .. br.x. // If xwrap is true, then it will be split into tl.x .. 1.0, and // 0.0 .. WrapTexCoord(br.x). Same for the Y axis. The destination // rectangle is also split appropriately, according to the calculated // xmid/ymid values. if (!xwrap && !ywrap) {
SetRects(0, aLayerRects, aTextureRects, aRect.X(), aRect.Y(), aRect.XMost(),
aRect.YMost(), tl.x, tl.y, br.x, br.y, flipped); return 1;
}
// If we are dealing with wrapping br.x and br.y are greater than 1.0 so // wrap them here as well.
br = gfx::Point(xwrap ? WrapTexCoord(br.x.value) : br.x.value,
ywrap ? WrapTexCoord(br.y.value) : br.y.value);
// If we wrap around along the x axis, we will draw first from // tl.x .. 1.0 and then from 0.0 .. br.x (which we just wrapped above). // The same applies for the Y axis. The midpoints we calculate here are // only valid if we actually wrap around.
GLfloat xmid =
aRect.X() + (1.0f - tl.x) / texCoordRect.Width() * aRect.Width();
GLfloat ymid =
aRect.Y() + (1.0f - tl.y) / texCoordRect.Height() * aRect.Height();
// Due to floating-point inaccuracy, we have to use XMost()-x and YMost()-y // to calculate width and height, respectively, to ensure that size will // remain consistent going from absolute to relative and back again.
NS_ASSERTION(
!xwrap || (xmid >= aRect.X() && xmid <= aRect.XMost() &&
FuzzyEqual((xmid - aRect.X()) + (aRect.XMost() - xmid),
aRect.XMost() - aRect.X())), "xmid should be within [x,XMost()] and the wrapped rect should have the " "same width");
NS_ASSERTION(
!ywrap || (ymid >= aRect.Y() && ymid <= aRect.YMost() &&
FuzzyEqual((ymid - aRect.Y()) + (aRect.YMost() - ymid),
aRect.YMost() - aRect.Y())), "ymid should be within [y,YMost()] and the wrapped rect should have the " "same height");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.