diff --git a/gfx/2d/DrawEventRecorder.cpp b/gfx/2d/DrawEventRecorder.cpp index d27abcbd7bff..212e1a19527d 100644 --- a/gfx/2d/DrawEventRecorder.cpp +++ b/gfx/2d/DrawEventRecorder.cpp @@ -90,8 +90,8 @@ DrawEventRecorderMemory::DrawEventRecorderMemory() { } DrawEventRecorderMemory::DrawEventRecorderMemory( - const SerializeResourcesFn& aFn) - : mSerializeCallback(aFn) { + const SerializeResourcesFn& aFn, IntPoint aOrigin) + : mSerializeCallback(aFn), mOrigin(aOrigin) { mExternalFonts = !!mSerializeCallback; WriteHeader(mOutputStream); } @@ -132,6 +132,7 @@ bool DrawEventRecorderMemory::Finish() { mIndex = MemStream(); // write out the offset of the Index to the end of the output stream WriteElement(mOutputStream, indexOffset); + WriteElement(mOutputStream, mOrigin); ClearResources(); return hasItems; } diff --git a/gfx/2d/DrawEventRecorder.h b/gfx/2d/DrawEventRecorder.h index 49bdfc97e99a..79e8f93ca848 100644 --- a/gfx/2d/DrawEventRecorder.h +++ b/gfx/2d/DrawEventRecorder.h @@ -179,7 +179,8 @@ class DrawEventRecorderMemory : public DrawEventRecorderPrivate { * Constructs a DrawEventRecorder that stores the recording in memory. */ DrawEventRecorderMemory(); - explicit DrawEventRecorderMemory(const SerializeResourcesFn& aSerialize); + explicit DrawEventRecorderMemory(const SerializeResourcesFn& aSerialize, + IntPoint aOrigin = IntPoint()); void RecordEvent(const RecordedEvent& aEvent) override; @@ -216,6 +217,7 @@ class DrawEventRecorderMemory : public DrawEventRecorderPrivate { private: SerializeResourcesFn mSerializeCallback; nsTHashtable mDependentSurfaces; + IntPoint mOrigin; void Flush() override; }; diff --git a/gfx/layers/wr/WebRenderCommandBuilder.cpp b/gfx/layers/wr/WebRenderCommandBuilder.cpp index d4ef2023384c..7fe2f202cf53 100644 --- a/gfx/layers/wr/WebRenderCommandBuilder.cpp +++ b/gfx/layers/wr/WebRenderCommandBuilder.cpp @@ -661,7 +661,8 @@ struct DIGroup { aStream.write((const char*)&font, sizeof(font)); } fonts = std::move(aScaledFonts); - }); + }, + mVisibleRect.ToUnknownRect().TopLeft()); RefPtr dummyDt = gfx::Factory::CreateDrawTarget( gfx::BackendType::SKIA, gfx::IntSize(1, 1), format); @@ -2262,7 +2263,8 @@ WebRenderCommandBuilder::GenerateFallbackData( aStream.write((const char*)&font, sizeof(font)); } fonts = std::move(aScaledFonts); - }); + }, + visibleRect.ToUnknownRect().TopLeft()); RefPtr dummyDt = gfx::Factory::CreateDrawTarget( gfx::BackendType::SKIA, gfx::IntSize(1, 1), format); RefPtr dt = gfx::Factory::CreateRecordingDrawTarget( @@ -2493,7 +2495,8 @@ Maybe WebRenderCommandBuilder::BuildWrMaskImage( } fonts = std::move(aScaledFonts); - }); + }, + IntPoint(0, 0)); RefPtr dummyDt = Factory::CreateDrawTarget( BackendType::SKIA, IntSize(1, 1), SurfaceFormat::A8); diff --git a/gfx/layers/wr/WebRenderDrawEventRecorder.h b/gfx/layers/wr/WebRenderDrawEventRecorder.h index b08ff5b959e9..3530cb5d7423 100644 --- a/gfx/layers/wr/WebRenderDrawEventRecorder.h +++ b/gfx/layers/wr/WebRenderDrawEventRecorder.h @@ -9,6 +9,7 @@ #include "mozilla/gfx/DrawEventRecorder.h" #include "mozilla/gfx/InlineTranslator.h" #include "mozilla/webrender/webrender_ffi.h" +#include "mozilla/gfx/Point.h" namespace mozilla { namespace layers { @@ -23,8 +24,8 @@ class WebRenderDrawEventRecorder final : public gfx::DrawEventRecorderMemory { MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(WebRenderDrawEventRecorder, final) explicit WebRenderDrawEventRecorder( - const gfx::SerializeResourcesFn& aSerialize) - : DrawEventRecorderMemory(aSerialize) {} + const gfx::SerializeResourcesFn& aSerialize, gfx::IntPoint aOrigin) + : DrawEventRecorderMemory(aSerialize, aOrigin) {} void StoreSourceSurfaceRecording(gfx::SourceSurface* aSurface, const char* aReason) final; diff --git a/gfx/webrender_bindings/src/moz2d_renderer.rs b/gfx/webrender_bindings/src/moz2d_renderer.rs index 3990cdd7587c..9d310bba30b3 100644 --- a/gfx/webrender_bindings/src/moz2d_renderer.rs +++ b/gfx/webrender_bindings/src/moz2d_renderer.rs @@ -172,6 +172,7 @@ struct BlobReader<'a> { reader: BufReader<'a>, /// Where the buffer head is. begin: usize, + origin: IntPoint, } #[derive(PartialEq, Debug, Eq, Clone, Copy)] @@ -202,8 +203,9 @@ impl<'a> BlobReader<'a> { let index_offset_pos = buf.len()-(mem::size_of::() + mem::size_of::()); assert!(index_offset_pos < buf.len()); let index_offset = unsafe { convert_from_bytes::(&buf[index_offset_pos..]) }; + let origin = unsafe { convert_from_bytes(&buf[(index_offset_pos + mem::size_of::())..]) }; - BlobReader { reader: BufReader::new(&buf[index_offset..index_offset_pos]), begin: 0} + BlobReader { reader: BufReader::new(&buf[index_offset..index_offset_pos]), begin: 0, origin } } /// Reads the next display item's metadata. @@ -249,12 +251,13 @@ impl BlobWriter { } /// Completes the blob image, producing a single buffer containing it. - fn finish(mut self) -> Vec { + fn finish(mut self, origin: IntPoint) -> Vec { // Append the index to the end of the buffer // and then append the offset to the beginning of the index. let index_begin = self.data.len(); self.data.extend_from_slice(&self.index); self.data.extend_from_slice(convert_to_bytes(&index_begin)); + self.data.extend_from_slice(convert_to_bytes(&origin)); self.data } } @@ -458,7 +461,7 @@ fn merge_blob_images(old_buf: &[u8], new_buf: &[u8], dirty_rect: Box2d, old_visi //assert!(old_reader.cache.is_empty()); - let result = result.finish(); + let result = result.finish(new_reader.origin); dump_index(&result); result }