Files
palemoon27/gfx/2d/DrawTargetD2D1.h
T
roytam1 f29aba536a import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1085783 (Part 1) - Snap both the fill and dest rects using UserToDeviceSnapped() when pixel snapping images. r=roc (97c8ea37a9)
- Bug 1085783 (Part 2) - Add a test for rounding behavior when high-quality downscaling. r=roc (2851c696c4)
- Bug 1218851. Fix comments related to nsIPresShell::RenderDocument and flags RENDER_DOCUMENT_RELATIVE and RENDER_IGNORE_VIEWPORT_SCROLLING. r=roc (897eb061a2)
- Bug 1223255 - Use Animation::AnimationTimeToTimeStamp instead of timeline->ToTimeStamp. r=bbirtles (b05fc6c868)
- Bug 1216030 - Part 1: Remove CanAnimate_HasGeometricProperty. r=dbaron (8f8f380828)
- Bug 1216030 - Part 2: Remove gfxPlatform::OffMainThreadCompositingEnabled from CanAnimatePropertyOnCompositor. r=dbaron (983f626f3d)
- Bug 1216030 - Part 3: Move AreAsyncAnimationsEnabled check outside animation properties loop. r=dbaron (273b21d3a9)
- Bug 1216030 - Part 4: Move IsCompositorAnimationDisabledForFrame outside animation properties loop. r=dbaron (4f5ba30f2d)
- Bug 1216030 - Part 5: Add KeyframeEffectReadOnly::CanAnimateTransformOnCompositor. r=bbirtles (a87ab8f397)
- Bug 1216030 - Part 6: Add KeyframeEffectReadOnly::IsGeometricProperty. r=bbirtles (9dbb1c9fe0)
- Bug 1216030 - Part 7: Add nsIFrame::RefusedAsyncAnimation. r=dbaron (9b0582e9e7)
- Bug 1216030 - Part 8: Add KeyframeEffectReadOnly::GetAnimationFrame. r=bbirtles (3915b03b48)
- Bug 1216030 - Part 9: We don't need to call CanPerformOnCompositorThread in RequestRestyle. (fe46feecdb)
- Bug 1216030 - Part 8.5: Animation::CanThrottle() should check that all animation properties are running on compositor. r=bbirtles (dbee36ccc7)
- Bug 1216030 - Part 10: Remove CanAnimate_AllowPartial flag. r=bbirtles (eb30ac714f)
- Bug 1216030 - Part 11: Add KeyframeEffect::CanAnimatePropertyOnCompositor. r=bbirtles (f71cb641ec)
- Bug 1216030 - Part 12: Pass nsIFrame to CanPerformOnCompositorThread to avoid redundant process for getting nsIFrame. r=dbaron (c9dbe043ad)
- Bug 1216030 - Part 13: Remove existsProperty check from CanPerformOnCompositorThread. r=dbaron (e3dde151af)
- Bug 1216030 - Part 14: Add KeyframeEffectReadOnly::GetPresContext and KeyframeEffectReadonly::GetRenderedDocument. r=bbirtles (7edbf430e9)
- Bug 1216030 - Part 15: Add KeyframeEffectReadOnly::GetCollection. r=bbirtles (2652435de5)
- Bug 1216030 - Part 16: Move CanThrottleAnimation and CanThrottleTransformChanges from AnimationCollection into KeyframeEffectReadOnly::CanThrottle. r=bbirtles (d890691ebb)
- Bug 1216030 - Part 17: Do not calculate unthrottle interval for transform animation every time. r=bbirtles (c7a3767422)
- Bug 1216030 - Part 18: Remove IsCurrent() check in assertion in CanThrottle. r=bbirtles (6de694634a)
- Bug 1181976 - Rename WillChangeBudgetWarning in dom/dom.properties to reflect string change. r=flod (abc159ebba)
- Bug 1191412 - Fix logic and text for the WillChange warning. r=roc (f2900114f1)
- Bug 1180899 - Do not clobber frame metrics on the root layer added during a previous paint if there is no other frame metrics for the root scroll frame. r=tn (30f2dcf21b)
- Bug 1208673 - Do HitTest with skipping non-leaf preserve-3d transform items. r=roc (a042872d32)
- Bug 947062 - Layerize background images with animated background-position if possible. r=mattwoodrow (075dedff4a)
- Bug 1172310. Don't add viewport frame bounds to the layer event regions because they are never the result of hit testing. r=roc (1ecdd06c0d)
- Bug 1213582. Don't flatten away opacity:0 containers. r=mattwoodrow (d1f9c205e1)
- Bug 1213582. Skip display items in ProcessDisplayItems if we only need items for event regions, and this item isn't one and doesn't have descendants. r=mattwoodrow (3511595652)
- Bug 1183085 - Correct the name for nsDisplayItem; r=roc (fb1a59294f)
- Bug 1183085 - Update description for nsDisplayList methods; r=roc (39eafdb099)
- Bug 1216851 - Don't include event regions when deciding if we can flatten opacity. r=roc (fc518688a4)
- Bug 1215412 - Apply perspective origin after transform origin. r=jwatt (a30f0351a3)
- Bug 1152263 - Ensure Matrix4x4::ProjectRectBounds being functional for Rect with zero width/height. r=mattwoodrow (5ca3086e04)
- Bug 1217012 - Use doubles when untransforming points since we need the extra precision. r=kip (81acd626e8)
- Bug 1042536 - Allow ImageLayer optimization to be used for some clipped background images. r=mstange (b9b89b2d25)
- Bug 1221677 - "[css-grid] Put the 'subgrid' support behind a pref, disabled by default". r=mats (400e9d865a)
- Bug 1150042 - Make nsLayoutUtils::DrawSingleUnscaledImage use CSSIntSize instead of unitless nsIntSize. r=dholbert (393062cd87)
- Bug 1173305 - Convert BasicTableLayoutStrategy to work with logical coordinates. r=dholbert (e133cad49a)
- namespace comment (6fc3ad3f4a)
- Bug 1220621. When removing a <col>, only create an anonymous colframe to replace it if one is really needed. r=dbaron (e29d8a7248)
- Bug 1178250 - Don't call ConsiderChildOverflow until the child has been placed in the right location when reflowing a vertical-rl table. r=dholbert (1327793032)
- Bug 1186998 - Align overflowing table-cell content to content-box. r=dholbert (d2356a20c0)
- Bug 1213465 - Combine DrawResults correctly in nsTablePainter. r=tn (61e725a4ad)
- minor (0df6057957)
- bits of Bug 1163227: Part5 (6a99380110)
- minor (59f78b2265)
- Bug 1206982 - getUserMedia s/PermissionDeniedError/SecurityError/. r=jesup (782b3536a2)
- Bug 1218799: Shutdown MediaManager engines from the MediaManager thread r=jib (351bba0486)
- Bug 1186708 - Fix debug-only assert (crash) on advanced browserWindow constraint. r=jesup (86fcfa999d)
- Bug 1170958 - Remove ProcessedMediaStream::ForwardTrackEnabled. r=roc,jesup (4663d7a46c)
- Bug 1223916 - Prohibit direct method calls at the parser level in self-hosted code. (r=till) (1489fbb2f3)
- Bug 1219057 - Do not show "Unable to print stack trace" for exception thrown while compiling top-level script. r=jandem (df74029ee8)
- Bug 1186973 - Evaluate assertEqBytecode: Print length as numbers. r=h4writer (57f9e68d53)
- Bug 1218636 - IonMonkey: MIPS64: Add support into shell. r=lth (dc4de53cf5)
- Bug 1192329 - Change JS shell to default to the standard version of JS (not 1.7+) 1/2; r=jorendorff (e40087f5b8)
- Bug 1192329 - Change JS shell to default to the standard version of JS (not 1.7+) 2/2; r=jorendorff (4d74d1f639)
- Bug 1192329 - Fix broken asm tests by explicitly setting js version; r=jorendorff (adf502c8db)
- Bug 1108603 - Evaluate ensure that the global is configured such that we can always clone singletons. r=jonco (8a888042dd)
- Bug 1184393 - Rename some js shell test variables for better readability; r=sfink (06e2293f34)
- Bug 1213104 - Pass the ProgressBar directly, since we are no longer using results; r=sfink (16b4af8c3e)
- Bug 1212756 - Fix jstests --debug option r=terrence (89caa65dc5)
- Bug 1213365 - Share environment control code between js and jit test harnesses; r=sfink (274c4f2d2e)
- Bug 1206987 - Only disable the GPF dialog during testing; r=sfink (a507b1b591)
- Bug 1212349 - Encapsulate the shell's per-runtime state r=jandem (4ec884973d)
- Bug 1215063 - Implement a simple module loader for the shell r=shu r=froydnj (a916f0ee03)
- Bug 1214051 - Reject NaN as a sampling probability, and test the floating point value range harder. r=jimb (842e822471)
- Bug 1225176 - Don't call wrap() in JitActivation constructor, it can GC and crash. r=fitzgen (d989a2b157)
- Bug 1218643 - remove support for deprecated asm.js heap length. r=luke (6ad156f10d)
- Bug 1224280 - Fix asm.js console warning when disabled by debugger and parsing off-thread. r=luke (7bf76d0a1f)
- Bug 1221660 - Part 1: Stop populating ParseNode::pn_offset most of the time. r=Waldo. (24d013fe30)
- Bug 1221660 - Part 2: Move pn_offset into a branch of the ParseNode::pn_u union. Add a subclass of ParseNode for PNK_CASE nodes. Merge PNK_DEFAULT with PNK_CASE. r=Waldo. (12514bc644)
- Bug 1200609 - Odin: Update comments and code mentioning interrupting via mprotect (r=benj) (a60ec9d0d0)
- Bug 1218644 - OdinMonkey: MIPS64: Add support for Loongson3. r=lth (57a1865d1d)
- Bug 1225392 part 1. Expose JSAPI for getting %IteratorPrototype%. r=efaust (816e68dddd)
- Bug 1225392 part 2. WebIDL autogenerated iterators should chain up to %IteratorPrototype%. r=qdot (834fc71f90)
- No bug. Reword a comment slightly because it confused me. r=woof!, DONTBUILD (c2c41d535a)
- Bug 1147752 - Keep typedefs consistent. r=jgilbert (605d63c0e4)
- Bug 1207672 - Add support for APPLE_framebuffer_multisample r=snorp (0f4ef4420d)
- Bug 1207205 - Remove fGetActiveUniformName. r=jrmuizel (9d1c97f194)
- Bug 1208513 - Add support for GL_APPLE_sync r=jgilbert (6d70401d89)
- Bug 1222175 - initialize base of ScaledFontDWrite before its members; r=Bas (120c5fa334)
- Bug 1217941 - remove <iomanip> from ScaleFactors2D.h; r=jrmuizel (e5a08d95e2)
- Bug 1222569 - fix initialization order in SourceSurfaceD2D1; r=Bas (484084f551)
- Bug 1208661 - Implement SourceSurfaceDual::GetDataSurface() for debugging purposes. r=BenWa (de255f344a)
- Bug 1185011: Add 'override' annotations to DataSourceSurface subclasses in SourceSurfaceRawData.h, to fix clang -Winconsistent-missing-override build warnings/errors. rs=ehsan (dc3ff4fa07)
- Bug 1222298 - GFX: 2D: Make convolverLS3 more like upstream. r=seth (06e555709d)
- Bug 1157065- GFX: 2D: Implement AlphaBoxBlur in LS3 MMI. r=jrmuizel (ca818df231)
- Bug 1220673 - Make DrawTargetCG::Mask() MOZ_CRASH (a649db3d99)
- Bug 1221616: Use ID2D1CommandList instead of a bitmap for temporary D2D drawing. r=jrmuizel (9785977521)
- Bug 1220624: Make MaskSurface properly take into account the possibilities of partial uploads. r=jrmuizel (9dd3d65880)
- Bug 1222569 - remove unused variable from DrawTargetD2D1.cpp; r=Bas (e6c5aa717b)
2023-01-09 08:34:11 +08:00

243 lines
9.4 KiB
C++

/* -*- Mode: C++; tab-width: 20; 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/. */
#ifndef MOZILLA_GFX_DRAWTARGETD2D1_H_
#define MOZILLA_GFX_DRAWTARGETD2D1_H_
#include "2D.h"
#include <d3d11.h>
#include <d2d1_1.h>
#include "PathD2D.h"
#include "HelpersD2D.h"
#include <vector>
#include <sstream>
#include <unordered_set>
struct IDWriteFactory;
namespace mozilla {
namespace gfx {
class SourceSurfaceD2D1;
const int32_t kLayerCacheSize1 = 5;
class DrawTargetD2D1 : public DrawTarget
{
public:
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetD2D1)
DrawTargetD2D1();
virtual ~DrawTargetD2D1();
virtual DrawTargetType GetType() const override { return DrawTargetType::HARDWARE_RASTER; }
virtual BackendType GetBackendType() const { return BackendType::DIRECT2D1_1; }
virtual already_AddRefed<SourceSurface> Snapshot();
virtual IntSize GetSize() { return mSize; }
virtual void Flush();
virtual void DrawSurface(SourceSurface *aSurface,
const Rect &aDest,
const Rect &aSource,
const DrawSurfaceOptions &aSurfOptions,
const DrawOptions &aOptions);
virtual void DrawFilter(FilterNode *aNode,
const Rect &aSourceRect,
const Point &aDestPoint,
const DrawOptions &aOptions = DrawOptions());
virtual void DrawSurfaceWithShadow(SourceSurface *aSurface,
const Point &aDest,
const Color &aColor,
const Point &aOffset,
Float aSigma,
CompositionOp aOperator);
virtual void ClearRect(const Rect &aRect);
virtual void MaskSurface(const Pattern &aSource,
SourceSurface *aMask,
Point aOffset,
const DrawOptions &aOptions = DrawOptions());
virtual void CopySurface(SourceSurface *aSurface,
const IntRect &aSourceRect,
const IntPoint &aDestination);
virtual void FillRect(const Rect &aRect,
const Pattern &aPattern,
const DrawOptions &aOptions = DrawOptions());
virtual void StrokeRect(const Rect &aRect,
const Pattern &aPattern,
const StrokeOptions &aStrokeOptions = StrokeOptions(),
const DrawOptions &aOptions = DrawOptions());
virtual void StrokeLine(const Point &aStart,
const Point &aEnd,
const Pattern &aPattern,
const StrokeOptions &aStrokeOptions = StrokeOptions(),
const DrawOptions &aOptions = DrawOptions());
virtual void Stroke(const Path *aPath,
const Pattern &aPattern,
const StrokeOptions &aStrokeOptions = StrokeOptions(),
const DrawOptions &aOptions = DrawOptions());
virtual void Fill(const Path *aPath,
const Pattern &aPattern,
const DrawOptions &aOptions = DrawOptions());
virtual void FillGlyphs(ScaledFont *aFont,
const GlyphBuffer &aBuffer,
const Pattern &aPattern,
const DrawOptions &aOptions = DrawOptions(),
const GlyphRenderingOptions *aRenderingOptions = nullptr);
virtual void Mask(const Pattern &aSource,
const Pattern &aMask,
const DrawOptions &aOptions = DrawOptions());
virtual void PushClip(const Path *aPath);
virtual void PushClipRect(const Rect &aRect);
virtual void PopClip();
virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData(unsigned char *aData,
const IntSize &aSize,
int32_t aStride,
SurfaceFormat aFormat) const;
virtual already_AddRefed<SourceSurface> OptimizeSourceSurface(SourceSurface *aSurface) const;
virtual already_AddRefed<SourceSurface>
CreateSourceSurfaceFromNativeSurface(const NativeSurface &aSurface) const { return nullptr; }
virtual already_AddRefed<DrawTarget>
CreateSimilarDrawTarget(const IntSize &aSize, SurfaceFormat aFormat) const;
virtual already_AddRefed<PathBuilder> CreatePathBuilder(FillRule aFillRule = FillRule::FILL_WINDING) const;
virtual already_AddRefed<GradientStops>
CreateGradientStops(GradientStop *aStops,
uint32_t aNumStops,
ExtendMode aExtendMode = ExtendMode::CLAMP) const;
virtual already_AddRefed<FilterNode> CreateFilter(FilterType aType);
virtual bool SupportsRegionClipping() const { return false; }
virtual void *GetNativeSurface(NativeSurfaceType aType) { return nullptr; }
bool Init(const IntSize &aSize, SurfaceFormat aFormat);
bool Init(ID3D11Texture2D* aTexture, SurfaceFormat aFormat);
uint32_t GetByteSize() const;
already_AddRefed<ID2D1Image> GetImageForSurface(SourceSurface *aSurface, Matrix &aSourceTransform,
ExtendMode aExtendMode, const IntRect* aSourceRect = nullptr);
already_AddRefed<ID2D1Image> GetImageForSurface(SourceSurface *aSurface, ExtendMode aExtendMode) {
Matrix mat;
return GetImageForSurface(aSurface, mat, aExtendMode, nullptr);
}
static ID2D1Factory1 *factory();
static void CleanupD2D();
static IDWriteFactory *GetDWriteFactory();
operator std::string() const {
std::stringstream stream;
stream << "DrawTargetD2D 1.1 (" << this << ")";
return stream.str();
}
static uint32_t GetMaxSurfaceSize() {
return D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION;
}
static uint64_t mVRAMUsageDT;
static uint64_t mVRAMUsageSS;
private:
friend class SourceSurfaceD2D1;
typedef std::unordered_set<DrawTargetD2D1*> TargetSet;
// This function will mark the surface as changing, and make sure any
// copy-on-write snapshots are notified.
void MarkChanged();
void PrepareForDrawing(CompositionOp aOp, const Pattern &aPattern);
void FinalizeDrawing(CompositionOp aOp, const Pattern &aPattern);
void FlushTransformToDC() {
if (mTransformDirty) {
mDC->SetTransform(D2DMatrix(mTransform));
mTransformDirty = false;
}
}
void AddDependencyOnSource(SourceSurfaceD2D1* aSource);
// This returns the clipped geometry, in addition it returns aClipBounds which
// represents the intersection of all pixel-aligned rectangular clips that
// are currently set. The returned clipped geometry must be clipped by these
// bounds to correctly reflect the total clip. This is in device space.
already_AddRefed<ID2D1Geometry> GetClippedGeometry(IntRect *aClipBounds);
already_AddRefed<ID2D1Geometry> GetInverseClippedGeometry();
bool GetDeviceSpaceClipRect(D2D1_RECT_F& aClipRect, bool& aIsPixelAligned);
void PopAllClips();
void PushAllClips();
void PushClipsToDC(ID2D1DeviceContext *aDC, bool aForceIgnoreAlpha = false, const D2D1_RECT_F& aMaxRect = D2D1::InfiniteRect());
void PopClipsFromDC(ID2D1DeviceContext *aDC);
already_AddRefed<ID2D1Brush> CreateTransparentBlackBrush();
already_AddRefed<ID2D1SolidColorBrush> GetSolidColorBrush(const D2D_COLOR_F& aColor);
already_AddRefed<ID2D1Brush> CreateBrushForPattern(const Pattern &aPattern, Float aAlpha = 1.0f);
void PushD2DLayer(ID2D1DeviceContext *aDC, ID2D1Geometry *aGeometry, const D2D1_MATRIX_3X2_F &aTransform,
bool aForceIgnoreAlpha = false, const D2D1_RECT_F& aLayerRect = D2D1::InfiniteRect());
IntSize mSize;
RefPtr<ID3D11Device> mDevice;
RefPtr<ID3D11Texture2D> mTexture;
RefPtr<ID2D1Geometry> mCurrentClippedGeometry;
// This is only valid if mCurrentClippedGeometry is non-null. And will
// only be the intersection of all pixel-aligned retangular clips. This is in
// device space.
IntRect mCurrentClipBounds;
mutable RefPtr<ID2D1DeviceContext> mDC;
RefPtr<ID2D1Bitmap1> mBitmap;
RefPtr<ID2D1CommandList> mCommandList;
RefPtr<ID2D1Effect> mBlendEffect;
RefPtr<ID2D1SolidColorBrush> mSolidColorBrush;
// We store this to prevent excessive SetTextRenderingParams calls.
RefPtr<IDWriteRenderingParams> mTextRenderingParams;
// List of pushed clips.
struct PushedClip
{
D2D1_RECT_F mBounds;
union {
// If mPath is non-null, the mTransform member will be used, otherwise
// the mIsPixelAligned member is valid.
D2D1_MATRIX_3X2_F mTransform;
bool mIsPixelAligned;
};
RefPtr<PathD2D> mPath;
};
std::vector<PushedClip> mPushedClips;
// The latest snapshot of this surface. This needs to be told when this
// target is modified. We keep it alive as a cache.
RefPtr<SourceSurfaceD2D1> mSnapshot;
// A list of targets we need to flush when we're modified.
TargetSet mDependentTargets;
// A list of targets which have this object in their mDependentTargets set
TargetSet mDependingOnTargets;
// True of the current clip stack is pushed to the main RT.
bool mClipsArePushed;
static ID2D1Factory1 *mFactory;
static IDWriteFactory *mDWriteFactory;
};
}
}
#endif /* MOZILLA_GFX_DRAWTARGETD2D_H_ */