mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
67e04cfead
- Bug 1236750 - Introduce a new unit type CSSTransformedLayerPixel. r=kats (4e9bba3d19) - Bug 1236750 - Add a ViewAs() overload for casting (with a justification) one typed matrix to another. r=kats (c48e143508) - Bug 1236750 - Add some specialized typedefs of Matrix4x4 to represent layer transform matrices. r=kats (cc50113c98) - Bug 1239300 - reject promise with null while creating imagebitmap from empty blob; r=smaug (bff7483bf1) - Bug 1233056 - Long tapping on a link will select a different link from the page r=tnikkel (3a727b33c1) - Bug 1245674. Null-check mGlobal before dereferencing it in one more place in Promise code. r=smaug (68cf5312dc) - Bug 1236750 - Use strongly-typed matrices to represent layer transforms in APZ code. r=kats (63931eb2a1) - Bug 1236750 - Add typed getters for layer transform matrices. r=kats (baef978fe1) - Bug 1147673 - Relax the ancestor transform assertion a little. r=kats (ec9ce47ba4) - Bug 1154161 Initialize WidgetQueryContentEvent::mReply r=smaug (6086291313) - Bug 1240921 - Use nsAutoTArray in nsStyleSet::RuleNodeWithReplacement. r=bz. (66f6823b46) - Bug 1229437 part 1 - Add a helper function to get the float containing block of a given frame. r=dbaron (72de452e5d) - Bug 1229437 part 2 - Reparent floats inside pulled ruby segment. r=dbaron (82cc44632d) - Bug 1229437 part 3 - Support iterating frames of RubyColumn. r=dholbert (5d43e7f6ff) - Bug 1229437 part 4 - Reparent floats inside pulled ruby column. r=dbaron (4c1a7ff20b) - Bug 1229437 part 5 - Add crashtests for this bug. r=dbaron (6afabe1604) - Bug 1229437 followup - Fix sign-compare error in RubyColumn::Iterator on CLOSED TREE. (e93453d00a) - Bug 1229437 followup 2 - Fix another sign-compare error in RubyColumn::Iterator on CLOSED TREE. (c0bf6a2a7b) - Bug 1229437 followup 3 - Fix a mistake in RubyColumn::Iterator::SkipUntilExistingFrame(). a=me (1ce408e194) - bits of Bug 1072150 - Use the opt-out for various sloppy consumers (29d97c59ca) - Make test_bug946632 compatible with asynchronous scrolling. (bug 1140293, r=mstange) (e975a8350c) - fix misspatch of 1072150 (a3e580fa4b) - Bug 686281 - Implement nsStyleImageLayers; r=dbaron (85bb33c8e6) - Bug 686281 - Rename *background* to *imagelayer*; r=dbaron. (36d90f112d) - Bug 1230034 part 4 - Make FramePropertyDescriptor to be a template. r=froydnj,dbaron (271cd19b6e) - Bug 1230034 part 5 - Convert all frame properties which use DeleteValue and ReleaseValue as destructor to be typesafe. r=dbaron (efc8d63c9d) - Bug 1230034 part 6 - Convert all frame properties which do not hold pointer to be typed. r=dbaron (b5541775f7) - Bug 1230034 part 7 - Convert nsIFrame::GenConProperty to be typed. r=dbaron (2b71527b2c) - Bug 1230034 part 8 - Convert frame properties which assert on destructor to be typed. r=dbaron (0f125a3414) - Bug 1230034 part 9 - Convert FrameLayerBuilder::LayerManagerDataProperty to be typed. r=dbaron (1147498c2f) - Bug 1230034 part 10 - Convert remaining frame properties to by typed and remove the unsafe declaring macro. r=dbaron (d59d94eac4) - Bug 1072501: Unmap file mapping on source surface destruction. r=jrmuizel (19fd63890a) - Bug 1235613 - Make gfxCriticalError/Note strings in gfx/ unique. r=jrmuizel (780c6ff862) - Bug 1247535 - Fix -Wunreachable-code warning in mfbt/Poison.cpp. r=froydnj (0e7cf60b6d) - Bug 1239479: Add comments to mfbt/XorShift128PlusRNG.h from the RNG's designer. DONTBUILD r=Waldo (bb674b07ce) - Add an assertion message to the assert-is-empty in LinkedList::~LinkedList, to indicate to users who hit it that it's the fault of the caller, not the fault of MFBT code. No bug, rs=froydnj (4cad80874c) - Bug 1221103 - Add a comment to nsIChannel::securityInfo noting that this info may appear on non-nsHttpChannels and how that may happen. r=bz IGNORE IDL (cd9cebc3f2) - Bug 1001765 - Make login credentials in Saved Passwords manager editable. r=MattN (09eec4f6f8) - Bug 1188478 - Add an Import button to the password manager to open the browser migrator. r=dolske (d1126a89fc) - Bug 1199382 - Rename some strings from "password" to "login" in preferences and the manager. r=markh (60638f5e2a) - Bug 1207733 - Update @disabled on the Remove Password button when selection changes. r=MattN (64ac9f22f6) - bits of 1124472 and 1166840 (26e2681183) - Bug 1219707 - fix argument passing to migration.js, r=jaws (55d332f5c6) - bug 1215657 - make AccessibleWrap::get_accSelection work with proxies=davidb (4e72111032) - fix missing telemetry entry (4fcfabb3e6) and follow-up API changes of TFF#493.
326 lines
7.8 KiB
C++
326 lines
7.8 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/. */
|
|
|
|
#include "SourceSurfaceD2DTarget.h"
|
|
#include "Logging.h"
|
|
#include "DrawTargetD2D.h"
|
|
#include "Tools.h"
|
|
|
|
#include <algorithm>
|
|
|
|
namespace mozilla {
|
|
namespace gfx {
|
|
|
|
SourceSurfaceD2DTarget::SourceSurfaceD2DTarget(DrawTargetD2D* aDrawTarget,
|
|
ID3D10Texture2D* aTexture,
|
|
SurfaceFormat aFormat)
|
|
: mDrawTarget(aDrawTarget)
|
|
, mTexture(aTexture)
|
|
, mFormat(aFormat)
|
|
, mOwnsCopy(false)
|
|
{
|
|
}
|
|
|
|
SourceSurfaceD2DTarget::~SourceSurfaceD2DTarget()
|
|
{
|
|
// We don't need to do anything special here to notify our mDrawTarget. It must
|
|
// already have cleared its mSnapshot field, otherwise this object would
|
|
// be kept alive.
|
|
if (mOwnsCopy) {
|
|
IntSize size = GetSize();
|
|
|
|
DrawTargetD2D::mVRAMUsageSS -= size.width * size.height * BytesPerPixel(mFormat);
|
|
}
|
|
}
|
|
|
|
IntSize
|
|
SourceSurfaceD2DTarget::GetSize() const
|
|
{
|
|
D3D10_TEXTURE2D_DESC desc;
|
|
mTexture->GetDesc(&desc);
|
|
|
|
return IntSize(desc.Width, desc.Height);
|
|
}
|
|
|
|
SurfaceFormat
|
|
SourceSurfaceD2DTarget::GetFormat() const
|
|
{
|
|
return mFormat;
|
|
}
|
|
|
|
already_AddRefed<DataSourceSurface>
|
|
SourceSurfaceD2DTarget::GetDataSurface()
|
|
{
|
|
RefPtr<DataSourceSurfaceD2DTarget> dataSurf =
|
|
new DataSourceSurfaceD2DTarget(mFormat);
|
|
|
|
D3D10_TEXTURE2D_DESC desc;
|
|
mTexture->GetDesc(&desc);
|
|
|
|
desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ;
|
|
desc.Usage = D3D10_USAGE_STAGING;
|
|
desc.BindFlags = 0;
|
|
desc.MiscFlags = 0;
|
|
|
|
if (!Factory::GetDirect3D10Device()) {
|
|
gfxCriticalError() << "Invalid D3D10 device in D2D target surface (GDS)";
|
|
return nullptr;
|
|
}
|
|
|
|
HRESULT hr = Factory::GetDirect3D10Device()->CreateTexture2D(&desc, nullptr, getter_AddRefs(dataSurf->mTexture));
|
|
|
|
if (FAILED(hr)) {
|
|
gfxDebug() << "Failed to create staging texture for SourceSurface. Code: " << hexa(hr);
|
|
return nullptr;
|
|
}
|
|
Factory::GetDirect3D10Device()->CopyResource(dataSurf->mTexture, mTexture);
|
|
|
|
return dataSurf.forget();
|
|
}
|
|
|
|
void*
|
|
SourceSurfaceD2DTarget::GetNativeSurface(NativeSurfaceType aType)
|
|
{
|
|
if (aType == NativeSurfaceType::D3D10_TEXTURE) {
|
|
return static_cast<void*>(mTexture.get());
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
ID3D10ShaderResourceView*
|
|
SourceSurfaceD2DTarget::GetSRView()
|
|
{
|
|
if (mSRView) {
|
|
return mSRView;
|
|
}
|
|
|
|
if (!Factory::GetDirect3D10Device()) {
|
|
gfxCriticalError() << "Invalid D3D10 device in D2D target surface (SRV)";
|
|
return nullptr;
|
|
}
|
|
|
|
HRESULT hr = Factory::GetDirect3D10Device()->CreateShaderResourceView(mTexture, nullptr, getter_AddRefs(mSRView));
|
|
|
|
if (FAILED(hr)) {
|
|
gfxWarning() << "Failed to create ShaderResourceView. Code: " << hexa(hr);
|
|
}
|
|
|
|
return mSRView;
|
|
}
|
|
|
|
void
|
|
SourceSurfaceD2DTarget::DrawTargetWillChange()
|
|
{
|
|
RefPtr<ID3D10Texture2D> oldTexture = mTexture;
|
|
|
|
D3D10_TEXTURE2D_DESC desc;
|
|
mTexture->GetDesc(&desc);
|
|
|
|
// Our original texture might implement the keyed mutex flag. We shouldn't
|
|
// need that here. We actually specifically don't want it since we don't lock
|
|
// our texture for usage!
|
|
desc.MiscFlags = 0;
|
|
|
|
// Get a copy of the surface data so the content at snapshot time was saved.
|
|
Factory::GetDirect3D10Device()->CreateTexture2D(&desc, nullptr, getter_AddRefs(mTexture));
|
|
Factory::GetDirect3D10Device()->CopyResource(mTexture, oldTexture);
|
|
|
|
mBitmap = nullptr;
|
|
|
|
DrawTargetD2D::mVRAMUsageSS += desc.Width * desc.Height * BytesPerPixel(mFormat);
|
|
mOwnsCopy = true;
|
|
|
|
// We now no longer depend on the source surface content remaining the same.
|
|
MarkIndependent();
|
|
}
|
|
|
|
ID2D1Bitmap*
|
|
SourceSurfaceD2DTarget::GetBitmap(ID2D1RenderTarget *aRT)
|
|
{
|
|
if (mBitmap) {
|
|
return mBitmap;
|
|
}
|
|
|
|
HRESULT hr;
|
|
D3D10_TEXTURE2D_DESC desc;
|
|
mTexture->GetDesc(&desc);
|
|
|
|
IntSize size(desc.Width, desc.Height);
|
|
|
|
RefPtr<IDXGISurface> surf;
|
|
hr = mTexture->QueryInterface((IDXGISurface**)getter_AddRefs(surf));
|
|
|
|
if (FAILED(hr)) {
|
|
gfxWarning() << "Failed to query interface texture to DXGISurface. Code: " << hexa(hr);
|
|
return nullptr;
|
|
}
|
|
|
|
D2D1_BITMAP_PROPERTIES props = D2D1::BitmapProperties(D2DPixelFormat(mFormat));
|
|
hr = aRT->CreateSharedBitmap(IID_IDXGISurface, surf, &props, getter_AddRefs(mBitmap));
|
|
|
|
if (FAILED(hr)) {
|
|
// This seems to happen for SurfaceFormat::A8 sometimes...
|
|
hr = aRT->CreateBitmap(D2D1::SizeU(desc.Width, desc.Height),
|
|
D2D1::BitmapProperties(D2DPixelFormat(mFormat)),
|
|
getter_AddRefs(mBitmap));
|
|
|
|
if (FAILED(hr)) {
|
|
gfxWarning() << "Failed in CreateBitmap. Code: " << hexa(hr);
|
|
return nullptr;
|
|
}
|
|
|
|
RefPtr<ID2D1RenderTarget> rt;
|
|
|
|
if (mDrawTarget) {
|
|
rt = mDrawTarget->mRT;
|
|
}
|
|
|
|
if (!rt) {
|
|
// Okay, we already separated from our drawtarget. And we're an A8
|
|
// surface the only way we can get to a bitmap is by creating a
|
|
// a rendertarget and from there copying to a bitmap! Terrible!
|
|
RefPtr<IDXGISurface> surface;
|
|
|
|
hr = mTexture->QueryInterface((IDXGISurface**)getter_AddRefs(surface));
|
|
|
|
if (FAILED(hr)) {
|
|
gfxWarning() << "Failed to QI texture to surface.";
|
|
return nullptr;
|
|
}
|
|
|
|
D2D1_RENDER_TARGET_PROPERTIES props =
|
|
D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT, D2DPixelFormat(mFormat));
|
|
hr = DrawTargetD2D::factory()->CreateDxgiSurfaceRenderTarget(surface, props, getter_AddRefs(rt));
|
|
|
|
if (FAILED(hr)) {
|
|
gfxWarning() << "Failed to create D2D render target for texture.";
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
mBitmap->CopyFromRenderTarget(nullptr, rt, nullptr);
|
|
return mBitmap;
|
|
}
|
|
|
|
return mBitmap;
|
|
}
|
|
|
|
void
|
|
SourceSurfaceD2DTarget::MarkIndependent()
|
|
{
|
|
if (mDrawTarget) {
|
|
MOZ_ASSERT(mDrawTarget->mSnapshot == this);
|
|
mDrawTarget->mSnapshot = nullptr;
|
|
mDrawTarget = nullptr;
|
|
}
|
|
}
|
|
|
|
DataSourceSurfaceD2DTarget::DataSourceSurfaceD2DTarget(SurfaceFormat aFormat)
|
|
: mFormat(aFormat)
|
|
, mMapped(false)
|
|
{
|
|
}
|
|
|
|
DataSourceSurfaceD2DTarget::~DataSourceSurfaceD2DTarget()
|
|
{
|
|
if (mMapped) {
|
|
mTexture->Unmap(0);
|
|
}
|
|
}
|
|
|
|
IntSize
|
|
DataSourceSurfaceD2DTarget::GetSize() const
|
|
{
|
|
D3D10_TEXTURE2D_DESC desc;
|
|
mTexture->GetDesc(&desc);
|
|
|
|
return IntSize(desc.Width, desc.Height);
|
|
}
|
|
|
|
SurfaceFormat
|
|
DataSourceSurfaceD2DTarget::GetFormat() const
|
|
{
|
|
return mFormat;
|
|
}
|
|
|
|
uint8_t*
|
|
DataSourceSurfaceD2DTarget::GetData()
|
|
{
|
|
EnsureMapped();
|
|
|
|
return (unsigned char*)mMap.pData;
|
|
}
|
|
|
|
int32_t
|
|
DataSourceSurfaceD2DTarget::Stride()
|
|
{
|
|
EnsureMapped();
|
|
return mMap.RowPitch;
|
|
}
|
|
|
|
bool
|
|
DataSourceSurfaceD2DTarget::Map(MapType aMapType, MappedSurface *aMappedSurface)
|
|
{
|
|
// DataSourceSurfaces used with the new Map API should not be used with GetData!!
|
|
MOZ_ASSERT(!mMapped);
|
|
MOZ_ASSERT(!mIsMapped);
|
|
|
|
if (!mTexture) {
|
|
return false;
|
|
}
|
|
|
|
D3D10_MAP mapType;
|
|
|
|
if (aMapType == MapType::READ) {
|
|
mapType = D3D10_MAP_READ;
|
|
} else if (aMapType == MapType::WRITE) {
|
|
mapType = D3D10_MAP_WRITE;
|
|
} else {
|
|
mapType = D3D10_MAP_READ_WRITE;
|
|
}
|
|
|
|
D3D10_MAPPED_TEXTURE2D map;
|
|
|
|
HRESULT hr = mTexture->Map(0, mapType, 0, &map);
|
|
|
|
if (FAILED(hr)) {
|
|
gfxWarning() << "Texture map failed with code: " << hexa(hr);
|
|
return false;
|
|
}
|
|
|
|
aMappedSurface->mData = (uint8_t*)map.pData;
|
|
aMappedSurface->mStride = map.RowPitch;
|
|
mIsMapped = !!aMappedSurface->mData;
|
|
|
|
return mIsMapped;
|
|
}
|
|
|
|
void
|
|
DataSourceSurfaceD2DTarget::Unmap()
|
|
{
|
|
MOZ_ASSERT(mIsMapped);
|
|
|
|
mIsMapped = false;
|
|
mTexture->Unmap(0);
|
|
}
|
|
|
|
void
|
|
DataSourceSurfaceD2DTarget::EnsureMapped()
|
|
{
|
|
// Do not use GetData() after having used Map!
|
|
MOZ_ASSERT(!mIsMapped);
|
|
if (!mMapped) {
|
|
HRESULT hr = mTexture->Map(0, D3D10_MAP_READ, 0, &mMap);
|
|
if (FAILED(hr)) {
|
|
gfxWarning() << "Failed to map texture to memory. Code: " << hexa(hr);
|
|
return;
|
|
}
|
|
mMapped = true;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|