Bug 1711648 - Move all device rects to the Box2D representations. r=jrmuizel

Differential Revision: https://phabricator.services.mozilla.com/D116401
This commit is contained in:
Nicolas Silva 2021-06-01 16:30:36 +00:00
Родитель 162e431533
Коммит 8aa37de340
64 изменённых файлов: 591 добавлений и 598 удалений

Просмотреть файл

@ -312,8 +312,8 @@ void DCLayerTree::Bind(wr::NativeTileId aId, wr::DeviceIntPoint* aOffset,
auto tile = surface->GetTile(aId.x, aId.y); auto tile = surface->GetTile(aId.x, aId.y);
wr::DeviceIntPoint targetOffset{0, 0}; wr::DeviceIntPoint targetOffset{0, 0};
gfx::IntRect validRect(aValidRect.origin.x, aValidRect.origin.y, gfx::IntRect validRect(aValidRect.min.x, aValidRect.min.y, aValidRect.width(),
aValidRect.size.width, aValidRect.size.height); aValidRect.height());
if (!tile->mValidRect.IsEqualEdges(validRect)) { if (!tile->mValidRect.IsEqualEdges(validRect)) {
tile->mValidRect = validRect; tile->mValidRect = validRect;
surface->DirtyAllocatedRect(); surface->DirtyAllocatedRect();
@ -447,9 +447,8 @@ void DCLayerTree::AddSurface(wr::NativeSurfaceId aId,
// on that. I suspect that will perform worse though, so we should only do // on that. I suspect that will perform worse though, so we should only do
// that for complex transforms (which are never provided right now). // that for complex transforms (which are never provided right now).
MOZ_ASSERT(transform.IsRectilinear()); MOZ_ASSERT(transform.IsRectilinear());
gfx::Rect clip = transform.Inverse().TransformBounds( gfx::Rect clip = transform.Inverse().TransformBounds(gfx::Rect(
gfx::Rect(aClipRect.origin.x, aClipRect.origin.y, aClipRect.size.width, aClipRect.min.x, aClipRect.min.y, aClipRect.width(), aClipRect.height()));
aClipRect.size.height));
// Set the clip rect - converting from world space to the pre-offset space // Set the clip rect - converting from world space to the pre-offset space
// that DC requires for rectangle clips. // that DC requires for rectangle clips.
visual->SetClip(D2DRect(clip)); visual->SetClip(D2DRect(clip));
@ -961,10 +960,10 @@ GLuint DCLayerTree::CreateEGLSurfaceForCompositionSurface(
POINT offset; POINT offset;
RECT update_rect; RECT update_rect;
update_rect.left = aSurfaceOffset.x + aDirtyRect.origin.x; update_rect.left = aSurfaceOffset.x + aDirtyRect.min.x;
update_rect.top = aSurfaceOffset.y + aDirtyRect.origin.y; update_rect.top = aSurfaceOffset.y + aDirtyRect.min.y;
update_rect.right = update_rect.left + aDirtyRect.size.width; update_rect.right = aSurfaceOffset.x + aDirtyRect.max.x;
update_rect.bottom = update_rect.top + aDirtyRect.size.height; update_rect.bottom = aSurfaceOffset.y + aDirtyRect.max.y;
hr = aCompositionSurface->BeginDraw(&update_rect, __uuidof(ID3D11Texture2D), hr = aCompositionSurface->BeginDraw(&update_rect, __uuidof(ID3D11Texture2D),
(void**)getter_AddRefs(backBuf), &offset); (void**)getter_AddRefs(backBuf), &offset);
@ -977,8 +976,8 @@ GLuint DCLayerTree::CreateEGLSurfaceForCompositionSurface(
// DC includes the origin of the dirty / update rect in the draw offset, // DC includes the origin of the dirty / update rect in the draw offset,
// undo that here since WR expects it to be an absolute offset. // undo that here since WR expects it to be an absolute offset.
offset.x -= aDirtyRect.origin.x; offset.x -= aDirtyRect.min.x;
offset.y -= aDirtyRect.origin.y; offset.y -= aDirtyRect.min.y;
D3D11_TEXTURE2D_DESC desc; D3D11_TEXTURE2D_DESC desc;
backBuf->GetDesc(&desc); backBuf->GetDesc(&desc);

Просмотреть файл

@ -543,12 +543,10 @@ RenderedFrameId RenderCompositorANGLE::EndFrame(
for (size_t i = 0; i < aDirtyRects.Length(); ++i) { for (size_t i = 0; i < aDirtyRects.Length(); ++i) {
const DeviceIntRect& rect = aDirtyRects[i]; const DeviceIntRect& rect = aDirtyRects[i];
// Clip rect to bufferSize // Clip rect to bufferSize
int left = std::max(0, std::min(rect.origin.x, bufferSize.width)); int left = std::max(0, std::min(rect.min.x, bufferSize.width));
int top = std::max(0, std::min(rect.origin.y, bufferSize.height)); int top = std::max(0, std::min(rect.min.y, bufferSize.height));
int right = std::max( int right = std::max(0, std::min(rect.max.x, bufferSize.width));
0, std::min(rect.origin.x + rect.size.width, bufferSize.width)); int bottom = std::max(0, std::min(rect.max.y, bufferSize.height));
int bottom = std::max(
0, std::min(rect.origin.y + rect.size.height, bufferSize.height));
// When rect is not empty, the rect could be passed to Present1(). // When rect is not empty, the rect could be passed to Present1().
if (left < right && top < bottom) { if (left < right && top < bottom) {

Просмотреть файл

@ -227,11 +227,10 @@ bool RenderCompositorD3D11SWGL::TileD3D11::Map(wr::DeviceIntRect aDirtyRect,
return false; return false;
} }
*aData = *aData = map.mData + aValidRect.min.y * map.mStride + aValidRect.min.x * 4;
map.mData + aValidRect.origin.y * map.mStride + aValidRect.origin.x * 4;
*aStride = map.mStride; *aStride = map.mStride;
mValidRect = gfx::Rect(aValidRect.origin.x, aValidRect.origin.y, mValidRect = gfx::Rect(aValidRect.min.x, aValidRect.min.y,
aValidRect.size.width, aValidRect.size.height); aValidRect.width(), aValidRect.height());
return true; return true;
} }
@ -293,13 +292,12 @@ bool RenderCompositorD3D11SWGL::TileD3D11::Map(wr::DeviceIntRect aDirtyRect,
// rect, so take the mapped resource's data (which covers the full tile size) // rect, so take the mapped resource's data (which covers the full tile size)
// and offset it by the top/left of the valid rect. // and offset it by the top/left of the valid rect.
*aData = (uint8_t*)mappedSubresource.pData + *aData = (uint8_t*)mappedSubresource.pData +
aValidRect.origin.y * mappedSubresource.RowPitch + aValidRect.min.y * mappedSubresource.RowPitch + aValidRect.min.x * 4;
aValidRect.origin.x * 4;
*aStride = mappedSubresource.RowPitch; *aStride = mappedSubresource.RowPitch;
// Store the new valid rect, so that we can composite only those pixels // Store the new valid rect, so that we can composite only those pixels
mValidRect = gfx::Rect(aValidRect.origin.x, aValidRect.origin.y, mValidRect = gfx::Rect(aValidRect.min.x, aValidRect.min.y, aValidRect.width(),
aValidRect.size.width, aValidRect.size.height); aValidRect.height());
return true; return true;
} }

Просмотреть файл

@ -117,13 +117,11 @@ RenderedFrameId RenderCompositorEGL::EndFrame(
gfx::IntRegion bufferInvalid; gfx::IntRegion bufferInvalid;
const auto bufferSize = GetBufferSize(); const auto bufferSize = GetBufferSize();
for (const DeviceIntRect& rect : aDirtyRects) { for (const DeviceIntRect& rect : aDirtyRects) {
const auto left = std::max(0, std::min(bufferSize.width, rect.origin.x)); const auto left = std::max(0, std::min(bufferSize.width, rect.min.x));
const auto top = std::max(0, std::min(bufferSize.height, rect.origin.y)); const auto top = std::max(0, std::min(bufferSize.height, rect.min.y));
const auto right = std::min(bufferSize.width, const auto right = std::min(bufferSize.width, std::max(0, rect.max.x));
std::max(0, rect.origin.x + rect.size.width)); const auto bottom = std::min(bufferSize.height, std::max(0, rect.max.y));
const auto bottom = std::min(
bufferSize.height, std::max(0, rect.origin.y + rect.size.height));
const auto width = right - left; const auto width = right - left;
const auto height = bottom - top; const auto height = bottom - top;
@ -273,16 +271,14 @@ void RenderCompositorEGL::SetBufferDamageRegion(const wr::DeviceIntRect* aRects,
const auto bufferSize = GetBufferSize(); const auto bufferSize = GetBufferSize();
for (size_t i = 0; i < aNumRects; i++) { for (size_t i = 0; i < aNumRects; i++) {
const auto left = const auto left =
std::max(0, std::min(bufferSize.width, aRects[i].origin.x)); std::max(0, std::min(bufferSize.width, aRects[i].min.x));
const auto top = const auto top =
std::max(0, std::min(bufferSize.height, aRects[i].origin.y)); std::max(0, std::min(bufferSize.height, aRects[i].min.y));
const auto right = const auto right =
std::min(bufferSize.width, std::min(bufferSize.width, std::max(0, aRects[i].max.x));
std::max(0, aRects[i].origin.x + aRects[i].size.width));
const auto bottom = const auto bottom =
std::min(bufferSize.height, std::min(bufferSize.height, std::max(0, aRects[i].max.y));
std::max(0, aRects[i].origin.y + aRects[i].size.height));
const auto width = right - left; const auto width = right - left;
const auto height = bottom - top; const auto height = bottom - top;

Просмотреть файл

@ -88,8 +88,8 @@ void RenderCompositorLayersSWGL::StartCompositing(
MOZ_RELEASE_ASSERT(aNumDirtyRects > 0); MOZ_RELEASE_ASSERT(aNumDirtyRects > 0);
for (size_t i = 0; i < aNumDirtyRects; i++) { for (size_t i = 0; i < aNumDirtyRects; i++) {
const auto& rect = aDirtyRects[i]; const auto& rect = aDirtyRects[i];
dirty.OrWith(gfx::IntRect(rect.origin.x, rect.origin.y, rect.size.width, dirty.OrWith(
rect.size.height)); gfx::IntRect(rect.min.x, rect.min.y, rect.width(), rect.height()));
} }
dirty.AndWith(bounds); dirty.AndWith(bounds);
@ -97,8 +97,8 @@ void RenderCompositorLayersSWGL::StartCompositing(
opaque.SubOut(mWidget->GetTransparentRegion().ToUnknownRegion()); opaque.SubOut(mWidget->GetTransparentRegion().ToUnknownRegion());
for (size_t i = 0; i < aNumOpaqueRects; i++) { for (size_t i = 0; i < aNumOpaqueRects; i++) {
const auto& rect = aOpaqueRects[i]; const auto& rect = aOpaqueRects[i];
opaque.OrWith(gfx::IntRect(rect.origin.x, rect.origin.y, rect.size.width, opaque.OrWith(
rect.size.height)); gfx::IntRect(rect.min.x, rect.min.y, rect.width(), rect.height()));
} }
if (!mCompositor->BeginFrameForWindow(dirty, Nothing(), bounds, opaque)) { if (!mCompositor->BeginFrameForWindow(dirty, Nothing(), bounds, opaque)) {
return; return;
@ -188,21 +188,19 @@ bool RenderCompositorLayersSWGL::MapTile(wr::NativeTileId aId,
mCurrentTile = layerCursor->second.get(); mCurrentTile = layerCursor->second.get();
mCurrentTileId = aId; mCurrentTileId = aId;
mCurrentTileDirty = mCurrentTileDirty = gfx::IntRect(aDirtyRect.min.x, aDirtyRect.min.y,
gfx::IntRect(aDirtyRect.origin.x, aDirtyRect.origin.y, aDirtyRect.width(), aDirtyRect.height());
aDirtyRect.size.width, aDirtyRect.size.height);
if (!mCurrentTile->Map(aDirtyRect, aValidRect, aData, aStride)) { if (!mCurrentTile->Map(aDirtyRect, aValidRect, aData, aStride)) {
gfxCriticalNote << "MapTile failed aValidRect: " gfxCriticalNote << "MapTile failed aValidRect: "
<< gfx::Rect(aValidRect.origin.x, aValidRect.origin.y, << gfx::Rect(aValidRect.min.x, aValidRect.min.y,
aValidRect.size.width, aValidRect.size.height); aValidRect.width(), aValidRect.height());
return false; return false;
} }
// Store the new valid rect, so that we can composite only those pixels // Store the new valid rect, so that we can composite only those pixels
mCurrentTile->mValidRect = mCurrentTile->mValidRect = gfx::Rect(aValidRect.min.x, aValidRect.min.y,
gfx::Rect(aValidRect.origin.x, aValidRect.origin.y, aValidRect.size.width, aValidRect.width(), aValidRect.height());
aValidRect.size.height);
return true; return true;
} }
@ -307,8 +305,8 @@ void RenderCompositorLayersSWGL::AddSurface(
aTransform.m31, aTransform.m32, aTransform.m33, aTransform.m34, aTransform.m31, aTransform.m32, aTransform.m33, aTransform.m34,
aTransform.m41, aTransform.m42, aTransform.m43, aTransform.m44); aTransform.m41, aTransform.m42, aTransform.m43, aTransform.m44);
gfx::IntRect clipRect(aClipRect.origin.x, aClipRect.origin.y, gfx::IntRect clipRect(aClipRect.min.x, aClipRect.min.y, aClipRect.width(),
aClipRect.size.width, aClipRect.size.height); aClipRect.height());
mFrameSurfaces.AppendElement(FrameSurface{aId, transform, clipRect, mFrameSurfaces.AppendElement(FrameSurface{aId, transform, clipRect,
ToSamplingFilter(aImageRendering)}); ToSamplingFilter(aImageRendering)});

Просмотреть файл

@ -391,8 +391,8 @@ void RenderCompositorNative::AddSurface(
gfx::IntPoint layerPosition(surface.mTileSize.width * it->first.mX, gfx::IntPoint layerPosition(surface.mTileSize.width * it->first.mX,
surface.mTileSize.height * it->first.mY); surface.mTileSize.height * it->first.mY);
layer->SetPosition(layerPosition); layer->SetPosition(layerPosition);
gfx::IntRect clipRect(aClipRect.origin.x, aClipRect.origin.y, gfx::IntRect clipRect(aClipRect.min.x, aClipRect.min.y, aClipRect.width(),
aClipRect.size.width, aClipRect.size.height); aClipRect.height());
layer->SetClipRect(Some(clipRect)); layer->SetClipRect(Some(clipRect));
layer->SetTransform(transform); layer->SetTransform(transform);
layer->SetSamplingFilter(ToSamplingFilter(aImageRendering)); layer->SetSamplingFilter(ToSamplingFilter(aImageRendering));
@ -505,10 +505,10 @@ void RenderCompositorNativeOGL::Bind(wr::NativeTileId aId,
uint32_t* aFboId, uint32_t* aFboId,
wr::DeviceIntRect aDirtyRect, wr::DeviceIntRect aDirtyRect,
wr::DeviceIntRect aValidRect) { wr::DeviceIntRect aValidRect) {
gfx::IntRect validRect(aValidRect.origin.x, aValidRect.origin.y, gfx::IntRect validRect(aValidRect.min.x, aValidRect.min.y, aValidRect.width(),
aValidRect.size.width, aValidRect.size.height); aValidRect.height());
gfx::IntRect dirtyRect(aDirtyRect.origin.x, aDirtyRect.origin.y, gfx::IntRect dirtyRect(aDirtyRect.min.x, aDirtyRect.min.y, aDirtyRect.width(),
aDirtyRect.size.width, aDirtyRect.size.height); aDirtyRect.height());
BindNativeLayer(aId, dirtyRect); BindNativeLayer(aId, dirtyRect);
@ -615,10 +615,10 @@ bool RenderCompositorNativeSWGL::MapTile(wr::NativeTileId aId,
if (mNativeLayerForEntireWindow) { if (mNativeLayerForEntireWindow) {
return false; return false;
} }
gfx::IntRect dirtyRect(aDirtyRect.origin.x, aDirtyRect.origin.y, gfx::IntRect dirtyRect(aDirtyRect.min.x, aDirtyRect.min.y, aDirtyRect.width(),
aDirtyRect.size.width, aDirtyRect.size.height); aDirtyRect.height());
gfx::IntRect validRect(aValidRect.origin.x, aValidRect.origin.y, gfx::IntRect validRect(aValidRect.min.x, aValidRect.min.y, aValidRect.width(),
aValidRect.size.width, aValidRect.size.height); aValidRect.height());
BindNativeLayer(aId, dirtyRect); BindNativeLayer(aId, dirtyRect);
if (!MapNativeLayer(mCurrentlyBoundNativeLayer, dirtyRect, validRect)) { if (!MapNativeLayer(mCurrentlyBoundNativeLayer, dirtyRect, validRect)) {
UnbindNativeLayer(); UnbindNativeLayer();

Просмотреть файл

@ -69,13 +69,11 @@ RenderedFrameId RenderCompositorOGL::EndFrame(
gfx::IntRegion bufferInvalid; gfx::IntRegion bufferInvalid;
const auto bufferSize = GetBufferSize(); const auto bufferSize = GetBufferSize();
for (const DeviceIntRect& rect : aDirtyRects) { for (const DeviceIntRect& rect : aDirtyRects) {
const auto left = std::max(0, std::min(bufferSize.width, rect.origin.x)); const auto left = std::max(0, std::min(bufferSize.width, rect.min.x));
const auto top = std::max(0, std::min(bufferSize.height, rect.origin.y)); const auto top = std::max(0, std::min(bufferSize.height, rect.min.y));
const auto right = std::min(bufferSize.width, const auto right = std::min(bufferSize.width, std::max(0, rect.max.x));
std::max(0, rect.origin.x + rect.size.width)); const auto bottom = std::min(bufferSize.height, std::max(0, rect.max.y));
const auto bottom = std::min(
bufferSize.height, std::max(0, rect.origin.y + rect.size.height));
const auto width = right - left; const auto width = right - left;
const auto height = bottom - top; const auto height = bottom - top;

Просмотреть файл

@ -380,9 +380,9 @@ bool RenderCompositorOGLSWGL::TileOGL::Map(wr::DeviceIntRect aDirtyRect,
gl->fBindBuffer(LOCAL_GL_PIXEL_UNPACK_BUFFER, mPBO); gl->fBindBuffer(LOCAL_GL_PIXEL_UNPACK_BUFFER, mPBO);
size_t stride = mSurface->Stride(); size_t stride = mSurface->Stride();
size_t offset = size_t offset =
stride * aValidRect.origin.y + aValidRect.origin.x * sizeof(uint32_t); stride * aValidRect.min.y + aValidRect.min.x * sizeof(uint32_t);
size_t length = stride * (aValidRect.size.height - 1) + size_t length = stride * (aValidRect.height() - 1) +
aValidRect.size.width * sizeof(uint32_t); (aValidRect.width()) * sizeof(uint32_t);
void* data = gl->fMapBufferRange( void* data = gl->fMapBufferRange(
LOCAL_GL_PIXEL_UNPACK_BUFFER, offset, length, LOCAL_GL_PIXEL_UNPACK_BUFFER, offset, length,
LOCAL_GL_MAP_WRITE_BIT | LOCAL_GL_MAP_INVALIDATE_BUFFER_BIT); LOCAL_GL_MAP_WRITE_BIT | LOCAL_GL_MAP_INVALIDATE_BUFFER_BIT);
@ -400,8 +400,8 @@ bool RenderCompositorOGLSWGL::TileOGL::Map(wr::DeviceIntRect aDirtyRect,
} }
// Verify that we're not somehow using a PBOUnpackSurface. // Verify that we're not somehow using a PBOUnpackSurface.
MOZ_ASSERT(map.mData != nullptr); MOZ_ASSERT(map.mData != nullptr);
*aData = map.mData + aValidRect.origin.y * map.mStride + *aData = map.mData + aValidRect.min.y * map.mStride +
aValidRect.origin.x * sizeof(uint32_t); aValidRect.min.x * sizeof(uint32_t);
*aStride = map.mStride; *aStride = map.mStride;
} }
return true; return true;

Просмотреть файл

@ -131,8 +131,8 @@ bool RenderCompositorSWGL::AllocateMappedBuffer(
LayoutDeviceIntRegion opaque; LayoutDeviceIntRegion opaque;
for (size_t i = 0; i < aNumOpaqueRects; i++) { for (size_t i = 0; i < aNumOpaqueRects; i++) {
const auto& rect = aOpaqueRects[i]; const auto& rect = aOpaqueRects[i];
opaque.OrWith(LayoutDeviceIntRect(rect.origin.x, rect.origin.y, opaque.OrWith(LayoutDeviceIntRect(rect.min.x, rect.min.y, rect.width(),
rect.size.width, rect.size.height)); rect.height()));
} }
LayoutDeviceIntRegion clear = mWidget->GetTransparentRegion(); LayoutDeviceIntRegion clear = mWidget->GetTransparentRegion();
@ -162,8 +162,8 @@ void RenderCompositorSWGL::StartCompositing(
mDirtyRegion.SetEmpty(); mDirtyRegion.SetEmpty();
for (size_t i = 0; i < aNumDirtyRects; i++) { for (size_t i = 0; i < aNumDirtyRects; i++) {
const auto& rect = aDirtyRects[i]; const auto& rect = aDirtyRects[i];
mDirtyRegion.OrWith(LayoutDeviceIntRect( mDirtyRegion.OrWith(LayoutDeviceIntRect(rect.min.x, rect.min.y,
rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)); rect.width(), rect.height()));
} }
// Ensure the region lies within the widget bounds // Ensure the region lies within the widget bounds
mDirtyRegion.AndWith(bounds); mDirtyRegion.AndWith(bounds);

Просмотреть файл

@ -305,10 +305,10 @@ bool TransactionBuilder::IsRenderedFrameInvalidated() const {
void TransactionBuilder::SetDocumentView( void TransactionBuilder::SetDocumentView(
const LayoutDeviceIntRect& aDocumentRect) { const LayoutDeviceIntRect& aDocumentRect) {
wr::DeviceIntRect wrDocRect; wr::DeviceIntRect wrDocRect;
wrDocRect.origin.x = aDocumentRect.x; wrDocRect.min.x = aDocumentRect.x;
wrDocRect.origin.y = aDocumentRect.y; wrDocRect.min.y = aDocumentRect.y;
wrDocRect.size.width = aDocumentRect.width; wrDocRect.max.x = aDocumentRect.x + aDocumentRect.width;
wrDocRect.size.height = aDocumentRect.height; wrDocRect.max.y = aDocumentRect.y + aDocumentRect.height;
wr_transaction_set_document_view(mTxn, &wrDocRect); wr_transaction_set_document_view(mTxn, &wrDocRect);
} }

Просмотреть файл

@ -345,10 +345,10 @@ static inline wr::LayoutRect ToLayoutRect(const gfx::Rect& rect) {
static inline wr::DeviceIntRect ToDeviceIntRect( static inline wr::DeviceIntRect ToDeviceIntRect(
const mozilla::ImageIntRect& rect) { const mozilla::ImageIntRect& rect) {
wr::DeviceIntRect r; wr::DeviceIntRect r;
r.origin.x = rect.X(); r.min.x = rect.X();
r.origin.y = rect.Y(); r.min.y = rect.Y();
r.size.width = rect.Width(); r.max.x = rect.X() + rect.Width();
r.size.height = rect.Height(); r.max.y = rect.Y() + rect.Height();
return r; return r;
} }

Просмотреть файл

@ -47,3 +47,9 @@ bitflags = true
[export.rename] [export.rename]
"ThinVec" = "nsTArray" "ThinVec" = "nsTArray"
[export.body]
"Box2D" = """
inline T width() const { return max.x - min.x; }
inline T height() const { return max.y - min.y; }
"""

Просмотреть файл

@ -716,7 +716,7 @@ pub extern "C" fn wr_renderer_get_screenshot_async(
assert!(!screenshot_height.is_null()); assert!(!screenshot_height.is_null());
let (handle, size) = renderer.get_screenshot_async( let (handle, size) = renderer.get_screenshot_async(
DeviceIntRect::new( DeviceIntRect::from_origin_and_size(
DeviceIntPoint::new(window_x, window_y), DeviceIntPoint::new(window_x, window_y),
DeviceIntSize::new(window_width, window_height), DeviceIntSize::new(window_width, window_height),
), ),
@ -2103,7 +2103,7 @@ pub extern "C" fn wr_resource_updates_update_blob_image(
descriptor.into(), descriptor.into(),
Arc::new(bytes.flush_into_vec()), Arc::new(bytes.flush_into_vec()),
visible_rect, visible_rect,
&DirtyRect::Partial(dirty_rect), &DirtyRect::Partial(dirty_rect.to_box2d()),
); );
} }

Просмотреть файл

@ -17,7 +17,7 @@ use rayon::ThreadPool;
use webrender::api::units::{BlobDirtyRect, BlobToDeviceTranslation, DeviceIntRect}; use webrender::api::units::{BlobDirtyRect, BlobToDeviceTranslation, DeviceIntRect};
use webrender::api::*; use webrender::api::*;
use euclid::Rect; use euclid::{Rect, Box2D};
use std; use std;
use std::collections::btree_map::BTreeMap; use std::collections::btree_map::BTreeMap;
use std::collections::hash_map; use std::collections::hash_map;
@ -273,6 +273,7 @@ impl BlobWriter {
} }
} }
// TODO: replace with euclid::Box2D
#[derive(Debug, Eq, PartialEq, Clone, Copy, Ord, PartialOrd)] #[derive(Debug, Eq, PartialEq, Clone, Copy, Ord, PartialOrd)]
#[repr(C)] #[repr(C)]
/// A two-points representation of a rectangle. /// A two-points representation of a rectangle.
@ -329,6 +330,23 @@ impl<T> From<&Rect<i32, T>> for Box2d {
} }
} }
impl<T> From<Box2D<i32, T>> for Box2d {
fn from(rect: Box2D<i32, T>) -> Box2d {
(&rect).into()
}
}
impl<T> From<&Box2D<i32, T>> for Box2d {
fn from(rect: &Box2D<i32, T>) -> Box2d {
Box2d {
x1: rect.min.x,
y1: rect.min.y,
x2: rect.max.x,
y2: rect.max.y,
}
}
}
/// Provides an API for looking up the display items in a blob image by bounds, yielding items /// Provides an API for looking up the display items in a blob image by bounds, yielding items
/// with equal bounds in their original relative ordering. /// with equal bounds in their original relative ordering.
/// ///
@ -634,7 +652,7 @@ fn rasterize_blob(job: Job) -> (BlobImageRequest, BlobImageResult) {
let mut output = vec![0u8; buf_size]; let mut output = vec![0u8; buf_size];
let dirty_rect = match job.dirty_rect { let dirty_rect = match job.dirty_rect {
DirtyRect::Partial(rect) => Some(rect), DirtyRect::Partial(rect) => Some(rect.to_rect()),
DirtyRect::All => None, DirtyRect::All => None,
}; };
assert!(descriptor.rect.size.width > 0 && descriptor.rect.size.height > 0); assert!(descriptor.rect.size.width > 0 && descriptor.rect.size.height > 0);
@ -653,9 +671,9 @@ fn rasterize_blob(job: Job) -> (BlobImageRequest, BlobImageResult) {
) { ) {
// We want the dirty rect local to the tile rather than the whole image. // We want the dirty rect local to the tile rather than the whole image.
// TODO(nical): move that up and avoid recomupting the tile bounds in the callback // TODO(nical): move that up and avoid recomupting the tile bounds in the callback
let dirty_rect = job.dirty_rect.to_subrect_of(&descriptor.rect); let dirty_rect = job.dirty_rect.to_subrect_of(&descriptor.rect.to_box2d());
let tx: BlobToDeviceTranslation = (-descriptor.rect.origin.to_vector()).into(); let tx: BlobToDeviceTranslation = (-descriptor.rect.origin.to_vector()).into();
let rasterized_rect = tx.transform_rect(&dirty_rect); let rasterized_rect = tx.transform_box(&dirty_rect);
Ok(RasterizedBlobImage { Ok(RasterizedBlobImage {
rasterized_rect, rasterized_rect,
@ -705,10 +723,10 @@ impl BlobImageHandler for Moz2dBlobImageHandler {
let command = e.get_mut(); let command = e.get_mut();
let dirty_rect = if let DirtyRect::Partial(rect) = *dirty_rect { let dirty_rect = if let DirtyRect::Partial(rect) = *dirty_rect {
Box2d { Box2d {
x1: rect.min_x(), x1: rect.min.x,
y1: rect.min_y(), y1: rect.min.y,
x2: rect.max_x(), x2: rect.max.x,
y2: rect.max_y(), y2: rect.max.y,
} }
} else { } else {
Box2d { Box2d {

Просмотреть файл

@ -62,7 +62,7 @@ impl App {
for (pipeline_id, color, offset) in init_data { for (pipeline_id, color, offset) in init_data {
let size = DeviceIntSize::new(250, 250); let size = DeviceIntSize::new(250, 250);
let bounds = DeviceIntRect::new(offset, size); let bounds = DeviceIntRect::from_origin_and_size(offset, size);
let document_id = api.add_document(size); let document_id = api.add_document(size);
let mut txn = Transaction::new(); let mut txn = Transaction::new();
@ -74,7 +74,7 @@ impl App {
pipeline_id, pipeline_id,
content_rect: LayoutRect::new( content_rect: LayoutRect::new(
LayoutPoint::origin(), LayoutPoint::origin(),
bounds.size.to_f32() / Scale::new(device_pixel_ratio), bounds.size().to_f32() / Scale::new(device_pixel_ratio),
), ),
color, color,
}); });

Просмотреть файл

@ -12,7 +12,7 @@ PER_INSTANCE in float aDevicePixelScale;
PER_INSTANCE in ivec2 aTransformIds; PER_INSTANCE in ivec2 aTransformIds;
struct ClipMaskInstanceCommon { struct ClipMaskInstanceCommon {
RectWithSize sub_rect; RectWithEndpoint sub_rect;
vec2 task_origin; vec2 task_origin;
vec2 screen_origin; vec2 screen_origin;
float device_pixel_scale; float device_pixel_scale;
@ -23,7 +23,7 @@ struct ClipMaskInstanceCommon {
ClipMaskInstanceCommon fetch_clip_item_common() { ClipMaskInstanceCommon fetch_clip_item_common() {
ClipMaskInstanceCommon cmi; ClipMaskInstanceCommon cmi;
cmi.sub_rect = RectWithSize(aClipDeviceArea.xy, aClipDeviceArea.zw); cmi.sub_rect = RectWithEndpoint(aClipDeviceArea.xy, aClipDeviceArea.zw);
cmi.task_origin = aClipOrigins.xy; cmi.task_origin = aClipOrigins.xy;
cmi.screen_origin = aClipOrigins.zw; cmi.screen_origin = aClipOrigins.zw;
cmi.device_pixel_scale = aDevicePixelScale; cmi.device_pixel_scale = aDevicePixelScale;
@ -49,11 +49,11 @@ RectWithSize intersect_rect(RectWithSize a, RectWithSize b) {
ClipVertexInfo write_clip_tile_vertex(RectWithSize local_clip_rect, ClipVertexInfo write_clip_tile_vertex(RectWithSize local_clip_rect,
Transform prim_transform, Transform prim_transform,
Transform clip_transform, Transform clip_transform,
RectWithSize sub_rect, RectWithEndpoint sub_rect,
vec2 task_origin, vec2 task_origin,
vec2 screen_origin, vec2 screen_origin,
float device_pixel_scale) { float device_pixel_scale) {
vec2 device_pos = screen_origin + sub_rect.p0 + aPosition.xy * sub_rect.size; vec2 device_pos = screen_origin + mix(sub_rect.p0, sub_rect.p1, aPosition.xy);
vec2 world_pos = device_pos / device_pixel_scale; vec2 world_pos = device_pos / device_pixel_scale;
vec4 pos = prim_transform.m * vec4(world_pos, 0.0, 1.0); vec4 pos = prim_transform.m * vec4(world_pos, 0.0, 1.0);
@ -70,7 +70,7 @@ ClipVertexInfo write_clip_tile_vertex(RectWithSize local_clip_rect,
// We can therefore simplify this when the clip construction is rewritten // We can therefore simplify this when the clip construction is rewritten
// to only affect the areas touched by a clip. // to only affect the areas touched by a clip.
vec4 vertex_pos = vec4( vec4 vertex_pos = vec4(
task_origin + sub_rect.p0 + aPosition.xy * sub_rect.size, task_origin + mix(sub_rect.p0, sub_rect.p1, aPosition.xy),
0.0, 0.0,
1.0 1.0
); );

Просмотреть файл

@ -61,13 +61,13 @@ PER_INSTANCE attribute vec4 aUvRect0;
void main(void) { void main(void) {
// Get world position // Get world position
vec2 world_pos = aDeviceRect.xy + aPosition.xy * aDeviceRect.zw; vec2 world_pos = mix(aDeviceRect.xy, aDeviceRect.zw, aPosition.xy);
// Clip the position to the world space clip rect // Clip the position to the world space clip rect
vec2 clipped_world_pos = clamp(world_pos, aDeviceClipRect.xy, aDeviceClipRect.xy + aDeviceClipRect.zw); vec2 clipped_world_pos = clamp(world_pos, aDeviceClipRect.xy, aDeviceClipRect.zw);
// Derive the normalized UV from the clipped vertex position // Derive the normalized UV from the clipped vertex position
vec2 uv = (clipped_world_pos - aDeviceRect.xy) / aDeviceRect.zw; vec2 uv = (clipped_world_pos - aDeviceRect.xy) / (aDeviceRect.zw - aDeviceRect.xy);
#ifdef WR_FEATURE_YUV #ifdef WR_FEATURE_YUV
int yuv_color_space = int(aParams.y); int yuv_color_space = int(aParams.y);

Просмотреть файл

@ -158,8 +158,9 @@ void main(void) {
int style1 = (aFlags >> 16) & 0xff; int style1 = (aFlags >> 16) & 0xff;
int clip_mode = (aFlags >> 24) & 0x0f; int clip_mode = (aFlags >> 24) & 0x0f;
vec2 size = aRect.zw - aRect.xy;
vec2 outer_scale = get_outer_corner_scale(segment); vec2 outer_scale = get_outer_corner_scale(segment);
vec2 outer = outer_scale * aRect.zw; vec2 outer = outer_scale * size;
vec2 clip_sign = 1.0 - 2.0 * outer_scale; vec2 clip_sign = 1.0 - 2.0 * outer_scale;
// Set some flags used by the FS to determine the // Set some flags used by the FS to determine the
@ -202,7 +203,7 @@ void main(void) {
clip_mode clip_mode
); );
vPartialWidths = vec4(aWidths / 3.0, aWidths / 2.0); vPartialWidths = vec4(aWidths / 3.0, aWidths / 2.0);
vPos = aRect.zw * aPosition.xy; vPos = size * aPosition.xy;
vec4[2] color0 = get_colors_for_side(aColor0, style0); vec4[2] color0 = get_colors_for_side(aColor0, style0);
vColor00 = color0[0]; vColor00 = color0[0];
@ -228,7 +229,7 @@ void main(void) {
radius += 2.0; radius += 2.0;
vPos = vClipParams1.xy + radius * (2.0 * aPosition.xy - 1.0); vPos = vClipParams1.xy + radius * (2.0 * aPosition.xy - 1.0);
vPos = clamp(vPos, vec2(0.0), aRect.zw); vPos = clamp(vPos, vec2(0.0), size);
} else if (clip_mode == CLIP_DASH_CORNER) { } else if (clip_mode == CLIP_DASH_CORNER) {
vec2 center = (aClipParams1.xy + aClipParams2.xy) * 0.5; vec2 center = (aClipParams1.xy + aClipParams2.xy) * 0.5;
// This is a gross approximation which works out because dashes don't have // This is a gross approximation which works out because dashes don't have

Просмотреть файл

@ -85,7 +85,8 @@ void main(void) {
bool do_aa = ((aFlags >> 24) & 0xf0) != 0; bool do_aa = ((aFlags >> 24) & 0xf0) != 0;
vec2 outer_scale = get_outer_corner_scale(segment); vec2 outer_scale = get_outer_corner_scale(segment);
vec2 outer = outer_scale * aRect.zw; vec2 size = aRect.zw - aRect.xy;
vec2 outer = outer_scale * size;
vec2 clip_sign = 1.0 - 2.0 * outer_scale; vec2 clip_sign = 1.0 - 2.0 * outer_scale;
int mix_colors; int mix_colors;
@ -103,7 +104,7 @@ void main(void) {
} }
vMixColors = mix_colors; vMixColors = mix_colors;
vPos = aRect.zw * aPosition.xy; vPos = size * aPosition.xy;
vColor0 = aColor0; vColor0 = aColor0;
vColor1 = aColor1; vColor1 = aColor1;

Просмотреть файл

@ -46,7 +46,7 @@ ClipImageVertexInfo write_clip_image_vertex(RectWithSize tile_rect,
RectWithSize local_clip_rect, RectWithSize local_clip_rect,
Transform prim_transform, Transform prim_transform,
Transform clip_transform, Transform clip_transform,
RectWithSize sub_rect, RectWithEndpoint sub_rect,
vec2 task_origin, vec2 task_origin,
vec2 screen_origin, vec2 screen_origin,
float device_pixel_scale) { float device_pixel_scale) {

Просмотреть файл

@ -33,7 +33,7 @@ void main(void) {
float d = aEndOffset - aStartOffset; float d = aEndOffset - aStartOffset;
v_offset_scale = d != 0.0 ? 1.0 / d : 0.0; v_offset_scale = d != 0.0 ? 1.0 / d : 0.0;
vec2 pos = aTaskRect.xy + aTaskRect.zw * aPosition.xy; vec2 pos = mix(aTaskRect.xy, aTaskRect.zw, aPosition.xy);
gl_Position = uTransform * vec4(pos, 0.0, 1.0); gl_Position = uTransform * vec4(pos, 0.0, 1.0);
v_angle = PI / 2.0 - aAngle; v_angle = PI / 2.0 - aAngle;
@ -42,7 +42,7 @@ void main(void) {
// v_pos and v_center are in a coordinate space relative to the task rect // v_pos and v_center are in a coordinate space relative to the task rect
// (so they are independent of the task origin). // (so they are independent of the task origin).
v_center = aCenter * v_offset_scale; v_center = aCenter * v_offset_scale;
v_pos = aTaskRect.zw * aPosition.xy * v_offset_scale * aScale; v_pos = (aTaskRect.zw - aTaskRect.xy) * aPosition.xy * v_offset_scale * aScale;
v_gradient_repeat = float(aExtendMode == EXTEND_MODE_REPEAT); v_gradient_repeat = float(aExtendMode == EXTEND_MODE_REPEAT);
v_gradient_address = aGradientStopsAddress; v_gradient_address = aGradientStopsAddress;

Просмотреть файл

@ -21,7 +21,7 @@ void main(void) {
vColor0 = aColor0; vColor0 = aColor0;
vColor1 = aColor1; vColor1 = aColor1;
gl_Position = uTransform * vec4(aTaskRect.xy + aTaskRect.zw * aPosition.xy, 0.0, 1.0); gl_Position = uTransform * vec4(mix(aTaskRect.xy, aTaskRect.zw, aPosition.xy), 0.0, 1.0);
} }
#endif #endif

Просмотреть файл

@ -84,7 +84,7 @@ void main(void) {
vLocalPos = mix(aPosition.xy, aPosition.yx, aAxisSelect) * size; vLocalPos = mix(aPosition.xy, aPosition.yx, aAxisSelect) * size;
gl_Position = uTransform * vec4(aTaskRect.xy + aTaskRect.zw * aPosition.xy, 0.0, 1.0); gl_Position = uTransform * vec4(mix(aTaskRect.xy, aTaskRect.zw, aPosition.xy), 0.0, 1.0);
} }
#endif #endif

Просмотреть файл

@ -22,7 +22,7 @@ PER_INSTANCE in int aExtendMode;
PER_INSTANCE in int aGradientStopsAddress; PER_INSTANCE in int aGradientStopsAddress;
void main(void) { void main(void) {
vec2 pos = aTaskRect.xy + aTaskRect.zw * aPosition.xy; vec2 pos = mix(aTaskRect.xy, aTaskRect.zw, aPosition.xy);
gl_Position = uTransform * vec4(pos, 0.0, 1.0); gl_Position = uTransform * vec4(pos, 0.0, 1.0);
v_pos = aPosition.xy * aScale; v_pos = aPosition.xy * aScale;
@ -33,7 +33,7 @@ void main(void) {
v_scale_dir = dir / dot(dir, dir); v_scale_dir = dir / dot(dir, dir);
v_start_offset = dot(aStartPoint, v_scale_dir); v_start_offset = dot(aStartPoint, v_scale_dir);
v_scale_dir *= aTaskRect.zw; v_scale_dir *= (aTaskRect.zw - aTaskRect.xy);
v_gradient_repeat = float(aExtendMode == EXTEND_MODE_REPEAT); v_gradient_repeat = float(aExtendMode == EXTEND_MODE_REPEAT);
v_gradient_address = aGradientStopsAddress; v_gradient_address = aGradientStopsAddress;

Просмотреть файл

@ -28,7 +28,7 @@ void main(void) {
float rd = aEndRadius - aStartRadius; float rd = aEndRadius - aStartRadius;
float radius_scale = rd != 0.0 ? 1.0 / rd : 0.0; float radius_scale = rd != 0.0 ? 1.0 / rd : 0.0;
vec2 pos = aTaskRect.xy + aTaskRect.zw * aPosition.xy; vec2 pos = mix(aTaskRect.xy, aTaskRect.zw, aPosition.xy);
gl_Position = uTransform * vec4(pos, 0.0, 1.0); gl_Position = uTransform * vec4(pos, 0.0, 1.0);
v_start_radius = aStartRadius * radius_scale; v_start_radius = aStartRadius * radius_scale;
@ -38,7 +38,7 @@ void main(void) {
// v_pos is in a coordinate space relative to the task rect // v_pos is in a coordinate space relative to the task rect
// (so it is independent of the task origin). // (so it is independent of the task origin).
v_pos = (aTaskRect.zw * aPosition.xy * aScale - aCenter) * radius_scale; v_pos = ((aTaskRect.zw - aTaskRect.xy) * aPosition.xy * aScale - aCenter) * radius_scale;
v_pos.y *= aXYRatio; v_pos.y *= aXYRatio;
v_gradient_repeat = float(aExtendMode == EXTEND_MODE_REPEAT); v_gradient_repeat = float(aExtendMode == EXTEND_MODE_REPEAT);

Просмотреть файл

@ -22,7 +22,7 @@ PER_INSTANCE attribute vec4 aScaleSourceRect;
void main(void) { void main(void) {
vec2 src_offset = aScaleSourceRect.xy; vec2 src_offset = aScaleSourceRect.xy;
vec2 src_size = aScaleSourceRect.zw; vec2 src_size = aScaleSourceRect.zw - aScaleSourceRect.xy;
// If this is in WR_FEATURE_TEXTURE_RECT mode, the rect and size use // If this is in WR_FEATURE_TEXTURE_RECT mode, the rect and size use
// non-normalized texture coordinates. // non-normalized texture coordinates.
@ -37,7 +37,7 @@ void main(void) {
vUvRect = vec4(src_offset + vec2(0.5), vUvRect = vec4(src_offset + vec2(0.5),
src_offset + src_size - vec2(0.5)) / texture_size.xyxy; src_offset + src_size - vec2(0.5)) / texture_size.xyxy;
vec2 pos = aScaleTargetRect.xy + aScaleTargetRect.zw * aPosition.xy; vec2 pos = mix(aScaleTargetRect.xy, aScaleTargetRect.zw, aPosition.xy);
vUv = (src_offset + src_size * aPosition.xy) / texture_size; vUv = (src_offset + src_size * aPosition.xy) / texture_size;
gl_Position = uTransform * vec4(pos, 0.0, 1.0); gl_Position = uTransform * vec4(pos, 0.0, 1.0);

Просмотреть файл

@ -53,4 +53,3 @@ float signed_distance_rect(vec2 pos, vec2 p0, vec2 p1) {
vec2 clamp_rect(vec2 pt, RectWithSize rect) { vec2 clamp_rect(vec2 pt, RectWithSize rect) {
return clamp(pt, rect.p0, rect.p0 + rect.size); return clamp(pt, rect.p0, rect.p0 + rect.size);
} }

Просмотреть файл

@ -93,7 +93,7 @@ impl ApiResources {
blobs_to_rasterize.push(img.key); blobs_to_rasterize.push(img.key);
} }
ResourceUpdate::UpdateBlobImage(ref img) => { ResourceUpdate::UpdateBlobImage(ref img) => {
debug_assert_eq!(img.visible_rect.size, img.descriptor.size); debug_assert_eq!(img.visible_rect.size(), img.descriptor.size);
self.update_blob_image( self.update_blob_image(
img.key, img.key,
Some(&img.descriptor), Some(&img.descriptor),
@ -212,7 +212,7 @@ impl ApiResources {
_ => {} _ => {}
} }
let blob_size = visible_rect.size; let blob_size = visible_rect.size();
if let Some(descriptor) = descriptor { if let Some(descriptor) = descriptor {
image.descriptor = *descriptor; image.descriptor = *descriptor;
@ -274,7 +274,7 @@ impl ApiResources {
&template.visible_rect, &template.visible_rect,
template.tile_size, template.tile_size,
tile, tile,
).cast_unit(), ).to_rect().cast_unit(),
format: template.descriptor.format, format: template.descriptor.format,
}; };

Просмотреть файл

@ -1360,7 +1360,7 @@ impl BatchBuilder {
DeviceVector2D::new(0.5, 0.5) DeviceVector2D::new(0.5, 0.5)
).floor() - glyph_translation; ).floor() - glyph_translation;
let device_glyph_rect = DeviceRect::new( let device_glyph_rect = DeviceRect::from_origin_and_size(
glyph.offset + raster_glyph_offset.to_vector() + raster_text_offset, glyph.offset + raster_glyph_offset.to_vector() + raster_text_offset,
glyph.size.to_f32(), glyph.size.to_f32(),
); );
@ -1371,11 +1371,11 @@ impl BatchBuilder {
let map_device_to_surface: SpaceMapper<PicturePixel, DevicePixel> = SpaceMapper::new_with_target( let map_device_to_surface: SpaceMapper<PicturePixel, DevicePixel> = SpaceMapper::new_with_target(
root_spatial_node_index, root_spatial_node_index,
surface_spatial_node_index, surface_spatial_node_index,
device_bounding_rect, device_bounding_rect.to_rect(),
ctx.spatial_tree, ctx.spatial_tree,
); );
match map_device_to_surface.unmap(&device_bounding_rect) { match map_device_to_surface.unmap(&device_bounding_rect.to_rect()) {
Some(r) => r.intersection(&bounding_rect), Some(r) => r.intersection(&bounding_rect),
None => Some(*bounding_rect), None => Some(*bounding_rect),
} }
@ -3414,7 +3414,7 @@ impl ClipBatcher {
return false; return false;
} }
let mask_screen_rect_size = mask_screen_rect.size.to_i32(); let mask_screen_rect_size = mask_screen_rect.size().to_i32();
let clip_spatial_node = &spatial_tree let clip_spatial_node = &spatial_tree
.spatial_nodes[clip_spatial_node_index.0 as usize]; .spatial_nodes[clip_spatial_node_index.0 as usize];
@ -3448,7 +3448,7 @@ impl ClipBatcher {
// Because we only run this code path for axis-aligned rects (the root coord system check above), // Because we only run this code path for axis-aligned rects (the root coord system check above),
// and only for rectangles (not rounded etc), the world_device_rect is not conservative - we know // and only for rectangles (not rounded etc), the world_device_rect is not conservative - we know
// that there is no inner_rect, and the world_device_rect should be the real, axis-aligned clip rect. // that there is no inner_rect, and the world_device_rect should be the real, axis-aligned clip rect.
let mask_origin = mask_screen_rect.origin.to_vector(); let mask_origin = mask_screen_rect.min.to_vector();
let clip_list = self.get_batch_list(is_first_clip); let clip_list = self.get_batch_list(is_first_clip);
for y in 0 .. y_tiles { for y in 0 .. y_tiles {
@ -3461,19 +3461,16 @@ impl ClipBatcher {
(p0.x + CLIP_RECTANGLE_TILE_SIZE).min(mask_screen_rect_size.width), (p0.x + CLIP_RECTANGLE_TILE_SIZE).min(mask_screen_rect_size.width),
(p0.y + CLIP_RECTANGLE_TILE_SIZE).min(mask_screen_rect_size.height), (p0.y + CLIP_RECTANGLE_TILE_SIZE).min(mask_screen_rect_size.height),
); );
let normalized_sub_rect = DeviceIntRect::new( let normalized_sub_rect = DeviceIntRect {
p0, min: p0,
DeviceIntSize::new( max: p1,
p1.x - p0.x, }.to_f32();
p1.y - p0.y,
),
).to_f32();
let world_sub_rect = normalized_sub_rect.translate(mask_origin); let world_sub_rect = normalized_sub_rect.translate(mask_origin);
// If the clip rect completely contains this tile rect, then drawing // If the clip rect completely contains this tile rect, then drawing
// these pixels would be redundant - since this clip can't possibly // these pixels would be redundant - since this clip can't possibly
// affect the pixels in this tile, skip them! // affect the pixels in this tile, skip them!
if !world_device_rect.contains_rect(&world_sub_rect) { if !world_device_rect.to_box2d().contains_box(&world_sub_rect) {
clip_list.slow_rectangles.push(ClipMaskInstanceRect { clip_list.slow_rectangles.push(ClipMaskInstanceRect {
common: ClipMaskInstanceCommon { common: ClipMaskInstanceCommon {
sub_rect: normalized_sub_rect, sub_rect: normalized_sub_rect,
@ -3555,10 +3552,7 @@ impl ClipBatcher {
}; };
let common = ClipMaskInstanceCommon { let common = ClipMaskInstanceCommon {
sub_rect: DeviceRect::new( sub_rect: DeviceRect::from_size(actual_rect.size()),
DevicePoint::zero(),
actual_rect.size,
),
task_origin, task_origin,
screen_origin, screen_origin,
device_pixel_scale: surface_device_pixel_scale.0, device_pixel_scale: surface_device_pixel_scale.0,
@ -3598,8 +3592,8 @@ impl ClipBatcher {
// ensure nothing is drawn outside the target. If for some reason we can't map the // ensure nothing is drawn outside the target. If for some reason we can't map the
// rect back to local space, we also fall back to just using a scissor rectangle. // rect back to local space, we also fall back to just using a scissor rectangle.
let world_rect = let world_rect =
sub_rect.translate(actual_rect.origin.to_vector()) / surface_device_pixel_scale; sub_rect.translate(actual_rect.min.to_vector()) / surface_device_pixel_scale;
let (clip_transform_id, local_rect, scissor) = match map_local_to_world.unmap(&world_rect) { let (clip_transform_id, local_rect, scissor) = match map_local_to_world.unmap(&world_rect.to_rect()) {
Some(local_rect) Some(local_rect)
if clip_transform_id.transform_kind() == TransformedRectKind::AxisAligned && if clip_transform_id.transform_kind() == TransformedRectKind::AxisAligned &&
!map_local_to_world.get_transform().has_perspective_component() => { !map_local_to_world.get_transform().has_perspective_component() => {
@ -3640,16 +3634,17 @@ impl ClipBatcher {
let clip_is_axis_aligned = clip_spatial_node.coordinate_system_id == CoordinateSystemId::root(); let clip_is_axis_aligned = clip_spatial_node.coordinate_system_id == CoordinateSystemId::root();
if clip_instance.has_visible_tiles() { if clip_instance.has_visible_tiles() {
let sub_rect_bounds = actual_rect.size.into(); let sub_rect_bounds = actual_rect.size().into();
for tile in clip_store.visible_mask_tiles(&clip_instance) { for tile in clip_store.visible_mask_tiles(&clip_instance) {
let tile_sub_rect = if clip_is_axis_aligned { let tile_sub_rect = if clip_is_axis_aligned {
let tile_world_rect = map_local_to_world let tile_world_rect = map_local_to_world
.map(&tile.tile_rect) .map(&tile.tile_rect)
.expect("bug: should always map as axis-aligned"); .expect("bug: should always map as axis-aligned")
.to_box2d();
let tile_device_rect = tile_world_rect * surface_device_pixel_scale; let tile_device_rect = tile_world_rect * surface_device_pixel_scale;
tile_device_rect tile_device_rect
.translate(-actual_rect.origin.to_vector()) .translate(-actual_rect.min.to_vector())
.round_out() .round_out()
.intersection(&sub_rect_bounds) .intersection(&sub_rect_bounds)
} else { } else {
@ -3657,7 +3652,7 @@ impl ClipBatcher {
}; };
if let Some(tile_sub_rect) = tile_sub_rect { if let Some(tile_sub_rect) = tile_sub_rect {
assert!(sub_rect_bounds.contains_rect(&tile_sub_rect)); assert!(sub_rect_bounds.contains_box(&tile_sub_rect));
add_image( add_image(
request.with_tile(tile.tile_offset), request.with_tile(tile.tile_offset),
tile.tile_rect, tile.tile_rect,
@ -3675,7 +3670,7 @@ impl ClipBatcher {
if is_first_clip && if is_first_clip &&
(!clip_is_axis_aligned || (!clip_is_axis_aligned ||
!(map_local_to_world.map(&rect).expect("bug: should always map as axis-aligned") !(map_local_to_world.map(&rect).expect("bug: should always map as axis-aligned")
* surface_device_pixel_scale).contains_rect(&actual_rect)) { * surface_device_pixel_scale).contains_rect(&actual_rect.to_rect())) {
clear_to_one = true; clear_to_one = true;
} }
true true

Просмотреть файл

@ -995,10 +995,10 @@ fn add_segment(
match style0 { match style0 {
BorderStyle::Dashed => { BorderStyle::Dashed => {
let (x, y) = if is_vertical { let (x, y) = if is_vertical {
let half_dash_size = task_rect.size.height * 0.25; let half_dash_size = task_rect.height() * 0.25;
(0., half_dash_size) (0., half_dash_size)
} else { } else {
let half_dash_size = task_rect.size.width * 0.25; let half_dash_size = task_rect.width() * 0.25;
(half_dash_size, 0.) (half_dash_size, 0.)
}; };
@ -1282,7 +1282,7 @@ pub fn build_border_instances(
let v_corner_radius = (LayoutSize::from_au(cache_key.v_adjacent_corner_radius) * scale).ceil(); let v_corner_radius = (LayoutSize::from_au(cache_key.v_adjacent_corner_radius) * scale).ceil();
add_segment( add_segment(
DeviceRect::new(DevicePoint::zero(), cache_size.to_f32()), DeviceRect::from_size(cache_size.to_f32()),
style0, style0,
style1, style1,
color0, color0,

Просмотреть файл

@ -675,8 +675,8 @@ impl CompositeState {
kind: tile_kind(&surface, compositor_surface.is_opaque), kind: tile_kind(&surface, compositor_surface.is_opaque),
surface, surface,
rect: external_surface.surface_rect, rect: external_surface.surface_rect,
valid_rect: external_surface.surface_rect.translate(-external_surface.surface_rect.origin.to_vector()), valid_rect: external_surface.surface_rect.translate(-external_surface.surface_rect.min.to_vector()),
dirty_rect: external_surface.surface_rect.translate(-external_surface.surface_rect.origin.to_vector()), dirty_rect: external_surface.surface_rect.translate(-external_surface.surface_rect.min.to_vector()),
clip_rect, clip_rect,
transform: Some(external_surface.transform), transform: Some(external_surface.transform),
z_id: external_surface.z_id, z_id: external_surface.z_id,

Просмотреть файл

@ -72,7 +72,7 @@ impl SwTile {
clip_rect: &DeviceIntRect, clip_rect: &DeviceIntRect,
) -> Option<DeviceIntRect> { ) -> Option<DeviceIntRect> {
let bounds = self.local_bounds(surface); let bounds = self.local_bounds(surface);
let device_rect = transform.outer_transformed_rect(&bounds.to_f32())?.round_out().to_i32(); let device_rect = transform.outer_transformed_box2d(&bounds.to_f32())?.round_out().to_i32();
device_rect.intersection(clip_rect) device_rect.intersection(clip_rect)
} }
@ -101,7 +101,7 @@ impl SwTile {
// Offset the valid rect to the appropriate surface origin. // Offset the valid rect to the appropriate surface origin.
let valid = self.local_bounds(surface); let valid = self.local_bounds(surface);
// The destination rect is the valid rect transformed and then clipped. // The destination rect is the valid rect transformed and then clipped.
let dest_rect = transform.outer_transformed_rect(&valid.to_f32())?.round_out().to_i32(); let dest_rect = transform.outer_transformed_box2d(&valid.to_f32())?.round_out().to_i32();
if !dest_rect.intersects(clip_rect) { if !dest_rect.intersects(clip_rect) {
return None; return None;
} }
@ -110,10 +110,10 @@ impl SwTile {
// a source rect that is now relative to the surface origin rather than absolute. // a source rect that is now relative to the surface origin rather than absolute.
let inv_transform = transform.inverse()?; let inv_transform = transform.inverse()?;
let src_rect = inv_transform let src_rect = inv_transform
.outer_transformed_rect(&dest_rect.to_f32())? .outer_transformed_box2d(&dest_rect.to_f32())?
.round() .round()
.to_i32() .to_i32()
.translate(-valid.origin.to_vector()); .translate(-valid.min.to_vector());
Some((src_rect, dest_rect, transform.m22 < 0.0)) Some((src_rect, dest_rect, transform.m22 < 0.0))
} }
} }
@ -157,7 +157,7 @@ impl SwSurface {
clip_rect: &DeviceIntRect, clip_rect: &DeviceIntRect,
) -> Option<DeviceIntRect> { ) -> Option<DeviceIntRect> {
let bounds = self.local_bounds(); let bounds = self.local_bounds();
let device_rect = transform.outer_transformed_rect(&bounds.to_f32())?.round_out().to_i32(); let device_rect = transform.outer_transformed_box2d(&bounds.to_f32())?.round_out().to_i32();
device_rect.intersection(clip_rect) device_rect.intersection(clip_rect)
} }
} }
@ -212,32 +212,32 @@ impl SwCompositeJob {
let band_index = num_bands - 1 - band_index; let band_index = num_bands - 1 - band_index;
// Calculate the Y extents for the job's band, starting at the current index and spanning to // Calculate the Y extents for the job's band, starting at the current index and spanning to
// the following index. // the following index.
let band_offset = (self.clipped_dst.size.height * band_index) / num_bands; let band_offset = (self.clipped_dst.height() * band_index) / num_bands;
let band_height = (self.clipped_dst.size.height * (band_index + 1)) / num_bands - band_offset; let band_height = (self.clipped_dst.height() * (band_index + 1)) / num_bands - band_offset;
// Create a rect that is the intersection of the band with the clipped dest // Create a rect that is the intersection of the band with the clipped dest
let band_clip = DeviceIntRect::new( let band_clip = DeviceIntRect::from_origin_and_size(
DeviceIntPoint::new(self.clipped_dst.origin.x, self.clipped_dst.origin.y + band_offset), DeviceIntPoint::new(self.clipped_dst.min.x, self.clipped_dst.min.y + band_offset),
DeviceIntSize::new(self.clipped_dst.size.width, band_height), DeviceIntSize::new(self.clipped_dst.width(), band_height),
); );
match self.locked_src { match self.locked_src {
SwCompositeSource::BGRA(ref resource) => { SwCompositeSource::BGRA(ref resource) => {
self.locked_dst.composite( self.locked_dst.composite(
resource, resource,
self.src_rect.origin.x, self.src_rect.min.x,
self.src_rect.origin.y, self.src_rect.min.y,
self.src_rect.size.width, self.src_rect.width(),
self.src_rect.size.height, self.src_rect.height(),
self.dst_rect.origin.x, self.dst_rect.min.x,
self.dst_rect.origin.y, self.dst_rect.min.y,
self.dst_rect.size.width, self.dst_rect.width(),
self.dst_rect.size.height, self.dst_rect.height(),
self.opaque, self.opaque,
self.flip_y, self.flip_y,
image_rendering_to_gl_filter(self.filter), image_rendering_to_gl_filter(self.filter),
band_clip.origin.x, band_clip.min.x,
band_clip.origin.y, band_clip.min.y,
band_clip.size.width, band_clip.width(),
band_clip.size.height, band_clip.height(),
); );
} }
SwCompositeSource::YUV(ref y, ref u, ref v, color_space, color_depth) => { SwCompositeSource::YUV(ref y, ref u, ref v, color_space, color_depth) => {
@ -253,19 +253,19 @@ impl SwCompositeJob {
v, v,
swgl_color_space, swgl_color_space,
color_depth.bit_depth(), color_depth.bit_depth(),
self.src_rect.origin.x, self.src_rect.min.x,
self.src_rect.origin.y, self.src_rect.min.y,
self.src_rect.size.width, self.src_rect.width(),
self.src_rect.size.height, self.src_rect.height(),
self.dst_rect.origin.x, self.dst_rect.min.x,
self.dst_rect.origin.y, self.dst_rect.min.y,
self.dst_rect.size.width, self.dst_rect.width(),
self.dst_rect.size.height, self.dst_rect.height(),
self.flip_y, self.flip_y,
band_clip.origin.x, band_clip.min.x,
band_clip.origin.y, band_clip.min.y,
band_clip.size.width, band_clip.width(),
band_clip.size.height, band_clip.height(),
); );
} }
} }
@ -526,8 +526,8 @@ impl SwCompositeThread {
None => return, None => return,
}; };
let num_bands = if clipped_dst.size.width >= 64 && clipped_dst.size.height >= 64 { let num_bands = if clipped_dst.width() >= 64 && clipped_dst.height() >= 64 {
(clipped_dst.size.height / 64).min(4) as u8 (clipped_dst.height() / 64).min(4) as u8
} else { } else {
1 1
}; };
@ -791,13 +791,13 @@ impl SwCompositor {
} }
fn set_x_range(rect: &mut DeviceIntRect, range: &Range<i32>) { fn set_x_range(rect: &mut DeviceIntRect, range: &Range<i32>) {
rect.origin.x = range.start; rect.min.x = range.start;
rect.size.width = range.end - range.start; rect.max.x = range.end;
} }
fn set_y_range(rect: &mut DeviceIntRect, range: &Range<i32>) { fn set_y_range(rect: &mut DeviceIntRect, range: &Range<i32>) {
rect.origin.y = range.start; rect.min.y = range.start;
rect.size.height = range.end - range.start; rect.max.y = range.end;
} }
fn union(base: Range<i32>, extra: Range<i32>) -> Range<i32> { fn union(base: Range<i32>, extra: Range<i32>) -> Range<i32> {
@ -1266,8 +1266,8 @@ impl Compositor for SwCompositor {
self.gl.set_texture_buffer( self.gl.set_texture_buffer(
tile.color_id, tile.color_id,
gl::RGBA8, gl::RGBA8,
valid_rect.size.width, valid_rect.width(),
valid_rect.size.height, valid_rect.height(),
stride, stride,
buf, buf,
surface.tile_size.width, surface.tile_size.width,
@ -1285,15 +1285,15 @@ impl Compositor for SwCompositor {
self.gl.set_texture_buffer( self.gl.set_texture_buffer(
self.depth_id, self.depth_id,
gl::DEPTH_COMPONENT, gl::DEPTH_COMPONENT,
valid_rect.size.width, valid_rect.width(),
valid_rect.size.height, valid_rect.height(),
0, 0,
ptr::null_mut(), ptr::null_mut(),
self.max_tile_size.width, self.max_tile_size.width,
self.max_tile_size.height, self.max_tile_size.height,
); );
surface_info.fbo_id = tile.fbo_id; surface_info.fbo_id = tile.fbo_id;
surface_info.origin -= valid_rect.origin.to_vector(); surface_info.origin -= valid_rect.min.to_vector();
} }
} }

Просмотреть файл

@ -1244,8 +1244,12 @@ impl DrawTarget {
DrawTarget::Default { ref rect, surface_origin_is_top_left, .. } => { DrawTarget::Default { ref rect, surface_origin_is_top_left, .. } => {
// perform a Y-flip here // perform a Y-flip here
if !surface_origin_is_top_left { if !surface_origin_is_top_left {
fb_rect.origin.y = rect.origin.y + rect.size.height - fb_rect.origin.y - fb_rect.size.height; let w = fb_rect.width();
fb_rect.origin.x += rect.origin.x; let h = fb_rect.height();
fb_rect.min.x = fb_rect.min.x + rect.min.x;
fb_rect.min.y = rect.max.y - fb_rect.max.y;
fb_rect.max.x = fb_rect.min.x + w;
fb_rect.max.y = fb_rect.min.y + h;
} }
} }
DrawTarget::Texture { .. } | DrawTarget::External { .. } | DrawTarget::NativeSurface { .. } => (), DrawTarget::Texture { .. } | DrawTarget::External { .. } | DrawTarget::NativeSurface { .. } => (),
@ -1284,8 +1288,7 @@ impl DrawTarget {
} }
} }
None => { None => {
FramebufferIntRect::new( FramebufferIntRect::from_size(
FramebufferIntPoint::zero(),
device_size_as_framebuffer_size(dimensions), device_size_as_framebuffer_size(dimensions),
) )
} }
@ -2122,8 +2125,7 @@ impl Device {
(self.default_draw_fbo, rect, false) (self.default_draw_fbo, rect, false)
} }
DrawTarget::Texture { dimensions, fbo_id, with_depth, .. } => { DrawTarget::Texture { dimensions, fbo_id, with_depth, .. } => {
let rect = FramebufferIntRect::new( let rect = FramebufferIntRect::from_size(
FramebufferIntPoint::zero(),
device_size_as_framebuffer_size(dimensions), device_size_as_framebuffer_size(dimensions),
); );
(fbo_id, rect, with_depth) (fbo_id, rect, with_depth)
@ -2134,7 +2136,7 @@ impl Device {
DrawTarget::NativeSurface { external_fbo_id, offset, dimensions, .. } => { DrawTarget::NativeSurface { external_fbo_id, offset, dimensions, .. } => {
( (
FBOId(external_fbo_id), FBOId(external_fbo_id),
device_rect_as_framebuffer_rect(&DeviceIntRect::new(offset, dimensions)), device_rect_as_framebuffer_rect(&DeviceIntRect::from_origin_and_size(offset, dimensions)),
true true
) )
} }
@ -2143,10 +2145,10 @@ impl Device {
self.depth_available = depth_available; self.depth_available = depth_available;
self.bind_draw_target_impl(fbo_id); self.bind_draw_target_impl(fbo_id);
self.gl.viewport( self.gl.viewport(
rect.origin.x, rect.min.x,
rect.origin.y, rect.min.y,
rect.size.width, rect.width(),
rect.size.height, rect.height(),
); );
} }
@ -2564,9 +2566,9 @@ impl Device {
self.blit_render_target( self.blit_render_target(
ReadTarget::from_texture(src_texture), ReadTarget::from_texture(src_texture),
FramebufferIntRect::new(src_offset, size), FramebufferIntRect::from_origin_and_size(src_offset, size),
DrawTarget::from_texture(dest_texture, false), DrawTarget::from_texture(dest_texture, false),
FramebufferIntRect::new(dest_offset, size), FramebufferIntRect::from_origin_and_size(dest_offset, size),
// In most cases the filter shouldn't matter, as there is no scaling involved // In most cases the filter shouldn't matter, as there is no scaling involved
// in the blit. We were previously using Linear, but this caused issues when // in the blit. We were previously using Linear, but this caused issues when
// blitting RGBAF32 textures on Mali, so use Nearest to be safe. // blitting RGBAF32 textures on Mali, so use Nearest to be safe.
@ -2720,18 +2722,18 @@ impl Device {
TextureFilter::Linear | TextureFilter::Trilinear => gl::LINEAR, TextureFilter::Linear | TextureFilter::Trilinear => gl::LINEAR,
}; };
let src_x0 = src_rect.origin.x + self.bound_read_fbo.1.x; let src_x0 = src_rect.min.x + self.bound_read_fbo.1.x;
let src_y0 = src_rect.origin.y + self.bound_read_fbo.1.y; let src_y0 = src_rect.min.y + self.bound_read_fbo.1.y;
self.gl.blit_framebuffer( self.gl.blit_framebuffer(
src_x0, src_x0,
src_y0, src_y0,
src_x0 + src_rect.size.width, src_x0 + src_rect.width(),
src_y0 + src_rect.size.height, src_y0 + src_rect.height(),
dest_rect.origin.x, dest_rect.min.x,
dest_rect.origin.y, dest_rect.min.y,
dest_rect.origin.x + dest_rect.size.width, dest_rect.max.x,
dest_rect.origin.y + dest_rect.size.height, dest_rect.max.y,
gl::COLOR_BUFFER_BIT, gl::COLOR_BUFFER_BIT,
filter, filter,
); );
@ -2769,8 +2771,8 @@ impl Device {
debug_assert!(self.inside_frame); debug_assert!(self.inside_frame);
let mut inverted_dest_rect = dest_rect; let mut inverted_dest_rect = dest_rect;
inverted_dest_rect.origin.y = dest_rect.max_y(); inverted_dest_rect.min.y = dest_rect.max.y;
inverted_dest_rect.size.height *= -1; inverted_dest_rect.max.y = dest_rect.min.y;
self.blit_render_target( self.blit_render_target(
src_target, src_target,
@ -2976,7 +2978,7 @@ impl Device {
format: ImageFormat, format: ImageFormat,
pbo: &PBO, pbo: &PBO,
) { ) {
let byte_size = rect.size.area() as usize * format.bytes_per_pixel() as usize; let byte_size = rect.area() as usize * format.bytes_per_pixel() as usize;
assert!(byte_size <= pbo.reserved_size); assert!(byte_size <= pbo.reserved_size);
@ -2989,10 +2991,10 @@ impl Device {
unsafe { unsafe {
self.gl.read_pixels_into_pbo( self.gl.read_pixels_into_pbo(
rect.origin.x as _, rect.min.x as _,
rect.origin.y as _, rect.min.y as _,
rect.size.width as _, rect.width() as _,
rect.size.height as _, rect.height() as _,
gl_format.read, gl_format.read,
gl_format.pixel_type, gl_format.pixel_type,
); );
@ -3114,15 +3116,15 @@ impl Device {
) { ) {
let bytes_per_pixel = format.bytes_per_pixel(); let bytes_per_pixel = format.bytes_per_pixel();
let desc = self.gl_describe_format(format); let desc = self.gl_describe_format(format);
let size_in_bytes = (bytes_per_pixel * rect.size.width * rect.size.height) as usize; let size_in_bytes = (bytes_per_pixel * rect.area()) as usize;
assert_eq!(output.len(), size_in_bytes); assert_eq!(output.len(), size_in_bytes);
self.gl.flush(); self.gl.flush();
self.gl.read_pixels_into_buffer( self.gl.read_pixels_into_buffer(
rect.origin.x as _, rect.min.x as _,
rect.origin.y as _, rect.min.y as _,
rect.size.width as _, rect.width() as _,
rect.size.height as _, rect.height() as _,
desc.read, desc.read,
desc.pixel_type, desc.pixel_type,
output, output,
@ -3586,10 +3588,10 @@ impl Device {
Some(rect) => { Some(rect) => {
self.gl.enable(gl::SCISSOR_TEST); self.gl.enable(gl::SCISSOR_TEST);
self.gl.scissor( self.gl.scissor(
rect.origin.x, rect.min.x,
rect.origin.y, rect.min.y,
rect.size.width, rect.width(),
rect.size.height, rect.height(),
); );
self.gl.clear(clear_bits); self.gl.clear(clear_bits);
self.gl.disable(gl::SCISSOR_TEST); self.gl.disable(gl::SCISSOR_TEST);
@ -3626,10 +3628,10 @@ impl Device {
pub fn set_scissor_rect(&self, rect: FramebufferIntRect) { pub fn set_scissor_rect(&self, rect: FramebufferIntRect) {
self.gl.scissor( self.gl.scissor(
rect.origin.x, rect.min.x,
rect.origin.y, rect.min.y,
rect.size.width, rect.width(),
rect.size.height, rect.height(),
); );
} }
@ -4429,7 +4431,7 @@ impl<'a> TextureUploader<'a> {
// Textures dimensions may have been clamped by the hardware. Crop the // Textures dimensions may have been clamped by the hardware. Crop the
// upload region to match. // upload region to match.
let cropped = rect.intersection( let cropped = rect.intersection(
&DeviceIntRect::new(DeviceIntPoint::zero(), texture.get_dimensions()) &DeviceIntRect::from_size(texture.get_dimensions())
); );
if cfg!(debug_assertions) && cropped.map_or(true, |r| r != rect) { if cfg!(debug_assertions) && cropped.map_or(true, |r| r != rect) {
warn!("Cropping texture upload {:?} to {:?}", rect, cropped); warn!("Cropping texture upload {:?} to {:?}", rect, cropped);
@ -4440,13 +4442,13 @@ impl<'a> TextureUploader<'a> {
}; };
let bytes_pp = texture.format.bytes_per_pixel() as usize; let bytes_pp = texture.format.bytes_per_pixel() as usize;
let width_bytes = rect.size.width as usize * bytes_pp; let width_bytes = rect.width() as usize * bytes_pp;
let src_stride = stride.map_or(width_bytes, |stride| { let src_stride = stride.map_or(width_bytes, |stride| {
assert!(stride >= 0); assert!(stride >= 0);
stride as usize stride as usize
}); });
let src_size = (rect.size.height as usize - 1) * src_stride + width_bytes; let src_size = (rect.height() as usize - 1) * src_stride + width_bytes;
assert!(src_size <= len * mem::size_of::<T>()); assert!(src_size <= len * mem::size_of::<T>());
match device.upload_method { match device.upload_method {
@ -4467,10 +4469,10 @@ impl<'a> TextureUploader<'a> {
texture, texture,
}); });
width_bytes * rect.size.height as usize width_bytes * rect.height() as usize
} }
UploadMethod::PixelBuffer(_) => { UploadMethod::PixelBuffer(_) => {
let mut staging_buffer = match self.stage(device, texture.format, rect.size) { let mut staging_buffer = match self.stage(device, texture.format, rect.size()) {
Ok(staging_buffer) => staging_buffer, Ok(staging_buffer) => staging_buffer,
Err(_) => return 0, Err(_) => return 0,
}; };
@ -4486,7 +4488,7 @@ impl<'a> TextureUploader<'a> {
} else { } else {
// copy the data line-by-line in to the buffer so // copy the data line-by-line in to the buffer so
// that it has an optimal stride // that it has an optimal stride
for y in 0..rect.size.height as usize { for y in 0..rect.height() as usize {
let src_start = y * src_stride; let src_start = y * src_stride;
let src_end = src_start + width_bytes; let src_end = src_start + width_bytes;
let dst_start = y * staging_buffer.get_stride(); let dst_start = y * staging_buffer.get_stride();
@ -4556,8 +4558,8 @@ impl<'a> TextureUploader<'a> {
); );
} }
let pos = chunk.rect.origin; let pos = chunk.rect.min;
let size = chunk.rect.size; let size = chunk.rect.size();
match chunk.texture.target { match chunk.texture.target {
gl::TEXTURE_2D | gl::TEXTURE_RECTANGLE | gl::TEXTURE_EXTERNAL_OES => { gl::TEXTURE_2D | gl::TEXTURE_RECTANGLE | gl::TEXTURE_EXTERNAL_OES => {

Просмотреть файл

@ -557,8 +557,8 @@ impl FrameBuilder {
// TODO(dp): Remove me completely!! // TODO(dp): Remove me completely!!
let global_device_pixel_scale = DevicePixelScale::new(1.0); let global_device_pixel_scale = DevicePixelScale::new(1.0);
let output_size = scene.output_rect.size; let output_size = scene.output_rect.size();
let screen_world_rect = (scene.output_rect.to_f32() / global_device_pixel_scale).round_out(); let screen_world_rect = (scene.output_rect.to_f32() / global_device_pixel_scale).round_out().to_rect();
let mut composite_state = CompositeState::new( let mut composite_state = CompositeState::new(
scene.config.compositor_kind, scene.config.compositor_kind,
@ -689,9 +689,9 @@ impl FrameBuilder {
scene.clip_store.end_frame(&mut scratch.clip_store); scene.clip_store.end_frame(&mut scratch.clip_store);
Frame { Frame {
device_rect: DeviceIntRect::new( device_rect: DeviceIntRect::from_origin_and_size(
device_origin, device_origin,
scene.output_rect.size, scene.output_rect.size(),
), ),
passes, passes,
transform_palette: transform_palette.finish(), transform_palette: transform_palette.finish(),
@ -732,7 +732,7 @@ impl FrameBuilder {
let world_clip_rect = map_local_to_world let world_clip_rect = map_local_to_world
.map(&tile_cache.local_clip_rect) .map(&tile_cache.local_clip_rect)
.expect("bug: unable to map clip rect"); .expect("bug: unable to map clip rect");
let device_clip_rect = (world_clip_rect * ctx.global_device_pixel_scale).round(); let device_clip_rect = (world_clip_rect * ctx.global_device_pixel_scale).round().to_box2d();
composite_state.push_surface( composite_state.push_surface(
tile_cache, tile_cache,

Просмотреть файл

@ -52,8 +52,7 @@ pub fn resolve_image(
let cache_item = CacheItem { let cache_item = CacheItem {
texture_id: TextureSource::External(deferred_resolve_index, image_buffer_kind), texture_id: TextureSource::External(deferred_resolve_index, image_buffer_kind),
uv_rect_handle: cache_handle, uv_rect_handle: cache_handle,
uv_rect: DeviceIntRect::new( uv_rect: DeviceIntRect::from_size(
DeviceIntPoint::zero(),
image_properties.descriptor.size, image_properties.descriptor.size,
), ),
user_data: [0.0; 4], user_data: [0.0; 4],

Просмотреть файл

@ -305,8 +305,8 @@ pub fn tiles(
// Size of regular tiles in layout space. // Size of regular tiles in layout space.
let layout_tile_size = LayoutSize::new( let layout_tile_size = LayoutSize::new(
device_tile_size as f32 / image_rect.size.width as f32 * prim_rect.size.width, device_tile_size as f32 / image_rect.width() as f32 * prim_rect.width(),
device_tile_size as f32 / image_rect.size.height as f32 * prim_rect.size.height, device_tile_size as f32 / image_rect.height() as f32 * prim_rect.height(),
); );
// The decomposition logic is exactly the same on each axis so we reduce // The decomposition logic is exactly the same on each axis so we reduce
@ -503,16 +503,16 @@ pub fn compute_tile_rect(
tile: TileOffset, tile: TileOffset,
) -> DeviceIntRect { ) -> DeviceIntRect {
let regular_tile_size = regular_tile_size as i32; let regular_tile_size = regular_tile_size as i32;
DeviceIntRect { DeviceIntRect::from_origin_and_size(
origin: point2( point2(
compute_tile_origin_1d(image_rect.x_range(), regular_tile_size, tile.x as i32), compute_tile_origin_1d(image_rect.x_range(), regular_tile_size, tile.x as i32),
compute_tile_origin_1d(image_rect.y_range(), regular_tile_size, tile.y as i32), compute_tile_origin_1d(image_rect.y_range(), regular_tile_size, tile.y as i32),
), ),
size: size2( size2(
compute_tile_size_1d(image_rect.x_range(), regular_tile_size, tile.x as i32), compute_tile_size_1d(image_rect.x_range(), regular_tile_size, tile.x as i32),
compute_tile_size_1d(image_rect.y_range(), regular_tile_size, tile.y as i32), compute_tile_size_1d(image_rect.y_range(), regular_tile_size, tile.y as i32),
), ),
} )
} }
fn compute_tile_origin_1d( fn compute_tile_origin_1d(
@ -600,10 +600,10 @@ pub fn compute_valid_tiles_if_bounds_change(
} }
}; };
let left = prev_rect.min_x() != new_rect.min_x(); let left = prev_rect.min.x != new_rect.min.x;
let right = prev_rect.max_x() != new_rect.max_x(); let right = prev_rect.max.x != new_rect.max.x;
let top = prev_rect.min_y() != new_rect.min_y(); let top = prev_rect.min.y != new_rect.min.y;
let bottom = prev_rect.max_y() != new_rect.max_y(); let bottom = prev_rect.max.y != new_rect.max.y;
if !left && !right && !top && !bottom { if !left && !right && !top && !bottom {
// Bounds have not changed. // Bounds have not changed.
@ -617,10 +617,10 @@ pub fn compute_valid_tiles_if_bounds_change(
.cast::<f32>() .cast::<f32>()
.scale(tw, th); .scale(tw, th);
let min_x = if left { f32::ceil(tiles.min_x()) } else { f32::floor(tiles.min_x()) }; let min_x = if left { f32::ceil(tiles.min.x) } else { f32::floor(tiles.min.x) };
let min_y = if top { f32::ceil(tiles.min_y()) } else { f32::floor(tiles.min_y()) }; let min_y = if top { f32::ceil(tiles.min.y) } else { f32::floor(tiles.min.y) };
let max_x = if right { f32::floor(tiles.max_x()) } else { f32::ceil(tiles.max_x()) }; let max_x = if right { f32::floor(tiles.max.x) } else { f32::ceil(tiles.max.x) };
let max_y = if bottom { f32::floor(tiles.max_y()) } else { f32::ceil(tiles.max_y()) }; let max_y = if bottom { f32::floor(tiles.max.y) } else { f32::ceil(tiles.max.y) };
Some(TileRange { Some(TileRange {
origin: point2(min_x as i32, min_y as i32), origin: point2(min_x as i32, min_y as i32),
@ -666,7 +666,7 @@ mod tests {
let mut count = 0; let mut count = 0;
checked_for_each_tile(&rect(0., 0., 1000., 1000.), checked_for_each_tile(&rect(0., 0., 1000., 1000.),
&rect(75., 75., 400., 400.), &rect(75., 75., 400., 400.),
&rect(0, 0, 400, 400), &rect(0, 0, 400, 400).to_box2d(),
36, 36,
&mut |_tile_rect, _tile_offset, _tile_flags| { &mut |_tile_rect, _tile_offset, _tile_flags| {
count += 1; count += 1;
@ -680,7 +680,7 @@ mod tests {
let mut count = 0; let mut count = 0;
checked_for_each_tile(&rect(0., 0., 74., 74.), checked_for_each_tile(&rect(0., 0., 74., 74.),
&rect(75., 75., 400., 400.), &rect(75., 75., 400., 400.),
&rect(0, 0, 400, 400), &rect(0, 0, 400, 400).to_box2d(),
36, 36,
&mut |_tile_rect, _tile_offset, _tile_flags| { &mut |_tile_rect, _tile_offset, _tile_flags| {
count += 1; count += 1;
@ -795,22 +795,22 @@ mod tests {
#[test] #[test]
fn smaller_than_tile_size_at_origin() { fn smaller_than_tile_size_at_origin() {
let r = compute_tile_rect( let r = compute_tile_rect(
&rect(0, 0, 80, 80), &rect(0, 0, 80, 80).to_box2d(),
256, 256,
point2(0, 0), point2(0, 0),
); );
assert_eq!(r, rect(0, 0, 80, 80)); assert_eq!(r, rect(0, 0, 80, 80).to_box2d());
} }
#[test] #[test]
fn smaller_than_tile_size_with_offset() { fn smaller_than_tile_size_with_offset() {
let r = compute_tile_rect( let r = compute_tile_rect(
&rect(20, 20, 80, 80), &rect(20, 20, 80, 80).to_box2d(),
256, 256,
point2(0, 0), point2(0, 0),
); );
assert_eq!(r, rect(20, 20, 80, 80)); assert_eq!(r, rect(20, 20, 80, 80).to_box2d());
} }
} }

Просмотреть файл

@ -405,7 +405,7 @@ impl TextureUpdateList {
height: i32, height: i32,
) { ) {
let size = DeviceIntSize::new(width, height); let size = DeviceIntSize::new(width, height);
let rect = DeviceIntRect::new(origin, size); let rect = DeviceIntRect::from_origin_and_size(origin, size);
self.push_update(id, TextureCacheUpdate { self.push_update(id, TextureCacheUpdate {
rect, rect,
stride: None, stride: None,

Просмотреть файл

@ -1237,8 +1237,9 @@ impl Tile {
// is just to deal with float accuracy. However, the valid rect is not // is just to deal with float accuracy. However, the valid rect is not
// always aligned to a device pixel. To handle this, round out to get all // always aligned to a device pixel. To handle this, round out to get all
// required pixels, and intersect with the tile device rect. // required pixels, and intersect with the tile device rect.
let device_rect = (self.world_tile_rect * ctx.global_device_pixel_scale).round(); let device_rect = (self.world_tile_rect * ctx.global_device_pixel_scale).round().to_box2d();
self.device_valid_rect = (self.world_valid_rect * ctx.global_device_pixel_scale) self.device_valid_rect = (self.world_valid_rect * ctx.global_device_pixel_scale)
.to_box2d()
.round_out() .round_out()
.intersection(&device_rect) .intersection(&device_rect)
.unwrap_or_else(DeviceRect::zero); .unwrap_or_else(DeviceRect::zero);
@ -3132,7 +3133,7 @@ impl TileCacheInstance {
let world_rect = pic_to_world_mapper let world_rect = pic_to_world_mapper
.map(&prim_rect) .map(&prim_rect)
.expect("bug: unable to map the primitive to world space"); .expect("bug: unable to map the primitive to world space");
let device_rect = (world_rect * frame_context.global_device_pixel_scale).round(); let device_rect = (world_rect * frame_context.global_device_pixel_scale).round().to_box2d();
// TODO(gw): Is there any case where if the primitive ends up on a fractional // TODO(gw): Is there any case where if the primitive ends up on a fractional
// boundary we want to _skip_ promoting to a compositor surface and // boundary we want to _skip_ promoting to a compositor surface and
@ -3155,14 +3156,14 @@ impl TileCacheInstance {
let world_to_device_scale = Transform3D::from_scale(frame_context.global_device_pixel_scale); let world_to_device_scale = Transform3D::from_scale(frame_context.global_device_pixel_scale);
let transform = surface_to_world_mapper.get_transform().pre_translate(prim_origin).then(&world_to_device_scale); let transform = surface_to_world_mapper.get_transform().pre_translate(prim_origin).then(&world_to_device_scale);
(local_prim_rect.cast_unit(), transform) (local_prim_rect.to_box2d().cast_unit(), transform)
} }
}; };
let clip_rect = (world_clip_rect * frame_context.global_device_pixel_scale).round(); let clip_rect = (world_clip_rect * frame_context.global_device_pixel_scale).round().to_box2d();
if surface_rect.size.width >= MAX_COMPOSITOR_SURFACES_SIZE || if surface_rect.width() >= MAX_COMPOSITOR_SURFACES_SIZE ||
surface_rect.size.height >= MAX_COMPOSITOR_SURFACES_SIZE { surface_rect.height() >= MAX_COMPOSITOR_SURFACES_SIZE {
return false; return false;
} }
@ -3186,7 +3187,7 @@ impl TileCacheInstance {
(None, None) (None, None)
} }
CompositorKind::Native { .. } => { CompositorKind::Native { .. } => {
let native_surface_size = surface_rect.size.round().to_i32(); let native_surface_size = surface_rect.size().round().to_i32();
let key = ExternalNativeSurfaceKey { let key = ExternalNativeSurfaceKey {
image_keys: *api_keys, image_keys: *api_keys,
@ -4869,7 +4870,7 @@ impl PicturePrimitive {
.map(&tile_cache.local_clip_rect) .map(&tile_cache.local_clip_rect)
.expect("bug: unable to map clip rect") .expect("bug: unable to map clip rect")
.round(); .round();
let device_clip_rect = (world_clip_rect * frame_context.global_device_pixel_scale).round(); let device_clip_rect = (world_clip_rect * frame_context.global_device_pixel_scale).round().to_box2d();
for (sub_slice_index, sub_slice) in tile_cache.sub_slices.iter_mut().enumerate() { for (sub_slice_index, sub_slice) in tile_cache.sub_slices.iter_mut().enumerate() {
for tile in sub_slice.tiles.values_mut() { for tile in sub_slice.tiles.values_mut() {
@ -4957,7 +4958,7 @@ impl PicturePrimitive {
30.0 + sub_slice_index as f32 * 20.0, 30.0 + sub_slice_index as f32 * 20.0,
); );
let tile_device_rect = tile.world_tile_rect * frame_context.global_device_pixel_scale; let tile_device_rect = tile.world_tile_rect * frame_context.global_device_pixel_scale;
if tile_device_rect.size.height >= label_offset.y { if tile_device_rect.height() >= label_offset.y {
let surface = tile.surface.as_ref().expect("no tile surface set!"); let surface = tile.surface.as_ref().expect("no tile surface set!");
scratch.push_debug_string( scratch.push_debug_string(
@ -5011,8 +5012,9 @@ impl PicturePrimitive {
// Update the world/device dirty rect // Update the world/device dirty rect
let world_dirty_rect = map_pic_to_world.map(&tile.local_dirty_rect).expect("bug"); let world_dirty_rect = map_pic_to_world.map(&tile.local_dirty_rect).expect("bug");
let device_rect = (tile.world_tile_rect * frame_context.global_device_pixel_scale).round(); let device_rect = (tile.world_tile_rect * frame_context.global_device_pixel_scale).round().to_box2d();
tile.device_dirty_rect = (world_dirty_rect * frame_context.global_device_pixel_scale) tile.device_dirty_rect = (world_dirty_rect * frame_context.global_device_pixel_scale)
.to_box2d()
.round_out() .round_out()
.intersection(&device_rect) .intersection(&device_rect)
.unwrap_or_else(DeviceRect::zero); .unwrap_or_else(DeviceRect::zero);
@ -5105,12 +5107,12 @@ impl PicturePrimitive {
); );
let scissor_rect = tile.device_dirty_rect let scissor_rect = tile.device_dirty_rect
.translate(-device_rect.origin.to_vector()) .translate(-device_rect.min.to_vector())
.round() .round()
.to_i32(); .to_i32();
let valid_rect = tile.device_valid_rect let valid_rect = tile.device_valid_rect
.translate(-device_rect.origin.to_vector()) .translate(-device_rect.min.to_vector())
.round() .round()
.to_i32(); .to_i32();
@ -5158,7 +5160,7 @@ impl PicturePrimitive {
// If the entire tile valid region is dirty, we can update the fract offset // If the entire tile valid region is dirty, we can update the fract offset
// at which the tile was rendered. // at which the tile was rendered.
if tile.device_dirty_rect.contains_rect(&tile.device_valid_rect) { if tile.device_dirty_rect.contains_box(&tile.device_valid_rect) {
tile.device_fract_offset = tile_cache.device_fract_offset; tile.device_fract_offset = tile_cache.device_fract_offset;
} }
} }
@ -5197,8 +5199,8 @@ impl PicturePrimitive {
kind: tile_kind(&surface, is_opaque), kind: tile_kind(&surface, is_opaque),
surface, surface,
rect: device_rect, rect: device_rect,
valid_rect: tile.device_valid_rect.translate(-device_rect.origin.to_vector()), valid_rect: tile.device_valid_rect.translate(-device_rect.min.to_vector()),
dirty_rect: tile.device_dirty_rect.translate(-device_rect.origin.to_vector()), dirty_rect: tile.device_dirty_rect.translate(-device_rect.min.to_vector()),
clip_rect: device_clip_rect, clip_rect: device_clip_rect,
transform: None, transform: None,
z_id: tile.z_id, z_id: tile.z_id,
@ -5325,11 +5327,11 @@ impl PicturePrimitive {
} else { } else {
max_target_size as f32 max_target_size as f32
}; };
if device_rect.size.width > limit || device_rect.size.height > limit { if device_rect.width() > limit || device_rect.height() > limit {
// round_out will grow by 1 integer pixel if origin is on a // round_out will grow by 1 integer pixel if origin is on a
// fractional position, so keep that margin for error with -1: // fractional position, so keep that margin for error with -1:
let scale = (limit as f32 - 1.0) / let scale = (limit as f32 - 1.0) /
(f32::max(device_rect.size.width, device_rect.size.height)); (f32::max(device_rect.width(), device_rect.height()));
*device_pixel_scale = *device_pixel_scale * Scale::new(scale); *device_pixel_scale = *device_pixel_scale * Scale::new(scale);
let new_device_rect = device_rect.to_f32() * Scale::new(scale); let new_device_rect = device_rect.to_f32() * Scale::new(scale);
*device_rect = new_device_rect.round_out(); *device_rect = new_device_rect.round_out();
@ -5386,15 +5388,16 @@ impl PicturePrimitive {
clipped clipped
}; };
let mut original_size = device_rect.size; let mut original_size = device_rect.size();
// Adjust the size to avoid introducing sampling errors during the down-scaling passes. // Adjust the size to avoid introducing sampling errors during the down-scaling passes.
// what would be even better is to rasterize the picture at the down-scaled size // what would be even better is to rasterize the picture at the down-scaled size
// directly. // directly.
device_rect.size = BlurTask::adjusted_blur_source_size( let adjusted_size = BlurTask::adjusted_blur_source_size(
device_rect.size, device_rect.size(),
blur_std_deviation, blur_std_deviation,
); );
device_rect.set_size(adjusted_size);
if let Some(scale) = adjust_scale_for_max_surface_size( if let Some(scale) = adjust_scale_for_max_surface_size(
raster_config, frame_context.fb_config.max_target_size, raster_config, frame_context.fb_config.max_target_size,
@ -5414,16 +5417,16 @@ impl PicturePrimitive {
device_pixel_scale, device_pixel_scale,
); );
let task_size = device_rect.size.to_i32(); let task_size = device_rect.size().to_i32();
let picture_task_id = frame_state.rg_builder.add().init( let picture_task_id = frame_state.rg_builder.add().init(
RenderTask::new_dynamic( RenderTask::new_dynamic(
task_size, task_size,
RenderTaskKind::new_picture( RenderTaskKind::new_picture(
task_size, task_size,
unclipped.size, unclipped.size(),
pic_index, pic_index,
device_rect.origin, device_rect.min,
surface_spatial_node_index, surface_spatial_node_index,
device_pixel_scale, device_pixel_scale,
None, None,
@ -5467,13 +5470,14 @@ impl PicturePrimitive {
.intersection(&unclipped) .intersection(&unclipped)
.unwrap(); .unwrap();
device_rect.size = BlurTask::adjusted_blur_source_size( let adjusted_size = BlurTask::adjusted_blur_source_size(
device_rect.size, device_rect.size(),
DeviceSize::new( DeviceSize::new(
max_std_deviation * scale_factors.0, max_std_deviation * scale_factors.0,
max_std_deviation * scale_factors.1 max_std_deviation * scale_factors.1
), ),
); );
device_rect.set_size(adjusted_size);
if let Some(scale) = adjust_scale_for_max_surface_size( if let Some(scale) = adjust_scale_for_max_surface_size(
raster_config, frame_context.fb_config.max_target_size, raster_config, frame_context.fb_config.max_target_size,
@ -5492,16 +5496,16 @@ impl PicturePrimitive {
device_pixel_scale, device_pixel_scale,
); );
let task_size = device_rect.size.to_i32(); let task_size = device_rect.size().to_i32();
let picture_task_id = frame_state.rg_builder.add().init( let picture_task_id = frame_state.rg_builder.add().init(
RenderTask::new_dynamic( RenderTask::new_dynamic(
task_size, task_size,
RenderTaskKind::new_picture( RenderTaskKind::new_picture(
task_size, task_size,
unclipped.size, unclipped.size(),
pic_index, pic_index,
device_rect.origin, device_rect.min,
surface_spatial_node_index, surface_spatial_node_index,
device_pixel_scale, device_pixel_scale,
None, None,
@ -5534,7 +5538,7 @@ impl PicturePrimitive {
frame_state.rg_builder, frame_state.rg_builder,
RenderTargetKind::Color, RenderTargetKind::Color,
Some(&mut blur_tasks), Some(&mut blur_tasks),
device_rect.size.to_i32(), device_rect.size().to_i32(),
); );
} }
@ -5621,8 +5625,8 @@ impl PicturePrimitive {
frame_state.rg_builder.add().init( frame_state.rg_builder.add().init(
RenderTask::new_dynamic( RenderTask::new_dynamic(
available_rect.size.to_i32(), available_rect.size().to_i32(),
RenderTaskKind::new_readback(Some(available_rect.origin)), RenderTaskKind::new_readback(Some(available_rect.min)),
).with_uv_rect_kind(backdrop_uv) ).with_uv_rect_kind(backdrop_uv)
) )
} }
@ -5643,16 +5647,16 @@ impl PicturePrimitive {
self.secondary_render_task_id = Some(readback_task_id); self.secondary_render_task_id = Some(readback_task_id);
let task_size = clipped.size.to_i32(); let task_size = clipped.size().to_i32();
let render_task_id = frame_state.rg_builder.add().init( let render_task_id = frame_state.rg_builder.add().init(
RenderTask::new_dynamic( RenderTask::new_dynamic(
task_size, task_size,
RenderTaskKind::new_picture( RenderTaskKind::new_picture(
task_size, task_size,
unclipped.size, unclipped.size(),
pic_index, pic_index,
clipped.origin, clipped.min,
surface_spatial_node_index, surface_spatial_node_index,
device_pixel_scale, device_pixel_scale,
None, None,
@ -5689,16 +5693,16 @@ impl PicturePrimitive {
device_pixel_scale, device_pixel_scale,
); );
let task_size = clipped.size.to_i32(); let task_size = clipped.size().to_i32();
let render_task_id = frame_state.rg_builder.add().init( let render_task_id = frame_state.rg_builder.add().init(
RenderTask::new_dynamic( RenderTask::new_dynamic(
task_size, task_size,
RenderTaskKind::new_picture( RenderTaskKind::new_picture(
task_size, task_size,
unclipped.size, unclipped.size(),
pic_index, pic_index,
clipped.origin, clipped.min,
surface_spatial_node_index, surface_spatial_node_index,
device_pixel_scale, device_pixel_scale,
None, None,
@ -5734,16 +5738,16 @@ impl PicturePrimitive {
device_pixel_scale, device_pixel_scale,
); );
let task_size = clipped.size.to_i32(); let task_size = clipped.size().to_i32();
let render_task_id = frame_state.rg_builder.add().init( let render_task_id = frame_state.rg_builder.add().init(
RenderTask::new_dynamic( RenderTask::new_dynamic(
task_size, task_size,
RenderTaskKind::new_picture( RenderTaskKind::new_picture(
task_size, task_size,
unclipped.size, unclipped.size(),
pic_index, pic_index,
clipped.origin, clipped.min,
surface_spatial_node_index, surface_spatial_node_index,
device_pixel_scale, device_pixel_scale,
None, None,
@ -5780,16 +5784,16 @@ impl PicturePrimitive {
device_pixel_scale, device_pixel_scale,
); );
let task_size = clipped.size.to_i32(); let task_size = clipped.size().to_i32();
let render_task_id = frame_state.rg_builder.add().init( let render_task_id = frame_state.rg_builder.add().init(
RenderTask::new_dynamic( RenderTask::new_dynamic(
task_size, task_size,
RenderTaskKind::new_picture( RenderTaskKind::new_picture(
task_size, task_size,
unclipped.size, unclipped.size(),
pic_index, pic_index,
clipped.origin, clipped.min,
surface_spatial_node_index, surface_spatial_node_index,
device_pixel_scale, device_pixel_scale,
None, None,
@ -5826,16 +5830,16 @@ impl PicturePrimitive {
device_pixel_scale, device_pixel_scale,
); );
let task_size = clipped.size.to_i32(); let task_size = clipped.size().to_i32();
let picture_task_id = frame_state.rg_builder.add().init( let picture_task_id = frame_state.rg_builder.add().init(
RenderTask::new_dynamic( RenderTask::new_dynamic(
task_size, task_size,
RenderTaskKind::new_picture( RenderTaskKind::new_picture(
task_size, task_size,
unclipped.size, unclipped.size(),
pic_index, pic_index,
clipped.origin, clipped.min,
surface_spatial_node_index, surface_spatial_node_index,
device_pixel_scale, device_pixel_scale,
None, None,
@ -5849,7 +5853,7 @@ impl PicturePrimitive {
primitives, primitives,
filter_datas, filter_datas,
frame_state.rg_builder, frame_state.rg_builder,
clipped.size.to_i32(), clipped.size().to_i32(),
uv_rect_kind, uv_rect_kind,
picture_task_id, picture_task_id,
device_pixel_scale, device_pixel_scale,
@ -6569,8 +6573,8 @@ fn calculate_screen_uv(
let raster_pos = transform.transform_point2d_homogeneous(*local_pos); let raster_pos = transform.transform_point2d_homogeneous(*local_pos);
DeviceHomogeneousVector::new( DeviceHomogeneousVector::new(
(raster_pos.x * device_pixel_scale.0 - rendered_rect.origin.x * raster_pos.w) / rendered_rect.size.width, (raster_pos.x * device_pixel_scale.0 - rendered_rect.min.x * raster_pos.w) / rendered_rect.width(),
(raster_pos.y * device_pixel_scale.0 - rendered_rect.origin.y * raster_pos.w) / rendered_rect.size.height, (raster_pos.y * device_pixel_scale.0 - rendered_rect.min.y * raster_pos.w) / rendered_rect.height(),
0.0, 0.0,
raster_pos.w, raster_pos.w,
) )
@ -6585,7 +6589,7 @@ fn calculate_uv_rect_kind(
device_pixel_scale: DevicePixelScale, device_pixel_scale: DevicePixelScale,
) -> UvRectKind { ) -> UvRectKind {
let top_left = calculate_screen_uv( let top_left = calculate_screen_uv(
&pic_rect.origin, &pic_rect.top_left(),
transform, transform,
&rendered_rect, &rendered_rect,
device_pixel_scale, device_pixel_scale,
@ -6983,7 +6987,7 @@ impl TileNode {
let world_rect = pic_to_world_mapper let world_rect = pic_to_world_mapper
.map(&local_rect) .map(&local_rect)
.unwrap(); .unwrap();
let device_rect = world_rect * global_device_pixel_scale; let device_rect = (world_rect * global_device_pixel_scale).to_box2d();
let outer_color = color.scale_alpha(0.3); let outer_color = color.scale_alpha(0.3);
let inner_color = outer_color.scale_alpha(0.5); let inner_color = outer_color.scale_alpha(0.5);

Просмотреть файл

@ -1546,7 +1546,7 @@ fn get_unclipped_device_rect(
) -> Option<DeviceRect> { ) -> Option<DeviceRect> {
let raster_rect = map_to_raster.map(&prim_rect)?; let raster_rect = map_to_raster.map(&prim_rect)?;
let world_rect = raster_rect * Scale::new(1.0); let world_rect = raster_rect * Scale::new(1.0);
Some(world_rect * device_pixel_scale) Some((world_rect * device_pixel_scale).to_box2d())
} }
/// Given an unclipped device rect, try to find a minimal device space /// Given an unclipped device rect, try to find a minimal device space
@ -1561,7 +1561,7 @@ fn get_clipped_device_rect(
device_pixel_scale: DevicePixelScale, device_pixel_scale: DevicePixelScale,
) -> Option<DeviceRect> { ) -> Option<DeviceRect> {
let unclipped_raster_rect = { let unclipped_raster_rect = {
let world_rect = *unclipped * Scale::new(1.0); let world_rect = unclipped.to_rect() * Scale::new(1.0);
let raster_rect = world_rect * device_pixel_scale.inverse(); let raster_rect = world_rect * device_pixel_scale.inverse();
raster_rect.cast_unit() raster_rect.cast_unit()

Просмотреть файл

@ -318,7 +318,7 @@ impl Transaction {
&mut self, &mut self,
device_rect: DeviceIntRect, device_rect: DeviceIntRect,
) { ) {
window_size_sanity_check(device_rect.size); window_size_sanity_check(device_rect.size());
self.scene_ops.push( self.scene_ops.push(
SceneMsg::SetDocumentView { SceneMsg::SetDocumentView {
device_rect, device_rect,

Просмотреть файл

@ -486,7 +486,7 @@ impl Document {
} }
fn has_pixels(&self) -> bool { fn has_pixels(&self) -> bool {
!self.view.scene.device_rect.size.is_empty() !self.view.scene.device_rect.is_empty()
} }
fn process_frame_msg( fn process_frame_msg(
@ -576,7 +576,7 @@ impl Document {
gpu_cache, gpu_cache,
&mut self.rg_builder, &mut self.rg_builder,
self.stamp, self.stamp,
self.view.scene.device_rect.origin, self.view.scene.device_rect.min,
&self.dynamic_properties, &self.dynamic_properties,
&mut self.data_stores, &mut self.data_stores,
&mut self.scratch, &mut self.scratch,

Просмотреть файл

@ -543,8 +543,8 @@ impl RenderTarget for AlphaRenderTarget {
&ctx.screen_world_rect, &ctx.screen_world_rect,
task_info.device_pixel_scale, task_info.device_pixel_scale,
ctx.global_device_pixel_scale, ctx.global_device_pixel_scale,
target_rect.origin.to_f32(), target_rect.min.to_f32(),
task_info.actual_rect.origin, task_info.actual_rect.min,
); );
if task_info.clear_to_one || clear_to_one { if task_info.clear_to_one || clear_to_one {
self.one_clears.push(task_id); self.one_clears.push(task_id);
@ -554,15 +554,14 @@ impl RenderTarget for AlphaRenderTarget {
if region_task.clear_to_one { if region_task.clear_to_one {
self.one_clears.push(task_id); self.one_clears.push(task_id);
} }
let device_rect = DeviceRect::new( let device_rect = DeviceRect::from_size(
DevicePoint::zero(), target_rect.size().to_f32(),
target_rect.size.to_f32(),
); );
self.clip_batcher.add_clip_region( self.clip_batcher.add_clip_region(
region_task.local_pos, region_task.local_pos,
device_rect, device_rect,
region_task.clip_data.clone(), region_task.clip_data.clone(),
target_rect.origin.to_f32(), target_rect.min.to_f32(),
DevicePoint::zero(), DevicePoint::zero(),
region_task.device_pixel_scale.0, region_task.device_pixel_scale.0,
); );
@ -675,7 +674,7 @@ impl TextureCacheRenderTarget {
RenderTaskKind::Border(ref task_info) => { RenderTaskKind::Border(ref task_info) => {
self.clears.push(target_rect); self.clears.push(target_rect);
let task_origin = target_rect.origin.to_f32(); let task_origin = target_rect.min.to_f32();
// TODO(gw): Clone here instead of a move of this vec, since the frame // TODO(gw): Clone here instead of a move of this vec, since the frame
// graph is immutable by this point. It's rare that borders // graph is immutable by this point. It's rare that borders
// are drawn since they are persisted in the texture cache, // are drawn since they are persisted in the texture cache,
@ -750,7 +749,7 @@ fn add_scaling_instances(
) { ) {
let target_rect = target_task let target_rect = target_task
.get_target_rect() .get_target_rect()
.inner_rect(task.padding) .inner_box(task.padding)
.to_f32(); .to_f32();
let source = source_task.unwrap().get_texture_source(); let source = source_task.unwrap().get_texture_source();

Просмотреть файл

@ -128,8 +128,8 @@ impl RenderTaskLocation {
pub fn size(&self) -> DeviceIntSize { pub fn size(&self) -> DeviceIntSize {
match self { match self {
RenderTaskLocation::Unallocated { size } => *size, RenderTaskLocation::Unallocated { size } => *size,
RenderTaskLocation::Dynamic { rect, .. } => rect.size, RenderTaskLocation::Dynamic { rect, .. } => rect.size(),
RenderTaskLocation::Static { rect, .. } => rect.size, RenderTaskLocation::Static { rect, .. } => rect.size(),
RenderTaskLocation::CacheRequest { size } => *size, RenderTaskLocation::CacheRequest { size } => *size,
} }
} }
@ -473,7 +473,7 @@ impl RenderTaskKind {
// TODO(gw): If this ever shows up in a profile, we could pre-calculate // TODO(gw): If this ever shows up in a profile, we could pre-calculate
// whether a ClipSources contains any box-shadows and skip // whether a ClipSources contains any box-shadows and skip
// this iteration for the majority of cases. // this iteration for the majority of cases.
let task_size = outer_rect.size.to_i32(); let task_size = outer_rect.size().to_i32();
// If we have a potentially tiled clip mask, clear the mask area first. Otherwise, // If we have a potentially tiled clip mask, clear the mask area first. Otherwise,
// the first (primary) clip mask will overwrite all the clip mask pixels with // the first (primary) clip mask will overwrite all the clip mask pixels with
@ -584,8 +584,8 @@ impl RenderTaskKind {
RenderTaskKind::CacheMask(ref task) => { RenderTaskKind::CacheMask(ref task) => {
[ [
task.device_pixel_scale.0, task.device_pixel_scale.0,
task.actual_rect.origin.x, task.actual_rect.min.x,
task.actual_rect.origin.y, task.actual_rect.min.y,
0.0, 0.0,
] ]
} }
@ -637,10 +637,10 @@ impl RenderTaskKind {
RenderTaskData { RenderTaskData {
data: [ data: [
target_rect.origin.x as f32, target_rect.min.x as f32,
target_rect.origin.y as f32, target_rect.min.y as f32,
target_rect.size.width as f32, target_rect.width() as f32,
target_rect.size.height as f32, target_rect.height() as f32,
data[0], data[0],
data[1], data[1],
data[2], data[2],
@ -1409,8 +1409,8 @@ impl RenderTask {
} }
if let Some(mut request) = gpu_cache.request(&mut self.uv_rect_handle) { if let Some(mut request) = gpu_cache.request(&mut self.uv_rect_handle) {
let p0 = target_rect.min().to_f32(); let p0 = target_rect.min.to_f32();
let p1 = target_rect.max().to_f32(); let p1 = target_rect.max.to_f32();
let image_source = ImageSource { let image_source = ImageSource {
p0, p0,
p1, p1,

Просмотреть файл

@ -444,7 +444,7 @@ impl RenderTaskGraphBuilder {
let surface = self.active_surfaces.get_mut(&texture_id).unwrap(); let surface = self.active_surfaces.get_mut(&texture_id).unwrap();
if let Some(p) = surface.alloc_rect(size, kind, true) { if let Some(p) = surface.alloc_rect(size, kind, true) {
location = Some((texture_id, p)); location = Some((texture_id, p));
*used_rect = used_rect.union(&DeviceIntRect::new(p, size)); *used_rect = used_rect.union(&DeviceIntRect::from_origin_and_size(p, size));
sub_pass.task_ids.push(*task_id); sub_pass.task_ids.push(*task_id);
break; break;
} }
@ -520,7 +520,7 @@ impl RenderTaskGraphBuilder {
surface: SubPassSurface::Dynamic { surface: SubPassSurface::Dynamic {
texture_id, texture_id,
target_kind: kind, target_kind: kind,
used_rect: DeviceIntRect::new(p, size), used_rect: DeviceIntRect::from_origin_and_size(p, size),
}, },
task_ids: vec![*task_id], task_ids: vec![*task_id],
}); });
@ -530,7 +530,7 @@ impl RenderTaskGraphBuilder {
assert!(location.is_some()); assert!(location.is_some());
task.location = RenderTaskLocation::Dynamic { task.location = RenderTaskLocation::Dynamic {
texture_id: location.unwrap().0, texture_id: location.unwrap().0,
rect: DeviceIntRect::new(location.unwrap().1, size), rect: DeviceIntRect::from_origin_and_size(location.unwrap().1, size),
}; };
} }
RenderTaskLocation::Static { ref surface, .. } => { RenderTaskLocation::Static { ref surface, .. } => {

Просмотреть файл

@ -201,11 +201,11 @@ impl DebugRenderer {
// If either corner of the glyph will end up out of bounds, drop it. // If either corner of the glyph will end up out of bounds, drop it.
if let Some(b) = bounds { if let Some(b) = bounds {
let rect = DeviceRect::new( let rect = DeviceRect {
DevicePoint::new(x0, y0), min: DevicePoint::new(x0, y0),
DeviceSize::new(x1 - x0, y1 - y0), max: DevicePoint::new(x1, y1),
); };
if !b.contains_rect(&rect) { if !b.contains_box(&rect) {
continue; continue;
} }
} }
@ -286,8 +286,8 @@ impl DebugRenderer {
pub fn add_rect(&mut self, rect: &DeviceIntRect, color: ColorU) { pub fn add_rect(&mut self, rect: &DeviceIntRect, color: ColorU) {
let p0 = rect.origin; let p0 = rect.min;
let p1 = p0 + rect.size; let p1 = rect.max;
self.add_line(p0.x, p0.y, color, p1.x, p0.y, color); self.add_line(p0.x, p0.y, color, p1.x, p0.y, color);
self.add_line(p1.x, p0.y, color, p1.x, p1.y, color); self.add_line(p1.x, p0.y, color, p1.x, p1.y, color);
self.add_line(p1.x, p1.y, color, p0.x, p1.y, color); self.add_line(p1.x, p1.y, color, p0.x, p1.y, color);

Просмотреть файл

@ -342,7 +342,7 @@ impl GpuCacheTexture {
} }
let blocks = row.dirty_blocks(); let blocks = row.dirty_blocks();
let rect = DeviceIntRect::new( let rect = DeviceIntRect::from_origin_and_size(
DeviceIntPoint::new(row.min_dirty as i32, row_index as i32), DeviceIntPoint::new(row.min_dirty as i32, row_index as i32),
DeviceIntSize::new(blocks.len() as i32, 1), DeviceIntSize::new(blocks.len() as i32, 1),
); );

Просмотреть файл

@ -1744,22 +1744,13 @@ impl Renderer {
// Ensure old surface is invalidated before binding // Ensure old surface is invalidated before binding
compositor.invalidate_tile( compositor.invalidate_tile(
NativeTileId::DEBUG_OVERLAY, NativeTileId::DEBUG_OVERLAY,
DeviceIntRect::new( DeviceIntRect::from_size(surface_size),
DeviceIntPoint::zero(),
surface_size,
),
); );
// Bind the native surface // Bind the native surface
let surface_info = compositor.bind( let surface_info = compositor.bind(
NativeTileId::DEBUG_OVERLAY, NativeTileId::DEBUG_OVERLAY,
DeviceIntRect::new( DeviceIntRect::from_size(surface_size),
DeviceIntPoint::zero(), DeviceIntRect::from_size(surface_size),
surface_size,
),
DeviceIntRect::new(
DeviceIntPoint::zero(),
surface_size,
),
); );
// Bind the native surface to current FBO target // Bind the native surface to current FBO target
@ -1801,8 +1792,7 @@ impl Renderer {
compositor.add_surface( compositor.add_surface(
NativeSurfaceId::DEBUG_OVERLAY, NativeSurfaceId::DEBUG_OVERLAY,
CompositorSurfaceTransform::identity(), CompositorSurfaceTransform::identity(),
DeviceIntRect::new( DeviceIntRect::from_size(
DeviceIntPoint::zero(),
self.debug_overlay_state.current_size.unwrap(), self.debug_overlay_state.current_size.unwrap(),
), ),
ImageRendering::Auto, ImageRendering::Auto,
@ -2389,38 +2379,38 @@ impl Renderer {
); );
// Get the rect that we ideally want, in space of the parent surface // Get the rect that we ideally want, in space of the parent surface
let wanted_rect = DeviceRect::new( let wanted_rect = DeviceRect::from_origin_and_size(
readback_origin, readback_origin,
readback_rect.size.to_f32(), readback_rect.size().to_f32(),
); );
// Get the rect that is available on the parent surface. It may be smaller // Get the rect that is available on the parent surface. It may be smaller
// than desired because this is a picture cache tile covering only part of // than desired because this is a picture cache tile covering only part of
// the wanted rect and/or because the parent surface was clipped. // the wanted rect and/or because the parent surface was clipped.
let avail_rect = DeviceRect::new( let avail_rect = DeviceRect::from_origin_and_size(
backdrop_screen_origin, backdrop_screen_origin,
backdrop_rect.size.to_f32(), backdrop_rect.size().to_f32(),
); );
if let Some(int_rect) = wanted_rect.intersection(&avail_rect) { if let Some(int_rect) = wanted_rect.intersection(&avail_rect) {
// If there is a valid intersection, work out the correct origins and // If there is a valid intersection, work out the correct origins and
// sizes of the copy rects, and do the blit. // sizes of the copy rects, and do the blit.
let copy_size = int_rect.size.to_i32(); let copy_size = int_rect.size().to_i32();
let src_origin = backdrop_rect.origin.to_f32() + let src_origin = backdrop_rect.min.to_f32() +
int_rect.origin.to_vector() - int_rect.min.to_vector() -
backdrop_screen_origin.to_vector(); backdrop_screen_origin.to_vector();
let src = DeviceIntRect::new( let src = DeviceIntRect::from_origin_and_size(
src_origin.to_i32(), src_origin.to_i32(),
copy_size, copy_size,
); );
let dest_origin = readback_rect.origin.to_f32() + let dest_origin = readback_rect.min.to_f32() +
int_rect.origin.to_vector() - int_rect.min.to_vector() -
readback_origin.to_vector(); readback_origin.to_vector();
let dest = DeviceIntRect::new( let dest = DeviceIntRect::from_origin_and_size(
dest_origin.to_i32(), dest_origin.to_i32(),
copy_size, copy_size,
); );
@ -2474,7 +2464,7 @@ impl Renderer {
(source_texture, source_rect) (source_texture, source_rect)
}; };
debug_assert_eq!(source_rect.size, blit.target_rect.size); debug_assert_eq!(source_rect.size(), blit.target_rect.size());
let (texture, swizzle) = self.texture_resolver let (texture, swizzle) = self.texture_resolver
.resolve(&source) .resolve(&source)
.expect("BUG: invalid source texture"); .expect("BUG: invalid source texture");
@ -2598,8 +2588,8 @@ impl Renderer {
} }
let instance = ClearInstance { let instance = ClearInstance {
rect: [ rect: [
r.origin.x as f32, r.origin.y as f32, r.min.x as f32, r.min.y as f32,
r.size.width as f32, r.size.height as f32, r.width() as f32, r.height() as f32,
], ],
color: clear_color.unwrap_or([0.0; 4]), color: clear_color.unwrap_or([0.0; 4]),
}; };
@ -3051,7 +3041,7 @@ impl Renderer {
for item in tiles_iter { for item in tiles_iter {
let tile = &composite_state.tiles[item.key]; let tile = &composite_state.tiles[item.key];
let clip_rect = item.rectangle.to_rect(); let clip_rect = item.rectangle;
// Work out the draw params based on the tile surface // Work out the draw params based on the tile surface
let (instance, textures, shader_params) = match tile.surface { let (instance, textures, shader_params) = match tile.surface {
@ -3270,17 +3260,17 @@ impl Renderer {
// Determine a clip rect to apply to this tile, depending on what // Determine a clip rect to apply to this tile, depending on what
// the partial present mode is. // the partial present mode is.
let partial_clip_rect = match partial_present_mode { let partial_clip_rect = match partial_present_mode {
Some(PartialPresentMode::Single { dirty_rect }) => dirty_rect.to_box2d(), Some(PartialPresentMode::Single { dirty_rect }) => dirty_rect,
None => tile.rect.to_box2d(), None => tile.rect,
}; };
// Simple compositor needs the valid rect in device space to match clip rect // Simple compositor needs the valid rect in device space to match clip rect
let valid_device_rect = tile.valid_rect.translate( let valid_device_rect = tile.valid_rect.translate(
tile.rect.origin.to_vector() tile.rect.min.to_vector()
).to_box2d(); );
let rect = tile.rect.to_box2d() let rect = tile.rect
.intersection_unchecked(&tile.clip_rect.to_box2d()) .intersection_unchecked(&tile.clip_rect)
.intersection_unchecked(&partial_clip_rect) .intersection_unchecked(&partial_clip_rect)
.intersection_unchecked(&valid_device_rect); .intersection_unchecked(&valid_device_rect);
@ -3309,7 +3299,7 @@ impl Renderer {
// on Mali-G77 we have observed artefacts when calling glClear (even with // on Mali-G77 we have observed artefacts when calling glClear (even with
// the empty scissor rect set) after calling eglSetDamageRegion with an // the empty scissor rect set) after calling eglSetDamageRegion with an
// empty damage region. So avoid clearing in that case. See bug 1709548. // empty damage region. So avoid clearing in that case. See bug 1709548.
if !dirty_rect.is_empty() && occlusion.test(&dirty_rect.to_box2d()) { if !dirty_rect.is_empty() && occlusion.test(&dirty_rect) {
// We have a single dirty rect, so clear only that // We have a single dirty rect, so clear only that
self.device.clear_target(clear_color, self.device.clear_target(clear_color,
None, None,
@ -3414,7 +3404,7 @@ impl Renderer {
DrawTarget::NativeSurface { .. } => { DrawTarget::NativeSurface { .. } => {
unreachable!("bug: native compositor surface in child target"); unreachable!("bug: native compositor surface in child target");
} }
DrawTarget::Default { rect, total_size, .. } if rect.origin == FramebufferIntPoint::zero() && rect.size == total_size => { DrawTarget::Default { rect, total_size, .. } if rect.min == FramebufferIntPoint::zero() && rect.size() == total_size => {
// whole screen is covered, no need for scissor // whole screen is covered, no need for scissor
None None
} }
@ -3666,8 +3656,8 @@ impl Renderer {
let rect = render_tasks[*task_id].get_target_rect().to_f32(); let rect = render_tasks[*task_id].get_target_rect().to_f32();
ClearInstance { ClearInstance {
rect: [ rect: [
rect.origin.x, rect.origin.y, rect.min.x, rect.min.y,
rect.size.width, rect.size.height, rect.width(), rect.height(),
], ],
color: zero_color, color: zero_color,
} }
@ -3679,8 +3669,8 @@ impl Renderer {
let rect = render_tasks[*task_id].get_target_rect().to_f32(); let rect = render_tasks[*task_id].get_target_rect().to_f32();
ClearInstance { ClearInstance {
rect: [ rect: [
rect.origin.x, rect.origin.y, rect.min.x, rect.min.y,
rect.size.width, rect.size.height, rect.width(), rect.height(),
], ],
color: one_color, color: one_color,
} }
@ -3836,8 +3826,8 @@ impl Renderer {
.iter() .iter()
.map(|r| ClearInstance { .map(|r| ClearInstance {
rect: [ rect: [
r.origin.x as f32, r.origin.y as f32, r.min.x as f32, r.min.y as f32,
r.size.width as f32, r.size.height as f32, r.width() as f32, r.height() as f32,
], ],
color, color,
}) })
@ -4209,9 +4199,9 @@ impl Renderer {
if tile.kind == TileKind::Clear { if tile.kind == TileKind::Clear {
continue; continue;
} }
let tile_dirty_rect = tile.dirty_rect.translate(tile.rect.origin.to_vector()); let tile_dirty_rect = tile.dirty_rect.translate(tile.rect.min.to_vector());
let transformed_dirty_rect = if let Some(transform) = tile.transform { let transformed_dirty_rect = if let Some(transform) = tile.transform {
transform.outer_transformed_rect(&tile_dirty_rect) transform.outer_transformed_box2d(&tile_dirty_rect)
} else { } else {
Some(tile_dirty_rect) Some(tile_dirty_rect)
}; };
@ -4251,8 +4241,7 @@ impl Renderer {
} else { } else {
// If we don't have a valid partial present scenario, return a single // If we don't have a valid partial present scenario, return a single
// dirty rect to the client that covers the entire framebuffer. // dirty rect to the client that covers the entire framebuffer.
let fb_rect = DeviceIntRect::new( let fb_rect = DeviceIntRect::from_size(
DeviceIntPoint::zero(),
draw_target_dimensions, draw_target_dimensions,
); );
results.dirty_rects.push(fb_rect); results.dirty_rects.push(fb_rect);
@ -4634,7 +4623,7 @@ impl Renderer {
PictureCacheDebugInfo::new(), PictureCacheDebugInfo::new(),
); );
let size = frame.device_rect.size.to_f32(); let size = frame.device_rect.size().to_f32();
let surface_origin_is_top_left = self.device.surface_origin_is_top_left(); let surface_origin_is_top_left = self.device.surface_origin_is_top_left();
let (bottom, top) = if surface_origin_is_top_left { let (bottom, top) = if surface_origin_is_top_left {
(0.0, size.height) (0.0, size.height)
@ -4655,7 +4644,9 @@ impl Renderer {
let mut fb_rect = frame.device_rect * fb_scale; let mut fb_rect = frame.device_rect * fb_scale;
if !surface_origin_is_top_left { if !surface_origin_is_top_left {
fb_rect.origin.y = device_size.height - fb_rect.origin.y - fb_rect.size.height; let h = fb_rect.height();
fb_rect.min.y = device_size.height - fb_rect.max.y;
fb_rect.max.y = fb_rect.min.y + h;
} }
let draw_target = DrawTarget::Default { let draw_target = DrawTarget::Default {
@ -4741,10 +4732,10 @@ impl Renderer {
match item { match item {
DebugItem::Rect { rect, outer_color, inner_color } => { DebugItem::Rect { rect, outer_color, inner_color } => {
debug_renderer.add_quad( debug_renderer.add_quad(
rect.origin.x, rect.min.x,
rect.origin.y, rect.min.y,
rect.origin.x + rect.size.width, rect.max.x,
rect.origin.y + rect.size.height, rect.max.y,
(*inner_color).into(), (*inner_color).into(),
(*inner_color).into(), (*inner_color).into(),
); );
@ -4818,12 +4809,12 @@ impl Renderer {
.max(0), .max(0),
); );
let source_rect = DeviceIntRect::new( let source_rect = DeviceIntRect::from_origin_and_size(
source_origin, source_origin,
source_size, source_size,
); );
let target_rect = DeviceIntRect::new( let target_rect = DeviceIntRect::from_origin_and_size(
DeviceIntPoint::new( DeviceIntPoint::new(
device_size.width - target_size.width - 64, device_size.width - target_size.width - 64,
device_size.height - target_size.height - 64, device_size.height - target_size.height - 64,
@ -4831,9 +4822,8 @@ impl Renderer {
target_size, target_size,
); );
let texture_rect = FramebufferIntRect::new( let texture_rect = FramebufferIntRect::from_size(
FramebufferIntPoint::zero(), source_rect.size().cast_unit(),
source_rect.size.cast_unit(),
); );
debug_renderer.add_rect( debug_renderer.add_rect(
@ -4845,8 +4835,8 @@ impl Renderer {
let texture = self.device.create_texture( let texture = self.device.create_texture(
ImageBufferKind::Texture2D, ImageBufferKind::Texture2D,
ImageFormat::BGRA8, ImageFormat::BGRA8,
source_rect.size.width, source_rect.width(),
source_rect.size.height, source_rect.height(),
TextureFilter::Nearest, TextureFilter::Nearest,
Some(RenderTargetInfo { has_depth: false }), Some(RenderTargetInfo { has_depth: false }),
); );
@ -4953,8 +4943,7 @@ impl Renderer {
continue; continue;
} }
let dimensions = texture.get_dimensions(); let dimensions = texture.get_dimensions();
let src_rect = FramebufferIntRect::new( let src_rect = FramebufferIntRect::from_size(
FramebufferIntPoint::zero(),
FramebufferIntSize::new(dimensions.width as i32, dimensions.height as i32), FramebufferIntSize::new(dimensions.width as i32, dimensions.height as i32),
); );
@ -4966,7 +4955,7 @@ impl Renderer {
} }
// Draw the info tag. // Draw the info tag.
let tag_rect = rect(x, tag_y, size, tag_height); let tag_rect = rect(x, tag_y, size, tag_height).to_box2d();
let tag_color = select_color(texture); let tag_color = select_color(texture);
device.clear_target( device.clear_target(
Some(tag_color), Some(tag_color),
@ -4978,15 +4967,15 @@ impl Renderer {
let dim = texture.get_dimensions(); let dim = texture.get_dimensions();
let text_rect = tag_rect.inflate(-text_margin, -text_margin); let text_rect = tag_rect.inflate(-text_margin, -text_margin);
debug_renderer.add_text( debug_renderer.add_text(
text_rect.min_x() as f32, text_rect.min.x as f32,
text_rect.max_y() as f32, // Top-relative. text_rect.max.y as f32, // Top-relative.
&format!("{}x{}", dim.width, dim.height), &format!("{}x{}", dim.width, dim.height),
ColorU::new(0, 0, 0, 255), ColorU::new(0, 0, 0, 255),
Some(tag_rect.to_f32()) Some(tag_rect.to_f32())
); );
// Blit the contents of the texture. // Blit the contents of the texture.
let dest_rect = draw_target.to_framebuffer_rect(rect(x, image_y, size, size)); let dest_rect = draw_target.to_framebuffer_rect(rect(x, image_y, size, size).to_box2d());
let read_target = ReadTarget::from_texture(texture); let read_target = ReadTarget::from_texture(texture);
if surface_origin_is_top_left { if surface_origin_is_top_left {
@ -5089,7 +5078,7 @@ impl Renderer {
} }
pub fn read_pixels_rgba8(&mut self, rect: FramebufferIntRect) -> Vec<u8> { pub fn read_pixels_rgba8(&mut self, rect: FramebufferIntRect) -> Vec<u8> {
let mut pixels = vec![0; (rect.size.width * rect.size.height * 4) as usize]; let mut pixels = vec![0; (rect.area() * 4) as usize];
self.device.read_pixels_into(rect, ImageFormat::RGBA8, &mut pixels); self.device.read_pixels_into(rect, ImageFormat::RGBA8, &mut pixels);
pixels pixels
} }
@ -5987,8 +5976,8 @@ mod tests {
assert_eq!(tracker.get_damage_rect(3), Some(DeviceRect::zero())); assert_eq!(tracker.get_damage_rect(3), Some(DeviceRect::zero()));
assert_eq!(tracker.get_damage_rect(4), None); assert_eq!(tracker.get_damage_rect(4), None);
let damage1 = DeviceRect::new(DevicePoint::new(10.0, 10.0), DeviceSize::new(10.0, 10.0)); let damage1 = DeviceRect::from_origin_and_size(DevicePoint::new(10.0, 10.0), DeviceSize::new(10.0, 10.0));
let damage2 = DeviceRect::new(DevicePoint::new(20.0, 20.0), DeviceSize::new(10.0, 10.0)); let damage2 = DeviceRect::from_origin_and_size(DevicePoint::new(20.0, 20.0), DeviceSize::new(10.0, 10.0));
let combined = damage1.union(&damage2); let combined = damage1.union(&damage2);
tracker.push_dirty_rect(&damage1); tracker.push_dirty_rect(&damage1);

Просмотреть файл

@ -103,8 +103,8 @@ pub fn upload_to_texture_cache(
ExternalImageSource::Invalid => { ExternalImageSource::Invalid => {
// Create a local buffer to fill the pbo. // Create a local buffer to fill the pbo.
let bpp = texture.get_format().bytes_per_pixel(); let bpp = texture.get_format().bytes_per_pixel();
let width = stride.unwrap_or(rect.size.width * bpp); let width = stride.unwrap_or(rect.width() * bpp);
let total_size = width * rect.size.height; let total_size = width * rect.height();
// WR haven't support RGBAF32 format in texture_cache, so // WR haven't support RGBAF32 format in texture_cache, so
// we use u8 type here. // we use u8 type here.
dummy_data = vec![0xFFu8; total_size as usize]; dummy_data = vec![0xFFu8; total_size as usize];
@ -133,8 +133,8 @@ pub fn upload_to_texture_cache(
let use_batch_upload = renderer.device.use_batched_texture_uploads() && let use_batch_upload = renderer.device.use_batched_texture_uploads() &&
texture.flags().contains(TextureFlags::IS_SHARED_TEXTURE_CACHE) && texture.flags().contains(TextureFlags::IS_SHARED_TEXTURE_CACHE) &&
rect.size.width <= BATCH_UPLOAD_TEXTURE_SIZE.width && rect.width() <= BATCH_UPLOAD_TEXTURE_SIZE.width &&
rect.size.height <= BATCH_UPLOAD_TEXTURE_SIZE.height; rect.height() <= BATCH_UPLOAD_TEXTURE_SIZE.height;
if use_batch_upload { if use_batch_upload {
copy_into_staging_buffer( copy_into_staging_buffer(
@ -327,11 +327,11 @@ fn copy_into_staging_buffer<'a>(
// Allocate a region within the staging buffer for this update. If there is // Allocate a region within the staging buffer for this update. If there is
// no room in an existing buffer then allocate another texture and buffer. // no room in an existing buffer then allocate another texture and buffer.
let (slice, origin) = match allocator.allocate(&update_rect.size) { let (slice, origin) = match allocator.allocate(&update_rect.size()) {
Some((slice, origin)) => (slice, origin), Some((slice, origin)) => (slice, origin),
None => { None => {
let new_slice = FreeRectSlice(buffers.len() as u32); let new_slice = FreeRectSlice(buffers.len() as u32);
allocator.extend(new_slice, BATCH_UPLOAD_TEXTURE_SIZE, update_rect.size); allocator.extend(new_slice, BATCH_UPLOAD_TEXTURE_SIZE, update_rect.size());
let texture_alloc_time_start = precise_time_ns(); let texture_alloc_time_start = precise_time_ns();
let staging_texture = staging_texture_pool.get_texture(device, texture.get_format()); let staging_texture = staging_texture_pool.get_texture(device, texture.get_format());
@ -367,26 +367,26 @@ fn copy_into_staging_buffer<'a>(
} }
}; };
let buffer = &mut buffers[slice.0 as usize]; let buffer = &mut buffers[slice.0 as usize];
let allocated_rect = DeviceIntRect::new(origin, update_rect.size); let allocated_rect = DeviceIntRect::from_origin_and_size(origin, update_rect.size());
buffer.upload_rect = buffer.upload_rect.union(&allocated_rect); buffer.upload_rect = buffer.upload_rect.union(&allocated_rect);
batch_upload_copies.push(BatchUploadCopy { batch_upload_copies.push(BatchUploadCopy {
src_texture_index: buffer.texture_index, src_texture_index: buffer.texture_index,
src_offset: allocated_rect.origin, src_offset: allocated_rect.min,
dest_texture_id, dest_texture_id,
dest_offset: update_rect.origin, dest_offset: update_rect.min,
size: update_rect.size, size: update_rect.size(),
}); });
unsafe { unsafe {
let memcpy_start_time = precise_time_ns(); let memcpy_start_time = precise_time_ns();
let bpp = texture.get_format().bytes_per_pixel() as usize; let bpp = texture.get_format().bytes_per_pixel() as usize;
let width_bytes = update_rect.size.width as usize * bpp; let width_bytes = update_rect.width() as usize * bpp;
let src_stride = update_stride.map_or(width_bytes, |stride| { let src_stride = update_stride.map_or(width_bytes, |stride| {
assert!(stride >= 0); assert!(stride >= 0);
stride as usize stride as usize
}); });
let src_size = (update_rect.size.height as usize - 1) * src_stride + width_bytes; let src_size = (update_rect.height() as usize - 1) * src_stride + width_bytes;
assert!(src_size <= data.len()); assert!(src_size <= data.len());
let src: &[mem::MaybeUninit<u8>] = std::slice::from_raw_parts(data.as_ptr() as *const _, src_size); let src: &[mem::MaybeUninit<u8>] = std::slice::from_raw_parts(data.as_ptr() as *const _, src_size);
@ -403,11 +403,11 @@ fn copy_into_staging_buffer<'a>(
// copy the data line-by-line in to the buffer so that we do not overwrite // copy the data line-by-line in to the buffer so that we do not overwrite
// any other region of the buffer. // any other region of the buffer.
for y in 0..allocated_rect.size.height as usize { for y in 0..allocated_rect.height() as usize {
let src_start = y * src_stride; let src_start = y * src_stride;
let src_end = src_start + width_bytes; let src_end = src_start + width_bytes;
let dst_start = (allocated_rect.origin.y as usize + y as usize) * dst_stride + let dst_start = (allocated_rect.min.y as usize + y as usize) * dst_stride +
allocated_rect.origin.x as usize * bpp; allocated_rect.min.x as usize * bpp;
let dst_end = dst_start + width_bytes; let dst_end = dst_start + width_bytes;
dst[dst_start..dst_end].copy_from_slice(&src[src_start..src_end]) dst[dst_start..dst_end].copy_from_slice(&src[src_start..src_end])
@ -539,10 +539,10 @@ fn copy_from_staging_to_cache_using_draw_calls(
prev_src = Some(copy.src_texture_index) prev_src = Some(copy.src_texture_index)
} }
let dest_rect = DeviceRect { let dest_rect = DeviceRect::from_origin_and_size(
origin: copy.dest_offset.to_f32(), copy.dest_offset.to_f32(),
size: copy.size.to_f32(), copy.size.to_f32(),
}; );
let src_rect = TexelRect::new( let src_rect = TexelRect::new(
copy.src_offset.x as f32, copy.src_offset.x as f32,

Просмотреть файл

@ -880,8 +880,7 @@ impl<T> VertexDataTexture<T> {
MAX_VERTEX_TEXTURE_WIDTH - (MAX_VERTEX_TEXTURE_WIDTH % texels_per_item) MAX_VERTEX_TEXTURE_WIDTH - (MAX_VERTEX_TEXTURE_WIDTH % texels_per_item)
}; };
let rect = DeviceIntRect::new( let rect = DeviceIntRect::from_size(
DeviceIntPoint::zero(),
DeviceIntSize::new(logical_width as i32, needed_height), DeviceIntSize::new(logical_width as i32, needed_height),
); );

Просмотреть файл

@ -831,7 +831,7 @@ impl ResourceCache {
tile.x as i32, tile.x as i32,
tile.y as i32, tile.y as i32,
) * tile_size as i32; ) * tile_size as i32;
rect.origin -= tile_offset.to_vector(); rect = rect.translate(-tile_offset.to_vector());
let tile_rect = compute_tile_size( let tile_rect = compute_tile_size(
&descriptor.size.into(), &descriptor.size.into(),
@ -1063,7 +1063,7 @@ impl ResourceCache {
fn set_image_visible_rect(&mut self, key: ImageKey, rect: &DeviceIntRect) { fn set_image_visible_rect(&mut self, key: ImageKey, rect: &DeviceIntRect) {
if let Some(image) = self.resources.image_templates.get_mut(key) { if let Some(image) = self.resources.image_templates.get_mut(key) {
image.visible_rect = *rect; image.visible_rect = *rect;
image.descriptor.size = rect.size; image.descriptor.size = rect.size();
} }
} }
@ -1131,7 +1131,7 @@ impl ResourceCache {
index_in_text_run: loop_index as i32, index_in_text_run: loop_index as i32,
uv_rect_address: gpu_cache.get_address(&cache_item.uv_rect_handle), uv_rect_address: gpu_cache.get_address(&cache_item.uv_rect_handle),
offset: DevicePoint::new(cache_item.user_data[0], cache_item.user_data[1]), offset: DevicePoint::new(cache_item.user_data[0], cache_item.user_data[1]),
size: cache_item.uv_rect.size, size: cache_item.uv_rect.size(),
scale: cache_item.user_data[2], scale: cache_item.user_data[2],
}); });
} }
@ -1296,7 +1296,7 @@ impl ResourceCache {
if !tiled_on_cpu { if !tiled_on_cpu {
// we don't expect to have partial tiles at the top and left of non-blob // we don't expect to have partial tiles at the top and left of non-blob
// images. // images.
debug_assert_eq!(image_template.visible_rect.origin, point2(0, 0)); debug_assert_eq!(image_template.visible_rect.min, point2(0, 0));
let bpp = descriptor.format.bytes_per_pixel(); let bpp = descriptor.format.bytes_per_pixel();
let stride = descriptor.compute_stride(); let stride = descriptor.compute_stride();
descriptor.stride = Some(stride); descriptor.stride = Some(stride);
@ -1796,12 +1796,7 @@ const NATIVE_FONT: &'static [u8] = include_bytes!("../res/Proggy.ttf");
// This currently only casts the unit but will soon apply an offset // This currently only casts the unit but will soon apply an offset
fn to_image_dirty_rect(blob_dirty_rect: &BlobDirtyRect) -> ImageDirtyRect { fn to_image_dirty_rect(blob_dirty_rect: &BlobDirtyRect) -> ImageDirtyRect {
match *blob_dirty_rect { match *blob_dirty_rect {
DirtyRect::Partial(rect) => DirtyRect::Partial( DirtyRect::Partial(rect) => DirtyRect::Partial(rect.cast_unit()),
DeviceIntRect {
origin: DeviceIntPoint::new(rect.origin.x, rect.origin.y),
size: DeviceIntSize::new(rect.size.width, rect.size.height),
}
),
DirtyRect::All => DirtyRect::All, DirtyRect::All => DirtyRect::All,
} }
} }
@ -1892,7 +1887,7 @@ impl ResourceCache {
data: Arc::new(vec![0; desc.compute_total_size() as usize]) data: Arc::new(vec![0; desc.compute_total_size() as usize])
}; };
assert_eq!(result.rasterized_rect.size, desc.size); assert_eq!(result.rasterized_rect.size(), desc.size);
assert_eq!(result.data.len(), desc.compute_total_size() as usize); assert_eq!(result.data.len(), desc.compute_total_size() as usize);
num_blobs += 1; num_blobs += 1;

Просмотреть файл

@ -575,7 +575,7 @@ impl<'a> SceneBuilder<'a> {
BuiltScene { BuiltScene {
has_root_pipeline: scene.has_root_pipeline(), has_root_pipeline: scene.has_root_pipeline(),
pipeline_epochs: scene.pipeline_epochs.clone(), pipeline_epochs: scene.pipeline_epochs.clone(),
output_rect: view.device_rect.size.into(), output_rect: view.device_rect.size().into(),
background_color, background_color,
hit_testing_scene: Arc::new(builder.hit_testing_scene), hit_testing_scene: Arc::new(builder.hit_testing_scene),
spatial_tree: builder.spatial_tree, spatial_tree: builder.spatial_tree,

Просмотреть файл

@ -115,17 +115,17 @@ impl AsyncScreenshotGrabber {
) -> (AsyncScreenshotHandle, DeviceIntSize) { ) -> (AsyncScreenshotHandle, DeviceIntSize) {
let screenshot_size = match self.mode { let screenshot_size = match self.mode {
AsyncScreenshotGrabberMode::ProfilerScreenshots => { AsyncScreenshotGrabberMode::ProfilerScreenshots => {
assert_ne!(window_rect.size.width, 0); assert_ne!(window_rect.width(), 0);
assert_ne!(window_rect.size.height, 0); assert_ne!(window_rect.height(), 0);
let scale = (buffer_size.width as f32 / window_rect.size.width as f32) let scale = (buffer_size.width as f32 / window_rect.width() as f32)
.min(buffer_size.height as f32 / window_rect.size.height as f32); .min(buffer_size.height as f32 / window_rect.height() as f32);
(window_rect.size.to_f32() * scale).round().to_i32() (window_rect.size().to_f32() * scale).round().to_i32()
} }
AsyncScreenshotGrabberMode::CompositionRecorder => { AsyncScreenshotGrabberMode::CompositionRecorder => {
assert_eq!(buffer_size, window_rect.size); assert_eq!(buffer_size, window_rect.size());
buffer_size buffer_size
} }
}; };
@ -193,7 +193,7 @@ impl AsyncScreenshotGrabber {
device.read_pixels_into_pbo( device.read_pixels_into_pbo(
read_target, read_target,
DeviceIntRect::new(DeviceIntPoint::new(0, 0), read_size), DeviceIntRect::from_size(read_size),
image_format, image_format,
&pbo, &pbo,
); );
@ -267,7 +267,7 @@ impl AsyncScreenshotGrabber {
} }
assert_eq!(self.scaling_textures[level].get_dimensions(), texture_size); assert_eq!(self.scaling_textures[level].get_dimensions(), texture_size);
let (read_target, read_target_rect) = if read_target_rect.size.width > 2 * dest_size.width { let (read_target, read_target_rect) = if read_target_rect.width() > 2 * dest_size.width {
self.scale_screenshot( self.scale_screenshot(
device, device,
read_target, read_target,
@ -281,7 +281,7 @@ impl AsyncScreenshotGrabber {
( (
ReadTarget::from_texture(&self.scaling_textures[level + 1]), ReadTarget::from_texture(&self.scaling_textures[level + 1]),
DeviceIntRect::new(DeviceIntPoint::new(0, 0), dest_size * 2), DeviceIntRect::from_size(dest_size * 2),
) )
} else { } else {
(read_target, read_target_rect) (read_target, read_target_rect)
@ -290,7 +290,7 @@ impl AsyncScreenshotGrabber {
let draw_target = DrawTarget::from_texture(&self.scaling_textures[level], false); let draw_target = DrawTarget::from_texture(&self.scaling_textures[level], false);
let draw_target_rect = draw_target let draw_target_rect = draw_target
.to_framebuffer_rect(DeviceIntRect::new(DeviceIntPoint::new(0, 0), dest_size)); .to_framebuffer_rect(DeviceIntRect::from_size(dest_size));
let read_target_rect = device_rect_as_framebuffer_rect(&read_target_rect); let read_target_rect = device_rect_as_framebuffer_rect(&read_target_rect);
@ -402,7 +402,7 @@ impl Renderer {
.get_or_insert_with(AsyncScreenshotGrabber::new_composition_recorder) .get_or_insert_with(AsyncScreenshotGrabber::new_composition_recorder)
.get_screenshot( .get_screenshot(
&mut self.device, &mut self.device,
DeviceIntRect::new(DeviceIntPoint::new(0, 0), device_size), DeviceIntRect::from_size(device_size),
device_size, device_size,
image_format, image_format,
); );

Просмотреть файл

@ -234,8 +234,8 @@ impl SpaceSnapper {
debug_assert!(self.current_target_spatial_node_index != SpatialNodeIndex::INVALID); debug_assert!(self.current_target_spatial_node_index != SpatialNodeIndex::INVALID);
match self.snapping_transform { match self.snapping_transform {
Some(ref scale_offset) => { Some(ref scale_offset) => {
let snapped_device_rect : DeviceRect = scale_offset.map_rect(rect).snap(); let snapped_device_rect: DeviceRect = scale_offset.map_rect(rect).snap().to_box2d();
scale_offset.unmap_rect(&snapped_device_rect) scale_offset.unmap_rect(&snapped_device_rect.to_rect())
} }
None => *rect, None => *rect,
} }

Просмотреть файл

@ -1199,7 +1199,7 @@ impl TextureCache {
let origin = entry.details.describe(); let origin = entry.details.describe();
( (
entry.texture_id, entry.texture_id,
DeviceIntRect::new(origin, entry.size), DeviceIntRect::from_origin_and_size(origin, entry.size),
entry.swizzle, entry.swizzle,
entry.uv_rect_handle, entry.uv_rect_handle,
entry.user_data, entry.user_data,
@ -1504,7 +1504,7 @@ impl TextureCache {
}; };
let bpp = formats.internal.bytes_per_pixel(); let bpp = formats.internal.bytes_per_pixel();
let allocated_size_in_bytes = (allocated_rect.size.area() * bpp) as usize; let allocated_size_in_bytes = (allocated_rect.area() * bpp) as usize;
self.bytes_allocated[budget_type as usize] += allocated_size_in_bytes; self.bytes_allocated[budget_type as usize] += allocated_size_in_bytes;
(CacheEntry { (CacheEntry {
@ -1512,7 +1512,7 @@ impl TextureCache {
user_data: params.user_data, user_data: params.user_data,
last_access: self.now, last_access: self.now,
details: EntryDetails::Cache { details: EntryDetails::Cache {
origin: allocated_rect.origin, origin: allocated_rect.min,
alloc_id, alloc_id,
allocated_size_in_bytes, allocated_size_in_bytes,
}, },
@ -1827,14 +1827,14 @@ impl TextureCacheUpdate {
DirtyRect::Partial(dirty) => { DirtyRect::Partial(dirty) => {
// the dirty rectangle doesn't have to be within the area but has to intersect it, at least // the dirty rectangle doesn't have to be within the area but has to intersect it, at least
let stride = descriptor.compute_stride(); let stride = descriptor.compute_stride();
let offset = descriptor.offset + dirty.origin.y * stride + dirty.origin.x * descriptor.format.bytes_per_pixel(); let offset = descriptor.offset + dirty.min.y * stride + dirty.min.x * descriptor.format.bytes_per_pixel();
TextureCacheUpdate { TextureCacheUpdate {
rect: DeviceIntRect::new( rect: DeviceIntRect::from_origin_and_size(
DeviceIntPoint::new(origin.x + dirty.origin.x, origin.y + dirty.origin.y), DeviceIntPoint::new(origin.x + dirty.min.x, origin.y + dirty.min.y),
DeviceIntSize::new( DeviceIntSize::new(
dirty.size.width.min(size.width - dirty.origin.x), dirty.width().min(size.width - dirty.min.x),
dirty.size.height.min(size.height - dirty.origin.y), dirty.height().min(size.height - dirty.min.y),
), ),
), ),
source, source,
@ -1845,7 +1845,7 @@ impl TextureCacheUpdate {
} }
DirtyRect::All => { DirtyRect::All => {
TextureCacheUpdate { TextureCacheUpdate {
rect: DeviceIntRect::new(origin, size), rect: DeviceIntRect::from_origin_and_size(origin, size),
source, source,
stride: descriptor.stride, stride: descriptor.stride,
offset: descriptor.offset, offset: descriptor.offset,

Просмотреть файл

@ -84,7 +84,7 @@ impl GuillotineAllocator {
} }
fn push(&mut self, slice: FreeRectSlice, rect: DeviceIntRect) { fn push(&mut self, slice: FreeRectSlice, rect: DeviceIntRect) {
let id = FreeListBin::for_size(&rect.size).0 as usize; let id = FreeListBin::for_size(&rect.size()).0 as usize;
self.bins[id].push(FreeRect { self.bins[id].push(FreeRect {
slice, slice,
rect, rect,
@ -102,13 +102,13 @@ impl GuillotineAllocator {
.find_map(|id| if FIND_SMALLEST_AREA { .find_map(|id| if FIND_SMALLEST_AREA {
let mut smallest_index_and_area = None; let mut smallest_index_and_area = None;
for (candidate_index, candidate) in self.bins[id as usize].iter().enumerate() { for (candidate_index, candidate) in self.bins[id as usize].iter().enumerate() {
if requested_dimensions.width > candidate.rect.size.width || if requested_dimensions.width > candidate.rect.width() ||
requested_dimensions.height > candidate.rect.size.height requested_dimensions.height > candidate.rect.height()
{ {
continue; continue;
} }
let candidate_area = candidate.rect.size.area(); let candidate_area = candidate.rect.area();
match smallest_index_and_area { match smallest_index_and_area {
Some((_, area)) if candidate_area >= area => continue, Some((_, area)) if candidate_area >= area => continue,
_ => smallest_index_and_area = Some((candidate_index, candidate_area)), _ => smallest_index_and_area = Some((candidate_index, candidate_area)),
@ -121,8 +121,8 @@ impl GuillotineAllocator {
self.bins[id as usize] self.bins[id as usize]
.iter() .iter()
.position(|candidate| { .position(|candidate| {
requested_dimensions.width <= candidate.rect.size.width && requested_dimensions.width <= candidate.rect.width() &&
requested_dimensions.height <= candidate.rect.size.height requested_dimensions.height <= candidate.rect.height()
}) })
.map(|index| (FreeListBin(id), FreeListIndex(index))) .map(|index| (FreeListBin(id), FreeListIndex(index)))
}) })
@ -130,46 +130,46 @@ impl GuillotineAllocator {
// Split that results in the single largest area (Min Area Split Rule, MINAS). // Split that results in the single largest area (Min Area Split Rule, MINAS).
fn split_guillotine(&mut self, chosen: &FreeRect, requested_dimensions: &DeviceIntSize) { fn split_guillotine(&mut self, chosen: &FreeRect, requested_dimensions: &DeviceIntSize) {
let candidate_free_rect_to_right = DeviceIntRect::new( let candidate_free_rect_to_right = DeviceIntRect::from_origin_and_size(
DeviceIntPoint::new( DeviceIntPoint::new(
chosen.rect.origin.x + requested_dimensions.width, chosen.rect.min.x + requested_dimensions.width,
chosen.rect.origin.y, chosen.rect.min.y,
), ),
DeviceIntSize::new( DeviceIntSize::new(
chosen.rect.size.width - requested_dimensions.width, chosen.rect.width() - requested_dimensions.width,
requested_dimensions.height, requested_dimensions.height,
), ),
); );
let candidate_free_rect_to_bottom = DeviceIntRect::new( let candidate_free_rect_to_bottom = DeviceIntRect::from_origin_and_size(
DeviceIntPoint::new( DeviceIntPoint::new(
chosen.rect.origin.x, chosen.rect.min.x,
chosen.rect.origin.y + requested_dimensions.height, chosen.rect.min.y + requested_dimensions.height,
), ),
DeviceIntSize::new( DeviceIntSize::new(
requested_dimensions.width, requested_dimensions.width,
chosen.rect.size.height - requested_dimensions.height, chosen.rect.height() - requested_dimensions.height,
), ),
); );
// Guillotine the rectangle. // Guillotine the rectangle.
let new_free_rect_to_right; let new_free_rect_to_right;
let new_free_rect_to_bottom; let new_free_rect_to_bottom;
if candidate_free_rect_to_right.size.area() > candidate_free_rect_to_bottom.size.area() { if candidate_free_rect_to_right.area() > candidate_free_rect_to_bottom.area() {
new_free_rect_to_right = DeviceIntRect::new( new_free_rect_to_right = DeviceIntRect::from_origin_and_size(
candidate_free_rect_to_right.origin, candidate_free_rect_to_right.min,
DeviceIntSize::new( DeviceIntSize::new(
candidate_free_rect_to_right.size.width, candidate_free_rect_to_right.width(),
chosen.rect.size.height, chosen.rect.height(),
), ),
); );
new_free_rect_to_bottom = candidate_free_rect_to_bottom new_free_rect_to_bottom = candidate_free_rect_to_bottom
} else { } else {
new_free_rect_to_right = candidate_free_rect_to_right; new_free_rect_to_right = candidate_free_rect_to_right;
new_free_rect_to_bottom = DeviceIntRect::new( new_free_rect_to_bottom = DeviceIntRect::from_origin_and_size(
candidate_free_rect_to_bottom.origin, candidate_free_rect_to_bottom.min,
DeviceIntSize::new( DeviceIntSize::new(
chosen.rect.size.width, chosen.rect.width(),
candidate_free_rect_to_bottom.size.height, candidate_free_rect_to_bottom.height(),
), ),
) )
} }
@ -196,7 +196,7 @@ impl GuillotineAllocator {
self.split_guillotine(&chosen, requested_dimensions); self.split_guillotine(&chosen, requested_dimensions);
// Return the result. // Return the result.
Some((chosen.slice, chosen.rect.origin)) Some((chosen.slice, chosen.rect.min))
} }
/// Add a new slice to the allocator, and immediately allocate a rect from it. /// Add a new slice to the allocator, and immediately allocate a rect from it.
@ -217,8 +217,7 @@ impl GuillotineAllocator {
fn random_fill(count: usize, texture_size: i32) -> f32 { fn random_fill(count: usize, texture_size: i32) -> f32 {
use rand::{thread_rng, Rng}; use rand::{thread_rng, Rng};
let total_rect = DeviceIntRect::new( let total_rect = DeviceIntRect::from_size(
DeviceIntPoint::zero(),
DeviceIntSize::new(texture_size, texture_size), DeviceIntSize::new(texture_size, texture_size),
); );
let mut rng = thread_rng(); let mut rng = thread_rng();
@ -242,14 +241,14 @@ fn random_fill(count: usize, texture_size: i32) -> f32 {
match allocator.allocate(&size) { match allocator.allocate(&size) {
Some((slice, origin)) => { Some((slice, origin)) => {
let rect = DeviceIntRect::new(origin, size); let rect = DeviceIntRect::from_origin_and_size(origin, size);
assert_eq!(None, slices[slice.0 as usize].iter().find(|r| r.intersects(&rect))); assert_eq!(None, slices[slice.0 as usize].iter().find(|r| r.intersects(&rect)));
assert!(total_rect.contains_rect(&rect)); assert!(total_rect.contains_box(&rect));
slices[slice.0 as usize].push(rect); slices[slice.0 as usize].push(rect);
} }
None => { None => {
allocator.extend(FreeRectSlice(slices.len() as u32), total_rect.size, size); allocator.extend(FreeRectSlice(slices.len() as u32), total_rect.size(), size);
let rect = DeviceIntRect::new(DeviceIntPoint::zero(), size); let rect = DeviceIntRect::from_size(size);
slices.push(vec![rect]); slices.push(vec![rect]);
} }
} }
@ -257,9 +256,9 @@ fn random_fill(count: usize, texture_size: i32) -> f32 {
// validate the free rects // validate the free rects
for (i, free_vecs) in allocator.bins.iter().enumerate() { for (i, free_vecs) in allocator.bins.iter().enumerate() {
for fr in free_vecs { for fr in free_vecs {
assert_eq!(FreeListBin(i as u8), FreeListBin::for_size(&fr.rect.size)); assert_eq!(FreeListBin(i as u8), FreeListBin::for_size(&fr.rect.size()));
assert_eq!(None, slices[fr.slice.0 as usize].iter().find(|r| r.intersects(&fr.rect))); assert_eq!(None, slices[fr.slice.0 as usize].iter().find(|r| r.intersects(&fr.rect)));
assert!(total_rect.contains_rect(&fr.rect)); assert!(total_rect.contains_box(&fr.rect));
slices[fr.slice.0 as usize].push(fr.rect); slices[fr.slice.0 as usize].push(fr.rect);
} }
} }

Просмотреть файл

@ -232,7 +232,7 @@ impl AtlasAllocator for BucketedShelfAllocator {
fn allocate(&mut self, size: DeviceIntSize) -> Option<(AllocId, DeviceIntRect)> { fn allocate(&mut self, size: DeviceIntSize) -> Option<(AllocId, DeviceIntRect)> {
self.allocate(size.to_untyped()).map(|alloc| { self.allocate(size.to_untyped()).map(|alloc| {
(AllocId(alloc.id.serialize()), alloc.rectangle.to_rect().cast_unit()) (AllocId(alloc.id.serialize()), alloc.rectangle.cast_unit())
}) })
} }
@ -262,7 +262,7 @@ impl AtlasAllocator for ShelfAllocator {
fn allocate(&mut self, size: DeviceIntSize) -> Option<(AllocId, DeviceIntRect)> { fn allocate(&mut self, size: DeviceIntSize) -> Option<(AllocId, DeviceIntRect)> {
self.allocate(size.to_untyped()).map(|alloc| { self.allocate(size.to_untyped()).map(|alloc| {
(AllocId(alloc.id.serialize()), alloc.rectangle.to_rect().cast_unit()) (AllocId(alloc.id.serialize()), alloc.rectangle.cast_unit())
}) })
} }

Просмотреть файл

@ -247,10 +247,10 @@ impl SlabAllocator {
if let Some((origin, location)) = region.alloc() { if let Some((origin, location)) = region.alloc() {
return Some(( return Some((
pack_alloc_id(region.index, location), pack_alloc_id(region.index, location),
DeviceIntRect { DeviceIntRect::from_origin_and_size(
origin, origin,
size: allocated_size, allocated_size,
} )
)); ));
} }
} }
@ -263,10 +263,10 @@ impl SlabAllocator {
return Some(( return Some((
pack_alloc_id(region.index, location), pack_alloc_id(region.index, location),
DeviceIntRect { DeviceIntRect::from_origin_and_size(
origin, origin,
size: allocated_size, allocated_size,
}, ),
)) ))
} }
@ -288,7 +288,7 @@ impl SlabAllocator {
let region_spacing = 5.0; let region_spacing = 5.0;
let text_spacing = 15.0; let text_spacing = 15.0;
let regions_per_row = (self.size / self.region_size) as usize; let regions_per_row = (self.size / self.region_size) as usize;
let wh = rect.size().width.min(rect.size().height); let wh = rect.width().min(rect.height());
let region_wh = (wh - region_spacing) / regions_per_row as f32 - region_spacing; let region_wh = (wh - region_spacing) / regions_per_row as f32 - region_spacing;
let x0 = rect.min.x; let x0 = rect.min.x;

Просмотреть файл

@ -927,7 +927,7 @@ pub trait MaxRect {
impl MaxRect for DeviceIntRect { impl MaxRect for DeviceIntRect {
fn max_rect() -> Self { fn max_rect() -> Self {
DeviceIntRect::new( DeviceIntRect::from_origin_and_size(
DeviceIntPoint::new(i32::MIN / 2, i32::MIN / 2), DeviceIntPoint::new(i32::MIN / 2, i32::MIN / 2),
DeviceIntSize::new(i32::MAX, i32::MAX), DeviceIntSize::new(i32::MAX, i32::MAX),
) )
@ -1207,7 +1207,7 @@ pub fn raster_rect_to_device_pixels(
device_pixel_scale: DevicePixelScale, device_pixel_scale: DevicePixelScale,
) -> DeviceRect { ) -> DeviceRect {
let world_rect = rect * Scale::new(1.0); let world_rect = rect * Scale::new(1.0);
let device_rect = world_rect * device_pixel_scale; let device_rect = (world_rect * device_pixel_scale).to_box2d();
device_rect.round_out() device_rect.round_out()
} }

Просмотреть файл

@ -510,7 +510,7 @@ pub fn update_primitive_visibility(
&map_surface_to_world, &map_surface_to_world,
) { ) {
let debug_rect = rect * frame_context.global_device_pixel_scale; let debug_rect = rect * frame_context.global_device_pixel_scale;
frame_state.scratch.primitive.push_debug_rect(debug_rect, debug_color, debug_color.scale_alpha(0.5)); frame_state.scratch.primitive.push_debug_rect(debug_rect.to_box2d(), debug_color, debug_color.scale_alpha(0.5));
} }
} }
} else if frame_context.debug_flags.contains(::api::DebugFlags::OBSCURE_IMAGES) { } else if frame_context.debug_flags.contains(::api::DebugFlags::OBSCURE_IMAGES) {
@ -527,7 +527,7 @@ pub fn update_primitive_visibility(
) { ) {
let rect = rect * frame_context.global_device_pixel_scale; let rect = rect * frame_context.global_device_pixel_scale;
if rect.size.width > 70.0 && rect.size.height > 70.0 { if rect.size.width > 70.0 && rect.size.height > 70.0 {
frame_state.scratch.primitive.push_debug_rect(rect, debug_colors::PURPLE, debug_colors::PURPLE); frame_state.scratch.primitive.push_debug_rect(rect.to_box2d(), debug_colors::PURPLE, debug_colors::PURPLE);
} }
} }
} }

Просмотреть файл

@ -4,7 +4,7 @@
#![deny(missing_docs)] #![deny(missing_docs)]
use euclid::{size2, Rect, num::Zero}; use euclid::{size2, Box2D, num::Zero};
use peek_poke::PeekPoke; use peek_poke::PeekPoke;
use std::ops::{Add, Sub}; use std::ops::{Add, Sub};
use std::sync::Arc; use std::sync::Arc;
@ -296,7 +296,7 @@ impl ImageDescriptor {
/// Computes the bounding rectangle for the image, rooted at (0, 0). /// Computes the bounding rectangle for the image, rooted at (0, 0).
pub fn full_rect(&self) -> DeviceIntRect { pub fn full_rect(&self) -> DeviceIntRect {
DeviceIntRect::new( DeviceIntRect::from_origin_and_size(
DeviceIntPoint::zero(), DeviceIntPoint::zero(),
self.size, self.size,
) )
@ -439,13 +439,13 @@ pub struct BlobImageParams {
/// The possible states of a Dirty rect. /// The possible states of a Dirty rect.
/// ///
/// This exists because people kept getting confused with `Option<Rect>`. /// This exists because people kept getting confused with `Option<Box2D>`.
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub enum DirtyRect<T: Copy, U> { pub enum DirtyRect<T: Copy, U> {
/// Everything is Dirty, equivalent to Partial(image_bounds) /// Everything is Dirty, equivalent to Partial(image_bounds)
All, All,
/// Some specific amount is dirty /// Some specific amount is dirty
Partial(Rect<T, U>) Partial(Box2D<T, U>)
} }
impl<T, U> DirtyRect<T, U> impl<T, U> DirtyRect<T, U>
@ -458,7 +458,7 @@ where
{ {
/// Creates an empty DirtyRect (indicating nothing is invalid) /// Creates an empty DirtyRect (indicating nothing is invalid)
pub fn empty() -> Self { pub fn empty() -> Self {
DirtyRect::Partial(Rect::zero()) DirtyRect::Partial(Box2D::zero())
} }
/// Returns whether the dirty rect is empty /// Returns whether the dirty rect is empty
@ -476,7 +476,7 @@ where
/// Maps over the contents of Partial. /// Maps over the contents of Partial.
pub fn map<F>(self, func: F) -> Self pub fn map<F>(self, func: F) -> Self
where F: FnOnce(Rect<T, U>) -> Rect<T, U>, where F: FnOnce(Box2D<T, U>) -> Box2D<T, U>,
{ {
use crate::DirtyRect::*; use crate::DirtyRect::*;
@ -503,19 +503,19 @@ where
match (*self, *other) { match (*self, *other) {
(All, rect) | (rect, All) => rect, (All, rect) | (rect, All) => rect,
(Partial(rect1), Partial(rect2)) => { (Partial(rect1), Partial(rect2)) => {
Partial(rect1.intersection(&rect2).unwrap_or_else(Rect::zero)) Partial(rect1.intersection(&rect2).unwrap_or_else(Box2D::zero))
} }
} }
} }
/// Converts the dirty rect into a subrect of the given one via intersection. /// Converts the dirty rect into a subrect of the given one via intersection.
pub fn to_subrect_of(&self, rect: &Rect<T, U>) -> Rect<T, U> { pub fn to_subrect_of(&self, rect: &Box2D<T, U>) -> Box2D<T, U> {
use crate::DirtyRect::*; use crate::DirtyRect::*;
match *self { match *self {
All => *rect, All => *rect,
Partial(dirty_rect) => { Partial(dirty_rect) => {
dirty_rect.intersection(rect).unwrap_or_else(Rect::zero) dirty_rect.intersection(rect).unwrap_or_else(Box2D::zero)
} }
} }
} }
@ -526,8 +526,8 @@ impl<T: Copy, U> Clone for DirtyRect<T, U> {
fn clone(&self) -> Self { *self } fn clone(&self) -> Self { *self }
} }
impl<T: Copy, U> From<Rect<T, U>> for DirtyRect<T, U> { impl<T: Copy, U> From<Box2D<T, U>> for DirtyRect<T, U> {
fn from(rect: Rect<T, U>) -> Self { fn from(rect: Box2D<T, U>) -> Self {
DirtyRect::Partial(rect) DirtyRect::Partial(rect)
} }
} }

Просмотреть файл

@ -25,13 +25,13 @@ use crate::image::DirtyRect;
#[derive(Hash, Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)] #[derive(Hash, Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)]
pub struct DevicePixel; pub struct DevicePixel;
pub type DeviceIntRect = Rect<i32, DevicePixel>; pub type DeviceIntRect = Box2D<i32, DevicePixel>;
pub type DeviceIntPoint = Point2D<i32, DevicePixel>; pub type DeviceIntPoint = Point2D<i32, DevicePixel>;
pub type DeviceIntSize = Size2D<i32, DevicePixel>; pub type DeviceIntSize = Size2D<i32, DevicePixel>;
pub type DeviceIntLength = Length<i32, DevicePixel>; pub type DeviceIntLength = Length<i32, DevicePixel>;
pub type DeviceIntSideOffsets = SideOffsets2D<i32, DevicePixel>; pub type DeviceIntSideOffsets = SideOffsets2D<i32, DevicePixel>;
pub type DeviceRect = Rect<f32, DevicePixel>; pub type DeviceRect = Box2D<f32, DevicePixel>;
pub type DeviceBox2D = Box2D<f32, DevicePixel>; pub type DeviceBox2D = Box2D<f32, DevicePixel>;
pub type DevicePoint = Point2D<f32, DevicePixel>; pub type DevicePoint = Point2D<f32, DevicePixel>;
pub type DeviceVector2D = Vector2D<f32, DevicePixel>; pub type DeviceVector2D = Vector2D<f32, DevicePixel>;
@ -45,7 +45,7 @@ pub struct FramebufferPixel;
pub type FramebufferIntPoint = Point2D<i32, FramebufferPixel>; pub type FramebufferIntPoint = Point2D<i32, FramebufferPixel>;
pub type FramebufferIntSize = Size2D<i32, FramebufferPixel>; pub type FramebufferIntSize = Size2D<i32, FramebufferPixel>;
pub type FramebufferIntRect = Rect<i32, FramebufferPixel>; pub type FramebufferIntRect = Box2D<i32, FramebufferPixel>;
/// Geometry in the coordinate system of a Picture (intermediate /// Geometry in the coordinate system of a Picture (intermediate
/// surface) in physical pixels. /// surface) in physical pixels.
@ -179,8 +179,8 @@ impl TexelRect {
impl Into<TexelRect> for DeviceIntRect { impl Into<TexelRect> for DeviceIntRect {
fn into(self) -> TexelRect { fn into(self) -> TexelRect {
TexelRect { TexelRect {
uv0: self.min().to_f32(), uv0: self.min.to_f32(),
uv1: self.max().to_f32(), uv1: self.max.to_f32(),
} }
} }
} }

Просмотреть файл

@ -51,15 +51,15 @@ fn render_blob(
// make sense for the rendered content to depend on its tile. // make sense for the rendered content to depend on its tile.
let tile_checker = (tile.x % 2 == 0) != (tile.y % 2 == 0); let tile_checker = (tile.x % 2 == 0) != (tile.y % 2 == 0);
let dirty_rect = dirty_rect.to_subrect_of(&descriptor.rect); let dirty_rect = dirty_rect.to_subrect_of(&descriptor.rect.to_box2d());
// We want the dirty rect local to the tile rather than the whole image. // We want the dirty rect local to the tile rather than the whole image.
let tx: BlobToDeviceTranslation = (-descriptor.rect.origin.to_vector()).into(); let tx: BlobToDeviceTranslation = (-descriptor.rect.origin.to_vector()).into();
let rasterized_rect = tx.transform_rect(&dirty_rect); let rasterized_rect = tx.transform_box(&dirty_rect);
for y in rasterized_rect.min_y() .. rasterized_rect.max_y() { for y in rasterized_rect.min.y .. rasterized_rect.max.y {
for x in rasterized_rect.min_x() .. rasterized_rect.max_x() { for x in rasterized_rect.min.x .. rasterized_rect.max.x {
// Apply the tile's offset. This is important: all drawing commands should be // Apply the tile's offset. This is important: all drawing commands should be
// translated by this offset to give correct results with tiled blob images. // translated by this offset to give correct results with tiled blob images.
let x2 = x + descriptor.rect.origin.x; let x2 = x + descriptor.rect.origin.x;

Просмотреть файл

@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use euclid::{point2, size2, rect}; use euclid::{point2, size2, rect, Box2D};
use std::sync::Arc; use std::sync::Arc;
use std::sync::atomic::{AtomicIsize, Ordering}; use std::sync::atomic::{AtomicIsize, Ordering};
use std::sync::mpsc::Receiver; use std::sync::mpsc::Receiver;
@ -238,7 +238,7 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(151, 56, ImageFormat::BGRA8, ImageDescriptorFlags::IS_OPAQUE), ImageDescriptor::new(151, 56, ImageFormat::BGRA8, ImageDescriptorFlags::IS_OPAQUE),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
rect(0, 0, 151, 56), DeviceIntRect::from_size(DeviceIntSize::new(151, 56)),
Some(128), Some(128),
); );
@ -279,7 +279,7 @@ impl<'a> RawtestHarness<'a> {
let test_size = FramebufferIntSize::new(800, 800); let test_size = FramebufferIntSize::new(800, 800);
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
FramebufferIntPoint::new(0, window_size.height - test_size.height), FramebufferIntPoint::new(0, window_size.height - test_size.height),
test_size, test_size,
); );
@ -293,7 +293,7 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(15000, 15000, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(15000, 15000, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
rect(0, 0, 15000, 15000), DeviceIntRect::from_size(DeviceIntSize::new(15000, 15000)),
Some(100), Some(100),
); );
@ -344,8 +344,8 @@ impl<'a> RawtestHarness<'a> {
//png::save_flipped("out.png", pixels.clone(), size2(window_rect.size.width, window_rect.size.height)); //png::save_flipped("out.png", pixels.clone(), size2(window_rect.size.width, window_rect.size.height));
// make sure things are in the right spot // make sure things are in the right spot
let w = window_rect.size.width as usize; let w = window_rect.width() as usize;
let h = window_rect.size.height as usize; let h = window_rect.height() as usize;
let p1 = (40 + (h - 100) * w) * 4; let p1 = (40 + (h - 100) * w) * 4;
assert_eq!(pixels[p1 + 0], 50); assert_eq!(pixels[p1 + 0], 50);
assert_eq!(pixels[p1 + 1], 50); assert_eq!(pixels[p1 + 1], 50);
@ -366,7 +366,7 @@ impl<'a> RawtestHarness<'a> {
let window_size = self.window.get_inner_size(); let window_size = self.window.get_inner_size();
let test_size = FramebufferIntSize::new(800, 800); let test_size = FramebufferIntSize::new(800, 800);
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
FramebufferIntPoint::new(0, window_size.height - test_size.height), FramebufferIntPoint::new(0, window_size.height - test_size.height),
test_size, test_size,
); );
@ -379,8 +379,8 @@ impl<'a> RawtestHarness<'a> {
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
DeviceIntRect { DeviceIntRect {
origin: point2(50, 20), min: point2(50, 20),
size: size2(400, 400), max: point2(450, 420),
}, },
Some(100), Some(100),
); );
@ -423,8 +423,8 @@ impl<'a> RawtestHarness<'a> {
// make sure things are in the right spot // make sure things are in the right spot
let w = window_rect.size.width as usize; let w = window_rect.width() as usize;
let h = window_rect.size.height as usize; let h = window_rect.height() as usize;
let p1 = (65 + (h - 15) * w) * 4; let p1 = (65 + (h - 15) * w) * 4;
assert_eq!(pixels[p1 + 0], 255); assert_eq!(pixels[p1 + 0], 255);
assert_eq!(pixels[p1 + 1], 255); assert_eq!(pixels[p1 + 1], 255);
@ -460,7 +460,7 @@ impl<'a> RawtestHarness<'a> {
let window_size = self.window.get_inner_size(); let window_size = self.window.get_inner_size();
let test_size = FramebufferIntSize::new(800, 800); let test_size = FramebufferIntSize::new(800, 800);
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
FramebufferIntPoint::new(0, window_size.height - test_size.height), FramebufferIntPoint::new(0, window_size.height - test_size.height),
test_size, test_size,
); );
@ -473,8 +473,8 @@ impl<'a> RawtestHarness<'a> {
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
DeviceIntRect { DeviceIntRect {
origin: point2(0, 0), min: point2(0, 0),
size: size2(500, 500), max: point2(500, 500),
}, },
Some(128), Some(128),
); );
@ -519,8 +519,8 @@ impl<'a> RawtestHarness<'a> {
let mut txn = Transaction::new(); let mut txn = Transaction::new();
txn.set_blob_image_visible_area(blob_img, DeviceIntRect { txn.set_blob_image_visible_area(blob_img, DeviceIntRect {
origin: point2(50, 50), min: point2(50, 50),
size: size2(400, 400), max: point2(450, 450),
}); });
let mut builder = DisplayListBuilder::new(self.wrench.root_pipeline_id); let mut builder = DisplayListBuilder::new(self.wrench.root_pipeline_id);
@ -563,8 +563,8 @@ impl<'a> RawtestHarness<'a> {
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
DeviceIntRect { DeviceIntRect {
origin: point2(50, 50), min: point2(50, 50),
size: size2(400, 400), max: point2(450, 450),
}, },
Some(128), Some(128),
); );
@ -614,7 +614,7 @@ impl<'a> RawtestHarness<'a> {
let window_size = self.window.get_inner_size(); let window_size = self.window.get_inner_size();
let test_size = FramebufferIntSize::new(800, 800); let test_size = FramebufferIntSize::new(800, 800);
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
point2(0, window_size.height - test_size.height), point2(0, window_size.height - test_size.height),
test_size, test_size,
); );
@ -628,7 +628,7 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(1510, 1510, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(1510, 1510, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
rect(0, 0, 1510, 1510), DeviceIntRect::from_size(size2(1510, 1510)),
None, None,
); );
@ -686,8 +686,8 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(1510, 1510, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(1510, 1510, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
rect(0, 0, 1510, 1510), DeviceIntRect::from_size(size2(1510, 1510)),
&rect(10, 10, 100, 100).into(), &Box2D { min: point2(10, 10), max: point2(110, 110) }.into(),
); );
let mut builder = DisplayListBuilder::new(self.wrench.root_pipeline_id); let mut builder = DisplayListBuilder::new(self.wrench.root_pipeline_id);
@ -714,7 +714,7 @@ impl<'a> RawtestHarness<'a> {
let pixels = self.render_and_get_pixels(window_rect); let pixels = self.render_and_get_pixels(window_rect);
self.compare_pixels(original_pixels, pixels, window_rect.size); self.compare_pixels(original_pixels, pixels, window_rect.size());
// Leaving a tiled blob image in the resource cache // Leaving a tiled blob image in the resource cache
// confuses the `test_capture`. TODO: remove this // confuses the `test_capture`. TODO: remove this
@ -729,7 +729,7 @@ impl<'a> RawtestHarness<'a> {
let window_size = self.window.get_inner_size(); let window_size = self.window.get_inner_size();
let test_size = FramebufferIntSize::new(400, 400); let test_size = FramebufferIntSize::new(400, 400);
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
FramebufferIntPoint::new(0, window_size.height - test_size.height), FramebufferIntPoint::new(0, window_size.height - test_size.height),
test_size, test_size,
); );
@ -744,7 +744,7 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
rect(0, 0, 500, 500), DeviceIntRect::from_size(size2(500, 500)),
None, None,
); );
} }
@ -816,7 +816,7 @@ impl<'a> RawtestHarness<'a> {
let window_size = self.window.get_inner_size(); let window_size = self.window.get_inner_size();
let test_size = FramebufferIntSize::new(400, 400); let test_size = FramebufferIntSize::new(400, 400);
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
point2(0, window_size.height - test_size.height), point2(0, window_size.height - test_size.height),
test_size, test_size,
); );
@ -831,7 +831,7 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
rect(0, 0, 500, 500), DeviceIntRect::from_size(size2(500, 500)),
None, None,
); );
blob_img2 = api.generate_blob_image_key(); blob_img2 = api.generate_blob_image_key();
@ -839,7 +839,7 @@ impl<'a> RawtestHarness<'a> {
blob_img2, blob_img2,
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(80, 50, 150, 255)), blob::serialize_blob(ColorU::new(80, 50, 150, 255)),
rect(0, 0, 500, 500), DeviceIntRect::from_size(size2(500, 500)),
None, None,
); );
(blob_img, blob_img2) (blob_img, blob_img2)
@ -899,15 +899,15 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
rect(0, 0, 500, 500), DeviceIntRect::from_size(size2(500, 500)),
&rect(100, 100, 100, 100).into(), &Box2D { min: point2(100, 100), max: point2(200, 200) }.into(),
); );
txn.update_blob_image( txn.update_blob_image(
blob_img2, blob_img2,
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(59, 50, 150, 255)), blob::serialize_blob(ColorU::new(59, 50, 150, 255)),
rect(0, 0, 500, 500), DeviceIntRect::from_size(size2(500, 500)),
&rect(100, 100, 100, 100).into(), &Box2D { min: point2(100, 100), max: point2(200, 200) }.into(),
); );
let mut builder = DisplayListBuilder::new(self.wrench.root_pipeline_id); let mut builder = DisplayListBuilder::new(self.wrench.root_pipeline_id);
@ -921,8 +921,8 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 150, 150, 255)), blob::serialize_blob(ColorU::new(50, 150, 150, 255)),
rect(0, 0, 500, 500), DeviceIntRect::from_size(size2(500, 500)),
&rect(200, 200, 100, 100).into(), &Box2D { min: point2(200, 200), max: point2(300, 300) }.into(),
); );
let mut builder = DisplayListBuilder::new(self.wrench.root_pipeline_id); let mut builder = DisplayListBuilder::new(self.wrench.root_pipeline_id);
@ -944,7 +944,7 @@ impl<'a> RawtestHarness<'a> {
let window_size = self.window.get_inner_size(); let window_size = self.window.get_inner_size();
let test_size = FramebufferIntSize::new(400, 400); let test_size = FramebufferIntSize::new(400, 400);
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
point2(0, window_size.height - test_size.height), point2(0, window_size.height - test_size.height),
test_size, test_size,
); );
@ -957,7 +957,7 @@ impl<'a> RawtestHarness<'a> {
img, img,
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
rect(0, 0, 500, 500), DeviceIntRect::from_size(size2(500, 500)),
None, None,
); );
img img
@ -987,8 +987,8 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 50, 150, 255)), blob::serialize_blob(ColorU::new(50, 50, 150, 255)),
rect(0, 0, 500, 500), DeviceIntRect::from_size(size2(500, 500)),
&rect(100, 100, 100, 100).into(), &Box2D { min: point2(100, 100), max: point2(200, 200) }.into(),
); );
// make a new display list that refers to the first image // make a new display list that refers to the first image
@ -1012,8 +1012,8 @@ impl<'a> RawtestHarness<'a> {
blob_img, blob_img,
ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()), ImageDescriptor::new(500, 500, ImageFormat::BGRA8, ImageDescriptorFlags::empty()),
blob::serialize_blob(ColorU::new(50, 150, 150, 255)), blob::serialize_blob(ColorU::new(50, 150, 150, 255)),
rect(0, 0, 500, 500), DeviceIntRect::from_size(size2(500, 500)),
&rect(200, 200, 100, 100).into(), &Box2D { min: point2(200, 200), max: point2(300, 300) }.into(),
); );
// make a new display list that refers to the first image // make a new display list that refers to the first image
@ -1032,7 +1032,7 @@ impl<'a> RawtestHarness<'a> {
let pixels_third = self.render_and_get_pixels(window_rect); let pixels_third = self.render_and_get_pixels(window_rect);
assert!(pixels_first != pixels_third); assert!(pixels_first != pixels_third);
self.compare_pixels(pixels_first, pixels_second, window_rect.size); self.compare_pixels(pixels_first, pixels_second, window_rect.size());
} }
// Ensures that content doing a save-restore produces the same results as not // Ensures that content doing a save-restore produces the same results as not
@ -1041,7 +1041,7 @@ impl<'a> RawtestHarness<'a> {
let window_size = self.window.get_inner_size(); let window_size = self.window.get_inner_size();
let test_size = FramebufferIntSize::new(400, 400); let test_size = FramebufferIntSize::new(400, 400);
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
point2(0, window_size.height - test_size.height), point2(0, window_size.height - test_size.height),
test_size, test_size,
); );
@ -1134,7 +1134,7 @@ impl<'a> RawtestHarness<'a> {
let first = do_test(false); let first = do_test(false);
let second = do_test(true); let second = do_test(true);
self.compare_pixels(first, second, window_rect.size); self.compare_pixels(first, second, window_rect.size());
} }
// regression test for #2769 // regression test for #2769
@ -1144,7 +1144,7 @@ impl<'a> RawtestHarness<'a> {
let window_size = self.window.get_inner_size(); let window_size = self.window.get_inner_size();
let test_size = FramebufferIntSize::new(400, 400); let test_size = FramebufferIntSize::new(400, 400);
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
point2(0, window_size.height - test_size.height), point2(0, window_size.height - test_size.height),
test_size, test_size,
); );
@ -1194,7 +1194,7 @@ impl<'a> RawtestHarness<'a> {
let path = "../captures/test"; let path = "../captures/test";
let layout_size = LayoutSize::new(400., 400.); let layout_size = LayoutSize::new(400., 400.);
let dim = self.window.get_inner_size(); let dim = self.window.get_inner_size();
let window_rect = FramebufferIntRect::new( let window_rect = FramebufferIntRect::from_origin_and_size(
point2(0, dim.height - layout_size.height as i32), point2(0, dim.height - layout_size.height as i32),
size2(layout_size.width as i32, layout_size.height as i32), size2(layout_size.width as i32, layout_size.height as i32),
); );
@ -1261,7 +1261,7 @@ impl<'a> RawtestHarness<'a> {
// 5. render the built frame and compare // 5. render the built frame and compare
let pixels1 = self.render_and_get_pixels(window_rect); let pixels1 = self.render_and_get_pixels(window_rect);
self.compare_pixels(pixels0.clone(), pixels1, window_rect.size); self.compare_pixels(pixels0.clone(), pixels1, window_rect.size());
// 6. rebuild the scene and compare again // 6. rebuild the scene and compare again
let mut txn = Transaction::new(); let mut txn = Transaction::new();
@ -1269,7 +1269,7 @@ impl<'a> RawtestHarness<'a> {
txn.generate_frame(0); txn.generate_frame(0);
self.wrench.api.send_transaction(captured.document_id, txn); self.wrench.api.send_transaction(captured.document_id, txn);
let pixels2 = self.render_and_get_pixels(window_rect); let pixels2 = self.render_and_get_pixels(window_rect);
self.compare_pixels(pixels0, pixels2, window_rect.size); self.compare_pixels(pixels0, pixels2, window_rect.size());
} }
fn test_zero_height_window(&mut self) { fn test_zero_height_window(&mut self) {

Просмотреть файл

@ -966,7 +966,7 @@ impl<'a> ReftestHarness<'a> {
); );
// taking the bottom left sub-rectangle // taking the bottom left sub-rectangle
let rect = FramebufferIntRect::new( let rect = FramebufferIntRect::from_origin_and_size(
FramebufferIntPoint::new(0, window_size.height - size.height), FramebufferIntPoint::new(0, window_size.height - size.height),
FramebufferIntSize::new(size.width, size.height), FramebufferIntSize::new(size.width, size.height),
); );