2017-01-10 12:17:30 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set sw=2 sts=2 ts=8 et tw=99 : */
|
|
|
|
/* 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/. */
|
|
|
|
|
|
|
|
#ifndef MOZILLA_LAYERS_WEBRENDERAPI_H
|
|
|
|
#define MOZILLA_LAYERS_WEBRENDERAPI_H
|
|
|
|
|
2017-06-08 18:34:00 +03:00
|
|
|
#include <vector>
|
2017-06-16 22:12:24 +03:00
|
|
|
#include <unordered_map>
|
2017-10-24 22:45:58 +03:00
|
|
|
#include <unordered_set>
|
2017-06-08 18:34:00 +03:00
|
|
|
|
2017-01-10 12:17:30 +03:00
|
|
|
#include "mozilla/AlreadyAddRefed.h"
|
2017-08-07 13:15:25 +03:00
|
|
|
#include "mozilla/layers/SyncObject.h"
|
2017-01-13 13:25:07 +03:00
|
|
|
#include "mozilla/Range.h"
|
2017-01-17 03:22:01 +03:00
|
|
|
#include "mozilla/webrender/webrender_ffi.h"
|
2017-01-17 03:21:52 +03:00
|
|
|
#include "mozilla/webrender/WebRenderTypes.h"
|
2017-05-12 20:58:09 +03:00
|
|
|
#include "FrameMetrics.h"
|
2017-03-03 18:45:29 +03:00
|
|
|
#include "GLTypes.h"
|
2017-01-16 17:22:47 +03:00
|
|
|
#include "Units.h"
|
2017-01-10 12:17:30 +03:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
2017-10-24 22:45:59 +03:00
|
|
|
struct DisplayItemClipChain;
|
|
|
|
|
2017-01-10 12:17:30 +03:00
|
|
|
namespace widget {
|
|
|
|
class CompositorWidget;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace layers {
|
2017-01-17 03:22:09 +03:00
|
|
|
class CompositorBridgeParentBase;
|
2017-06-02 02:07:59 +03:00
|
|
|
class WebRenderBridgeParent;
|
2017-01-17 03:22:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
namespace wr {
|
2017-01-10 12:17:30 +03:00
|
|
|
|
2017-01-13 13:25:07 +03:00
|
|
|
class DisplayListBuilder;
|
2017-01-10 12:17:30 +03:00
|
|
|
class RendererOGL;
|
2017-01-17 22:46:31 +03:00
|
|
|
class RendererEvent;
|
2017-01-10 12:17:30 +03:00
|
|
|
|
Bug 1357545 - handle text-shadows/decorations with webrender (layers-free) r=jrmuizel
This replaces our DrawTargetCapture hack with a similar but more powerful TextDrawTarget
hack. The old design had several limitations:
* It couldn't handle shadows
* It couldn't handle selections
* It couldn't handle font/color changes in a single text-run
* It couldn't handle decorations (underline, overline, line-through)
Mostly this was a consequence of the fact that it only modified the start and end
of the rendering algorithm, and therefore couldn't distinguish draw calls for different
parts of the text.
This new design is based on a similar principle as DrawTargetCapture, but also passes
down the TextDrawTarget in the drawing arguments, so that the drawing algorithm can
notify us of changes in phase (e.g. "now we're doing underlines"). This also lets us
directly pass data to TextDrawTarget when possible (as is done for shadows and selections).
In doing this, I also improved the logic copied from ContainsOnlyColoredGlyphs to handle
changes in font/color mid-text-run (which can happen because of font fallback).
The end result is:
* We handle all shadows natively
* We handle all selections natively
* We handle all decorations natively
* We handle font/color changes in a single text-run
* Although we still hackily intercept draw calls
* But we don't need to buffer commands, reducing total memcopies
In addition, this change integrates webrender's PushTextShadow and PushLine APIs,
which were designed for this use case. This is only done in the layerless path;
WebrenderTextLayer continues to be semantically limited, as we aren't actively
maintaining non-layers-free webrender anymore.
This also doesn't modify TextLayers, to minimize churn. In theory they can be
augmented to support the richer semantics that TextDrawTarget has, but there's
little motivation since the API is largely unused with this change.
MozReview-Commit-ID: 4IjTsSW335h
--HG--
extra : rebase_source : d69f69648ade5c7a8e6bb756f4b8ab9e2543e576
2017-06-19 17:58:28 +03:00
|
|
|
// This isn't part of WR's API, but we define it here to simplify layout's
|
|
|
|
// logic and data plumbing.
|
|
|
|
struct Line {
|
|
|
|
float baseline;
|
|
|
|
float start;
|
|
|
|
float end;
|
|
|
|
float width;
|
|
|
|
wr::ColorF color;
|
|
|
|
wr::LineOrientation orientation;
|
|
|
|
wr::LineStyle style;
|
|
|
|
};
|
|
|
|
|
2017-09-04 14:59:12 +03:00
|
|
|
/// Updates to retained resources such as images and fonts, applied within the
|
|
|
|
/// same transaction.
|
|
|
|
class ResourceUpdateQueue {
|
2017-01-10 12:17:30 +03:00
|
|
|
public:
|
2017-09-04 14:59:12 +03:00
|
|
|
ResourceUpdateQueue();
|
|
|
|
~ResourceUpdateQueue();
|
2017-09-04 14:59:17 +03:00
|
|
|
ResourceUpdateQueue(ResourceUpdateQueue&&);
|
|
|
|
ResourceUpdateQueue(const ResourceUpdateQueue&) = delete;
|
|
|
|
ResourceUpdateQueue& operator=(ResourceUpdateQueue&&);
|
|
|
|
ResourceUpdateQueue& operator=(const ResourceUpdateQueue&) = delete;
|
2017-01-16 17:22:47 +03:00
|
|
|
|
2017-02-22 21:19:57 +03:00
|
|
|
void AddImage(wr::ImageKey aKey,
|
|
|
|
const ImageDescriptor& aDescriptor,
|
2017-09-14 19:48:55 +03:00
|
|
|
wr::Vec_u8& aBytes);
|
2017-01-16 17:22:47 +03:00
|
|
|
|
2017-03-27 14:44:52 +03:00
|
|
|
void AddBlobImage(wr::ImageKey aKey,
|
|
|
|
const ImageDescriptor& aDescriptor,
|
2017-09-14 19:48:55 +03:00
|
|
|
wr::Vec_u8& aBytes);
|
2017-03-27 14:44:52 +03:00
|
|
|
|
2017-03-02 04:22:40 +03:00
|
|
|
void AddExternalImageBuffer(ImageKey key,
|
2017-03-09 05:10:09 +03:00
|
|
|
const ImageDescriptor& aDescriptor,
|
2017-04-19 12:59:53 +03:00
|
|
|
ExternalImageId aHandle);
|
2017-01-16 17:22:47 +03:00
|
|
|
|
2017-05-18 17:59:07 +03:00
|
|
|
void AddExternalImage(ImageKey key,
|
|
|
|
const ImageDescriptor& aDescriptor,
|
|
|
|
ExternalImageId aExtID,
|
|
|
|
WrExternalImageBufferType aBufferType,
|
2017-07-28 15:08:11 +03:00
|
|
|
uint8_t aChannelIndex = 0);
|
2017-05-18 17:59:07 +03:00
|
|
|
|
2017-01-17 03:22:09 +03:00
|
|
|
void UpdateImageBuffer(wr::ImageKey aKey,
|
2017-02-14 21:34:15 +03:00
|
|
|
const ImageDescriptor& aDescriptor,
|
2017-09-14 19:48:55 +03:00
|
|
|
wr::Vec_u8& aBytes);
|
2017-01-16 17:22:47 +03:00
|
|
|
|
2017-07-28 15:08:11 +03:00
|
|
|
void UpdateBlobImage(wr::ImageKey aKey,
|
|
|
|
const ImageDescriptor& aDescriptor,
|
2017-09-14 19:48:55 +03:00
|
|
|
wr::Vec_u8& aBytes);
|
2017-07-28 15:08:11 +03:00
|
|
|
|
|
|
|
void UpdateExternalImage(ImageKey aKey,
|
|
|
|
const ImageDescriptor& aDescriptor,
|
|
|
|
ExternalImageId aExtID,
|
|
|
|
wr::WrExternalImageBufferType aBufferType,
|
|
|
|
uint8_t aChannelIndex = 0);
|
|
|
|
|
2017-01-17 03:22:09 +03:00
|
|
|
void DeleteImage(wr::ImageKey aKey);
|
2017-01-16 17:22:47 +03:00
|
|
|
|
2017-09-14 19:48:55 +03:00
|
|
|
void AddRawFont(wr::FontKey aKey, wr::Vec_u8& aBytes, uint32_t aIndex);
|
2017-01-16 17:22:47 +03:00
|
|
|
|
2017-01-17 03:22:09 +03:00
|
|
|
void DeleteFont(wr::FontKey aKey);
|
2017-01-16 17:22:47 +03:00
|
|
|
|
2017-08-30 20:45:11 +03:00
|
|
|
void AddFontInstance(wr::FontInstanceKey aKey,
|
|
|
|
wr::FontKey aFontKey,
|
|
|
|
float aGlyphSize,
|
|
|
|
const wr::FontInstanceOptions* aOptions,
|
2017-09-21 06:18:23 +03:00
|
|
|
const wr::FontInstancePlatformOptions* aPlatformOptions,
|
|
|
|
wr::Vec_u8& aVariations);
|
2017-08-30 20:45:11 +03:00
|
|
|
|
|
|
|
void DeleteFontInstance(wr::FontInstanceKey aKey);
|
|
|
|
|
2017-09-04 14:59:36 +03:00
|
|
|
void Clear();
|
|
|
|
|
2017-09-04 14:59:12 +03:00
|
|
|
// Try to avoid using this when possible.
|
|
|
|
wr::ResourceUpdates* Raw() { return mUpdates; }
|
|
|
|
|
|
|
|
protected:
|
2017-09-04 14:59:42 +03:00
|
|
|
explicit ResourceUpdateQueue(wr::ResourceUpdates* aUpdates)
|
2017-09-04 14:59:26 +03:00
|
|
|
: mUpdates(aUpdates) {}
|
|
|
|
|
2017-09-04 14:59:12 +03:00
|
|
|
wr::ResourceUpdates* mUpdates;
|
|
|
|
};
|
|
|
|
|
|
|
|
class WebRenderAPI
|
|
|
|
{
|
|
|
|
NS_INLINE_DECL_REFCOUNTING(WebRenderAPI);
|
|
|
|
|
|
|
|
public:
|
|
|
|
/// This can be called on the compositor thread only.
|
|
|
|
static already_AddRefed<WebRenderAPI> Create(layers::CompositorBridgeParentBase* aBridge,
|
|
|
|
RefPtr<widget::CompositorWidget>&& aWidget,
|
|
|
|
LayoutDeviceIntSize aSize);
|
|
|
|
|
|
|
|
already_AddRefed<WebRenderAPI> Clone();
|
|
|
|
|
|
|
|
wr::WindowId GetId() const { return mId; }
|
|
|
|
|
|
|
|
void UpdateScrollPosition(const wr::WrPipelineId& aPipelineId,
|
|
|
|
const layers::FrameMetrics::ViewID& aScrollId,
|
|
|
|
const wr::LayoutPoint& aScrollPosition);
|
|
|
|
|
|
|
|
void GenerateFrame();
|
|
|
|
void GenerateFrame(const nsTArray<wr::WrOpacityProperty>& aOpacityArray,
|
|
|
|
const nsTArray<wr::WrTransformProperty>& aTransformArray);
|
|
|
|
|
|
|
|
void SetWindowParameters(LayoutDeviceIntSize size);
|
|
|
|
|
|
|
|
void SetDisplayList(gfx::Color aBgColor,
|
|
|
|
Epoch aEpoch,
|
|
|
|
mozilla::LayerSize aViewportSize,
|
|
|
|
wr::WrPipelineId pipeline_id,
|
|
|
|
const wr::LayoutSize& content_size,
|
|
|
|
wr::BuiltDisplayListDescriptor dl_descriptor,
|
|
|
|
uint8_t *dl_data,
|
2017-09-04 14:59:26 +03:00
|
|
|
size_t dl_size,
|
2017-09-04 14:59:42 +03:00
|
|
|
ResourceUpdateQueue& aResources);
|
2017-09-04 14:59:12 +03:00
|
|
|
|
|
|
|
void ClearDisplayList(Epoch aEpoch, wr::WrPipelineId pipeline_id);
|
|
|
|
|
|
|
|
void SetRootPipeline(wr::PipelineId aPipeline);
|
|
|
|
|
|
|
|
void UpdateResources(ResourceUpdateQueue& aUpdates);
|
|
|
|
|
2017-10-20 17:42:53 +03:00
|
|
|
void UpdatePipelineResources(ResourceUpdateQueue& aUpdates, PipelineId aPipeline, Epoch aEpoch);
|
|
|
|
|
2017-07-28 02:05:56 +03:00
|
|
|
void SetFrameStartTime(const TimeStamp& aTime);
|
|
|
|
|
2017-01-28 00:08:17 +03:00
|
|
|
void RunOnRenderThread(UniquePtr<RendererEvent> aEvent);
|
2017-09-04 14:59:12 +03:00
|
|
|
|
2017-01-25 07:29:34 +03:00
|
|
|
void Readback(gfx::IntSize aSize, uint8_t *aBuffer, uint32_t aBufferSize);
|
2017-01-17 22:46:31 +03:00
|
|
|
|
2017-04-05 17:12:11 +03:00
|
|
|
void Pause();
|
|
|
|
bool Resume();
|
|
|
|
|
2017-06-28 02:20:36 +03:00
|
|
|
wr::WrIdNamespace GetNamespace();
|
2017-08-12 08:41:56 +03:00
|
|
|
uint32_t GetMaxTextureSize() const { return mMaxTextureSize; }
|
2017-02-23 11:46:56 +03:00
|
|
|
bool GetUseANGLE() const { return mUseANGLE; }
|
2017-08-07 13:15:25 +03:00
|
|
|
layers::SyncHandle GetSyncHandle() const { return mSyncHandle; }
|
2017-01-18 22:50:00 +03:00
|
|
|
|
2017-01-10 12:17:30 +03:00
|
|
|
protected:
|
2017-08-12 08:41:56 +03:00
|
|
|
WebRenderAPI(wr::DocumentHandle* aHandle, wr::WindowId aId, uint32_t aMaxTextureSize, bool aUseANGLE, layers::SyncHandle aSyncHandle)
|
2017-08-09 15:46:24 +03:00
|
|
|
: mDocHandle(aHandle)
|
2017-01-25 00:06:17 +03:00
|
|
|
, mId(aId)
|
|
|
|
, mMaxTextureSize(aMaxTextureSize)
|
2017-02-23 11:46:56 +03:00
|
|
|
, mUseANGLE(aUseANGLE)
|
2017-08-07 13:15:25 +03:00
|
|
|
, mSyncHandle(aSyncHandle)
|
2017-01-10 12:17:30 +03:00
|
|
|
{}
|
|
|
|
|
|
|
|
~WebRenderAPI();
|
2017-03-07 13:37:28 +03:00
|
|
|
// Should be used only for shutdown handling
|
|
|
|
void WaitFlushed();
|
2017-01-10 12:17:30 +03:00
|
|
|
|
2017-08-09 15:46:24 +03:00
|
|
|
wr::DocumentHandle* mDocHandle;
|
2017-01-17 03:22:09 +03:00
|
|
|
wr::WindowId mId;
|
2017-08-12 08:41:56 +03:00
|
|
|
uint32_t mMaxTextureSize;
|
2017-02-23 11:46:56 +03:00
|
|
|
bool mUseANGLE;
|
2017-08-07 13:15:25 +03:00
|
|
|
layers::SyncHandle mSyncHandle;
|
2017-08-09 15:46:25 +03:00
|
|
|
RefPtr<wr::WebRenderAPI> mRootApi;
|
2017-01-11 15:51:27 +03:00
|
|
|
|
2017-01-13 13:25:07 +03:00
|
|
|
friend class DisplayListBuilder;
|
2017-06-02 02:07:59 +03:00
|
|
|
friend class layers::WebRenderBridgeParent;
|
2017-01-13 13:25:07 +03:00
|
|
|
};
|
|
|
|
|
2017-01-17 17:32:25 +03:00
|
|
|
/// This is a simple C++ wrapper around WrState defined in the rust bindings.
|
2017-01-13 13:25:07 +03:00
|
|
|
/// We may want to turn this into a direct wrapper on top of WebRenderFrameBuilder
|
|
|
|
/// instead, so the interface may change a bit.
|
|
|
|
class DisplayListBuilder {
|
|
|
|
public:
|
2017-05-15 22:13:31 +03:00
|
|
|
explicit DisplayListBuilder(wr::PipelineId aId,
|
2017-10-05 05:31:51 +03:00
|
|
|
const wr::LayoutSize& aContentSize,
|
|
|
|
size_t aCapacity = 0);
|
2017-01-13 13:25:07 +03:00
|
|
|
DisplayListBuilder(DisplayListBuilder&&) = default;
|
|
|
|
|
|
|
|
~DisplayListBuilder();
|
|
|
|
|
2017-10-06 20:06:10 +03:00
|
|
|
void Save();
|
|
|
|
void Restore();
|
|
|
|
void ClearSave();
|
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void Finalize(wr::LayoutSize& aOutContentSize,
|
2017-05-15 22:13:31 +03:00
|
|
|
wr::BuiltDisplayList& aOutDisplayList);
|
2017-01-13 13:25:07 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushStackingContext(const wr::LayoutRect& aBounds, // TODO: We should work with strongly typed rects
|
2017-03-29 12:23:08 +03:00
|
|
|
const uint64_t& aAnimationId,
|
|
|
|
const float* aOpacity,
|
|
|
|
const gfx::Matrix4x4* aTransform,
|
2017-07-19 10:28:58 +03:00
|
|
|
wr::TransformStyle aTransformStyle,
|
2017-08-14 12:31:55 +03:00
|
|
|
const gfx::Matrix4x4* aPerspective,
|
2017-07-19 10:28:58 +03:00
|
|
|
const wr::MixBlendMode& aMixBlendMode,
|
2017-09-21 09:41:38 +03:00
|
|
|
const nsTArray<wr::WrFilterOp>& aFilters,
|
|
|
|
bool aIsBackfaceVisible);
|
2017-01-13 13:25:07 +03:00
|
|
|
void PopStackingContext();
|
|
|
|
|
2017-10-24 22:45:57 +03:00
|
|
|
wr::WrClipId DefineClip(const Maybe<layers::FrameMetrics::ViewID>& aAncestorScrollId,
|
|
|
|
const Maybe<wr::WrClipId>& aAncestorClipId,
|
|
|
|
const wr::LayoutRect& aClipRect,
|
2017-10-04 00:51:49 +03:00
|
|
|
const nsTArray<wr::ComplexClipRegion>* aComplex = nullptr,
|
2017-08-08 22:43:17 +03:00
|
|
|
const wr::WrImageMask* aMask = nullptr);
|
2017-10-24 22:45:59 +03:00
|
|
|
void PushClip(const wr::WrClipId& aClipId, const DisplayItemClipChain* aParent = nullptr);
|
|
|
|
void PopClip(const DisplayItemClipChain* aParent = nullptr);
|
|
|
|
Maybe<wr::WrClipId> GetCacheOverride(const DisplayItemClipChain* aParent);
|
2017-04-18 18:09:39 +03:00
|
|
|
|
2017-09-21 17:11:39 +03:00
|
|
|
wr::WrStickyId DefineStickyFrame(const wr::LayoutRect& aContentRect,
|
|
|
|
const wr::StickySideConstraint* aTop,
|
|
|
|
const wr::StickySideConstraint* aRight,
|
|
|
|
const wr::StickySideConstraint* aBottom,
|
|
|
|
const wr::StickySideConstraint* aLeft);
|
|
|
|
void PushStickyFrame(const wr::WrStickyId& aStickyId);
|
|
|
|
void PopStickyFrame();
|
|
|
|
|
2017-08-30 21:51:19 +03:00
|
|
|
bool IsScrollLayerDefined(layers::FrameMetrics::ViewID aScrollId) const;
|
2017-08-30 21:51:19 +03:00
|
|
|
void DefineScrollLayer(const layers::FrameMetrics::ViewID& aScrollId,
|
2017-10-24 22:45:57 +03:00
|
|
|
const Maybe<layers::FrameMetrics::ViewID>& aAncestorScrollId,
|
|
|
|
const Maybe<wr::WrClipId>& aAncestorClipId,
|
2017-08-30 21:51:19 +03:00
|
|
|
const wr::LayoutRect& aContentRect, // TODO: We should work with strongly typed rects
|
|
|
|
const wr::LayoutRect& aClipRect);
|
|
|
|
void PushScrollLayer(const layers::FrameMetrics::ViewID& aScrollId);
|
2017-02-14 21:34:15 +03:00
|
|
|
void PopScrollLayer();
|
|
|
|
|
2017-06-08 18:34:01 +03:00
|
|
|
void PushClipAndScrollInfo(const layers::FrameMetrics::ViewID& aScrollId,
|
2017-06-28 02:20:36 +03:00
|
|
|
const wr::WrClipId* aClipId);
|
2017-06-08 18:34:01 +03:00
|
|
|
void PopClipAndScrollInfo();
|
2017-02-14 21:34:15 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushRect(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::ColorF& aColor);
|
2017-01-13 13:25:07 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushLinearGradient(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::LayoutPoint& aStartPoint,
|
|
|
|
const wr::LayoutPoint& aEndPoint,
|
2017-07-19 08:47:07 +03:00
|
|
|
const nsTArray<wr::GradientStop>& aStops,
|
|
|
|
wr::ExtendMode aExtendMode,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::LayoutSize aTileSize,
|
|
|
|
const wr::LayoutSize aTileSpacing);
|
2017-06-28 02:20:36 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushRadialGradient(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::LayoutPoint& aCenter,
|
|
|
|
const wr::LayoutSize& aRadius,
|
2017-07-19 08:47:07 +03:00
|
|
|
const nsTArray<wr::GradientStop>& aStops,
|
|
|
|
wr::ExtendMode aExtendMode,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::LayoutSize aTileSize,
|
|
|
|
const wr::LayoutSize aTileSpacing);
|
2017-02-17 03:51:32 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushImage(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-02-14 21:34:15 +03:00
|
|
|
wr::ImageRendering aFilter,
|
2017-01-17 22:48:00 +03:00
|
|
|
wr::ImageKey aImage);
|
2017-01-13 13:25:07 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushImage(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::LayoutSize& aStretchSize,
|
|
|
|
const wr::LayoutSize& aTileSpacing,
|
2017-04-07 09:53:16 +03:00
|
|
|
wr::ImageRendering aFilter,
|
|
|
|
wr::ImageKey aImage);
|
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushYCbCrPlanarImage(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-04-29 00:00:57 +03:00
|
|
|
wr::ImageKey aImageChannel0,
|
|
|
|
wr::ImageKey aImageChannel1,
|
|
|
|
wr::ImageKey aImageChannel2,
|
2017-06-28 02:20:36 +03:00
|
|
|
wr::WrYuvColorSpace aColorSpace,
|
2017-06-01 15:57:10 +03:00
|
|
|
wr::ImageRendering aFilter);
|
2017-04-29 00:00:57 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushNV12Image(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-04-29 00:00:57 +03:00
|
|
|
wr::ImageKey aImageChannel0,
|
|
|
|
wr::ImageKey aImageChannel1,
|
2017-06-28 02:20:36 +03:00
|
|
|
wr::WrYuvColorSpace aColorSpace,
|
2017-06-01 15:57:10 +03:00
|
|
|
wr::ImageRendering aFilter);
|
2017-04-29 00:00:57 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushYCbCrInterleavedImage(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-05-18 17:59:07 +03:00
|
|
|
wr::ImageKey aImageChannel0,
|
2017-06-28 02:20:36 +03:00
|
|
|
wr::WrYuvColorSpace aColorSpace,
|
2017-06-01 15:57:10 +03:00
|
|
|
wr::ImageRendering aFilter);
|
2017-05-18 17:59:07 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushIFrame(const wr::LayoutRect& aBounds,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-01-17 03:22:09 +03:00
|
|
|
wr::PipelineId aPipeline);
|
2017-01-13 13:25:07 +03:00
|
|
|
|
2017-07-01 02:22:25 +03:00
|
|
|
// XXX WrBorderSides are passed with Range.
|
|
|
|
// It is just to bypass compiler bug. See Bug 1357734.
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushBorder(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-07-19 08:56:20 +03:00
|
|
|
const wr::BorderWidths& aWidths,
|
|
|
|
const Range<const wr::BorderSide>& aSides,
|
|
|
|
const wr::BorderRadius& aRadius);
|
2017-06-28 02:20:36 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushBorderImage(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-07-19 08:56:20 +03:00
|
|
|
const wr::BorderWidths& aWidths,
|
2017-03-13 06:46:03 +03:00
|
|
|
wr::ImageKey aImage,
|
2017-07-19 08:56:20 +03:00
|
|
|
const wr::NinePatchDescriptor& aPatch,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::SideOffsets2D_f32& aOutset,
|
2017-07-19 08:56:20 +03:00
|
|
|
const wr::RepeatMode& aRepeatHorizontal,
|
|
|
|
const wr::RepeatMode& aRepeatVertical);
|
2017-06-28 02:20:36 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushBorderGradient(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-07-19 08:56:20 +03:00
|
|
|
const wr::BorderWidths& aWidths,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::LayoutPoint& aStartPoint,
|
|
|
|
const wr::LayoutPoint& aEndPoint,
|
2017-07-19 08:47:07 +03:00
|
|
|
const nsTArray<wr::GradientStop>& aStops,
|
|
|
|
wr::ExtendMode aExtendMode,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::SideOffsets2D_f32& aOutset);
|
2017-06-28 02:20:36 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushBorderRadialGradient(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-07-19 08:56:20 +03:00
|
|
|
const wr::BorderWidths& aWidths,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::LayoutPoint& aCenter,
|
|
|
|
const wr::LayoutSize& aRadius,
|
2017-07-19 08:47:07 +03:00
|
|
|
const nsTArray<wr::GradientStop>& aStops,
|
|
|
|
wr::ExtendMode aExtendMode,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::SideOffsets2D_f32& aOutset);
|
2017-04-10 12:27:30 +03:00
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushText(const wr::LayoutRect& aBounds,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-10-04 20:49:51 +03:00
|
|
|
const wr::ColorF& aColor,
|
2017-08-30 20:45:11 +03:00
|
|
|
wr::FontInstanceKey aFontKey,
|
2017-07-19 01:53:09 +03:00
|
|
|
Range<const wr::GlyphInstance> aGlyphBuffer,
|
2017-08-30 20:45:11 +03:00
|
|
|
const wr::GlyphOptions* aGlyphOptions = nullptr);
|
2017-01-13 13:25:07 +03:00
|
|
|
|
Bug 1357545 - handle text-shadows/decorations with webrender (layers-free) r=jrmuizel
This replaces our DrawTargetCapture hack with a similar but more powerful TextDrawTarget
hack. The old design had several limitations:
* It couldn't handle shadows
* It couldn't handle selections
* It couldn't handle font/color changes in a single text-run
* It couldn't handle decorations (underline, overline, line-through)
Mostly this was a consequence of the fact that it only modified the start and end
of the rendering algorithm, and therefore couldn't distinguish draw calls for different
parts of the text.
This new design is based on a similar principle as DrawTargetCapture, but also passes
down the TextDrawTarget in the drawing arguments, so that the drawing algorithm can
notify us of changes in phase (e.g. "now we're doing underlines"). This also lets us
directly pass data to TextDrawTarget when possible (as is done for shadows and selections).
In doing this, I also improved the logic copied from ContainsOnlyColoredGlyphs to handle
changes in font/color mid-text-run (which can happen because of font fallback).
The end result is:
* We handle all shadows natively
* We handle all selections natively
* We handle all decorations natively
* We handle font/color changes in a single text-run
* Although we still hackily intercept draw calls
* But we don't need to buffer commands, reducing total memcopies
In addition, this change integrates webrender's PushTextShadow and PushLine APIs,
which were designed for this use case. This is only done in the layerless path;
WebrenderTextLayer continues to be semantically limited, as we aren't actively
maintaining non-layers-free webrender anymore.
This also doesn't modify TextLayers, to minimize churn. In theory they can be
augmented to support the richer semantics that TextDrawTarget has, but there's
little motivation since the API is largely unused with this change.
MozReview-Commit-ID: 4IjTsSW335h
--HG--
extra : rebase_source : d69f69648ade5c7a8e6bb756f4b8ab9e2543e576
2017-06-19 17:58:28 +03:00
|
|
|
void PushLine(const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
Bug 1357545 - handle text-shadows/decorations with webrender (layers-free) r=jrmuizel
This replaces our DrawTargetCapture hack with a similar but more powerful TextDrawTarget
hack. The old design had several limitations:
* It couldn't handle shadows
* It couldn't handle selections
* It couldn't handle font/color changes in a single text-run
* It couldn't handle decorations (underline, overline, line-through)
Mostly this was a consequence of the fact that it only modified the start and end
of the rendering algorithm, and therefore couldn't distinguish draw calls for different
parts of the text.
This new design is based on a similar principle as DrawTargetCapture, but also passes
down the TextDrawTarget in the drawing arguments, so that the drawing algorithm can
notify us of changes in phase (e.g. "now we're doing underlines"). This also lets us
directly pass data to TextDrawTarget when possible (as is done for shadows and selections).
In doing this, I also improved the logic copied from ContainsOnlyColoredGlyphs to handle
changes in font/color mid-text-run (which can happen because of font fallback).
The end result is:
* We handle all shadows natively
* We handle all selections natively
* We handle all decorations natively
* We handle font/color changes in a single text-run
* Although we still hackily intercept draw calls
* But we don't need to buffer commands, reducing total memcopies
In addition, this change integrates webrender's PushTextShadow and PushLine APIs,
which were designed for this use case. This is only done in the layerless path;
WebrenderTextLayer continues to be semantically limited, as we aren't actively
maintaining non-layers-free webrender anymore.
This also doesn't modify TextLayers, to minimize churn. In theory they can be
augmented to support the richer semantics that TextDrawTarget has, but there's
little motivation since the API is largely unused with this change.
MozReview-Commit-ID: 4IjTsSW335h
--HG--
extra : rebase_source : d69f69648ade5c7a8e6bb756f4b8ab9e2543e576
2017-06-19 17:58:28 +03:00
|
|
|
const wr::Line& aLine);
|
|
|
|
|
2017-10-04 21:54:37 +03:00
|
|
|
void PushShadow(const wr::LayoutRect& aBounds,
|
Bug 1357545 - handle text-shadows/decorations with webrender (layers-free) r=jrmuizel
This replaces our DrawTargetCapture hack with a similar but more powerful TextDrawTarget
hack. The old design had several limitations:
* It couldn't handle shadows
* It couldn't handle selections
* It couldn't handle font/color changes in a single text-run
* It couldn't handle decorations (underline, overline, line-through)
Mostly this was a consequence of the fact that it only modified the start and end
of the rendering algorithm, and therefore couldn't distinguish draw calls for different
parts of the text.
This new design is based on a similar principle as DrawTargetCapture, but also passes
down the TextDrawTarget in the drawing arguments, so that the drawing algorithm can
notify us of changes in phase (e.g. "now we're doing underlines"). This also lets us
directly pass data to TextDrawTarget when possible (as is done for shadows and selections).
In doing this, I also improved the logic copied from ContainsOnlyColoredGlyphs to handle
changes in font/color mid-text-run (which can happen because of font fallback).
The end result is:
* We handle all shadows natively
* We handle all selections natively
* We handle all decorations natively
* We handle font/color changes in a single text-run
* Although we still hackily intercept draw calls
* But we don't need to buffer commands, reducing total memcopies
In addition, this change integrates webrender's PushTextShadow and PushLine APIs,
which were designed for this use case. This is only done in the layerless path;
WebrenderTextLayer continues to be semantically limited, as we aren't actively
maintaining non-layers-free webrender anymore.
This also doesn't modify TextLayers, to minimize churn. In theory they can be
augmented to support the richer semantics that TextDrawTarget has, but there's
little motivation since the API is largely unused with this change.
MozReview-Commit-ID: 4IjTsSW335h
--HG--
extra : rebase_source : d69f69648ade5c7a8e6bb756f4b8ab9e2543e576
2017-06-19 17:58:28 +03:00
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-10-04 21:54:37 +03:00
|
|
|
const wr::Shadow& aShadow);
|
Bug 1357545 - handle text-shadows/decorations with webrender (layers-free) r=jrmuizel
This replaces our DrawTargetCapture hack with a similar but more powerful TextDrawTarget
hack. The old design had several limitations:
* It couldn't handle shadows
* It couldn't handle selections
* It couldn't handle font/color changes in a single text-run
* It couldn't handle decorations (underline, overline, line-through)
Mostly this was a consequence of the fact that it only modified the start and end
of the rendering algorithm, and therefore couldn't distinguish draw calls for different
parts of the text.
This new design is based on a similar principle as DrawTargetCapture, but also passes
down the TextDrawTarget in the drawing arguments, so that the drawing algorithm can
notify us of changes in phase (e.g. "now we're doing underlines"). This also lets us
directly pass data to TextDrawTarget when possible (as is done for shadows and selections).
In doing this, I also improved the logic copied from ContainsOnlyColoredGlyphs to handle
changes in font/color mid-text-run (which can happen because of font fallback).
The end result is:
* We handle all shadows natively
* We handle all selections natively
* We handle all decorations natively
* We handle font/color changes in a single text-run
* Although we still hackily intercept draw calls
* But we don't need to buffer commands, reducing total memcopies
In addition, this change integrates webrender's PushTextShadow and PushLine APIs,
which were designed for this use case. This is only done in the layerless path;
WebrenderTextLayer continues to be semantically limited, as we aren't actively
maintaining non-layers-free webrender anymore.
This also doesn't modify TextLayers, to minimize churn. In theory they can be
augmented to support the richer semantics that TextDrawTarget has, but there's
little motivation since the API is largely unused with this change.
MozReview-Commit-ID: 4IjTsSW335h
--HG--
extra : rebase_source : d69f69648ade5c7a8e6bb756f4b8ab9e2543e576
2017-06-19 17:58:28 +03:00
|
|
|
|
2017-10-13 19:58:32 +03:00
|
|
|
void PopAllShadows();
|
Bug 1357545 - handle text-shadows/decorations with webrender (layers-free) r=jrmuizel
This replaces our DrawTargetCapture hack with a similar but more powerful TextDrawTarget
hack. The old design had several limitations:
* It couldn't handle shadows
* It couldn't handle selections
* It couldn't handle font/color changes in a single text-run
* It couldn't handle decorations (underline, overline, line-through)
Mostly this was a consequence of the fact that it only modified the start and end
of the rendering algorithm, and therefore couldn't distinguish draw calls for different
parts of the text.
This new design is based on a similar principle as DrawTargetCapture, but also passes
down the TextDrawTarget in the drawing arguments, so that the drawing algorithm can
notify us of changes in phase (e.g. "now we're doing underlines"). This also lets us
directly pass data to TextDrawTarget when possible (as is done for shadows and selections).
In doing this, I also improved the logic copied from ContainsOnlyColoredGlyphs to handle
changes in font/color mid-text-run (which can happen because of font fallback).
The end result is:
* We handle all shadows natively
* We handle all selections natively
* We handle all decorations natively
* We handle font/color changes in a single text-run
* Although we still hackily intercept draw calls
* But we don't need to buffer commands, reducing total memcopies
In addition, this change integrates webrender's PushTextShadow and PushLine APIs,
which were designed for this use case. This is only done in the layerless path;
WebrenderTextLayer continues to be semantically limited, as we aren't actively
maintaining non-layers-free webrender anymore.
This also doesn't modify TextLayers, to minimize churn. In theory they can be
augmented to support the richer semantics that TextDrawTarget has, but there's
little motivation since the API is largely unused with this change.
MozReview-Commit-ID: 4IjTsSW335h
--HG--
extra : rebase_source : d69f69648ade5c7a8e6bb756f4b8ab9e2543e576
2017-06-19 17:58:28 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
2017-07-19 01:32:46 +03:00
|
|
|
void PushBoxShadow(const wr::LayoutRect& aRect,
|
|
|
|
const wr::LayoutRect& aClip,
|
2017-09-21 09:41:38 +03:00
|
|
|
bool aIsBackfaceVisible,
|
2017-07-19 01:32:46 +03:00
|
|
|
const wr::LayoutRect& aBoxBounds,
|
|
|
|
const wr::LayoutVector2D& aOffset,
|
|
|
|
const wr::ColorF& aColor,
|
2017-02-16 21:23:22 +03:00
|
|
|
const float& aBlurRadius,
|
|
|
|
const float& aSpreadRadius,
|
2017-10-24 09:44:29 +03:00
|
|
|
const wr::BorderRadius& aBorderRadius,
|
2017-07-19 10:28:58 +03:00
|
|
|
const wr::BoxShadowClipMode& aClipMode);
|
2017-02-16 21:23:22 +03:00
|
|
|
|
2017-06-08 18:34:00 +03:00
|
|
|
// Returns the clip id that was most recently pushed with PushClip and that
|
|
|
|
// has not yet been popped with PopClip. Return Nothing() if the clip stack
|
|
|
|
// is empty.
|
2017-06-28 02:20:36 +03:00
|
|
|
Maybe<wr::WrClipId> TopmostClipId();
|
2017-08-17 18:06:51 +03:00
|
|
|
// Same as TopmostClipId() but for scroll layers.
|
2017-08-23 09:46:38 +03:00
|
|
|
layers::FrameMetrics::ViewID TopmostScrollId();
|
2017-10-24 22:46:00 +03:00
|
|
|
// If the topmost item on the stack is a clip or a scroll layer
|
|
|
|
bool TopmostIsClip();
|
2017-06-08 18:34:00 +03:00
|
|
|
|
2017-01-13 13:25:07 +03:00
|
|
|
// Try to avoid using this when possible.
|
2017-06-28 02:20:36 +03:00
|
|
|
wr::WrState* Raw() { return mWrState; }
|
2017-09-19 12:05:22 +03:00
|
|
|
|
2017-10-11 12:33:35 +03:00
|
|
|
// Return true if the current clip stack has any extra clip.
|
2017-10-24 22:45:59 +03:00
|
|
|
bool HasExtraClip() { return !mCacheOverride.empty(); }
|
2017-09-19 12:05:22 +03:00
|
|
|
|
2017-01-13 13:25:07 +03:00
|
|
|
protected:
|
2017-06-28 02:20:36 +03:00
|
|
|
wr::WrState* mWrState;
|
2017-01-16 17:22:47 +03:00
|
|
|
|
2017-06-08 18:34:00 +03:00
|
|
|
// Track the stack of clip ids and scroll layer ids that have been pushed
|
2017-10-24 22:45:58 +03:00
|
|
|
// (by PushClip and PushScrollLayer/PushClipAndScrollInfo, respectively) and
|
|
|
|
// haven't yet been popped.
|
|
|
|
std::vector<wr::ScrollOrClipId> mClipStack;
|
2017-06-08 18:34:00 +03:00
|
|
|
|
2017-10-24 22:45:58 +03:00
|
|
|
// Track each scroll id that we encountered. We use this structure to
|
|
|
|
// ensure that we don't define a particular scroll layer multiple times,
|
|
|
|
// as that results in undefined behaviour in WR.
|
|
|
|
std::unordered_set<layers::FrameMetrics::ViewID> mScrollIdsDefined;
|
2017-06-16 22:12:24 +03:00
|
|
|
|
2017-10-24 22:45:59 +03:00
|
|
|
// A map that holds the cache overrides creates by "out of band" clips, i.e.
|
|
|
|
// clips that are generated by display items but that ScrollingLayersHelper
|
|
|
|
// doesn't know about. These are called "cache overrides" because while we're
|
|
|
|
// inside one of these clips, the WR clip stack is different from what
|
|
|
|
// ScrollingLayersHelper thinks it actually is (because of the out-of-band
|
|
|
|
// clip that was pushed onto the stack) and so ScrollingLayersHelper cannot
|
|
|
|
// use its clip cache as-is. Instead, any time ScrollingLayersHelper wants
|
|
|
|
// to define a new clip as a child of clip X, it should first check the
|
|
|
|
// cache overrides to see if there is an out-of-band clip Y that is already a
|
|
|
|
// child of X, and then define its clip as a child of Y instead. This map
|
|
|
|
// stores X -> ClipId of Y, which allows ScrollingLayersHelper to do the
|
|
|
|
// necessary lookup. Note that there theoretically might be multiple
|
|
|
|
// different "Y" clips which is why we need a vector.
|
|
|
|
std::unordered_map<const DisplayItemClipChain*, std::vector<wr::WrClipId>> mCacheOverride;
|
2017-09-19 12:05:22 +03:00
|
|
|
|
2017-01-16 17:22:47 +03:00
|
|
|
friend class WebRenderAPI;
|
2017-01-10 12:17:30 +03:00
|
|
|
};
|
|
|
|
|
2017-07-19 10:28:58 +03:00
|
|
|
Maybe<wr::ImageFormat>
|
|
|
|
SurfaceFormatToImageFormat(gfx::SurfaceFormat aFormat);
|
2017-01-17 23:13:41 +03:00
|
|
|
|
2017-01-25 00:06:17 +03:00
|
|
|
} // namespace wr
|
|
|
|
} // namespace mozilla
|
2017-01-10 12:17:30 +03:00
|
|
|
|
2017-01-24 16:44:23 +03:00
|
|
|
#endif
|