From e5563329324e09d376c34f6595a3f0ee2ea4380e Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Thu, 29 Jun 2017 14:14:33 -0700 Subject: [PATCH] Report size estimates to Dart for Image/Picture/Paragraph objects (#3840) Fixes https://github.com/flutter/flutter/issues/11007 --- lib/ui/painting/image.cc | 8 ++++++++ lib/ui/painting/image.h | 2 ++ lib/ui/painting/picture.cc | 8 ++++++++ lib/ui/painting/picture.h | 2 ++ lib/ui/text/paragraph.cc | 7 +++++++ lib/ui/text/paragraph.h | 2 ++ 6 files changed, 29 insertions(+) diff --git a/lib/ui/painting/image.cc b/lib/ui/painting/image.cc index fada87808..f94f3ff21 100644 --- a/lib/ui/painting/image.cc +++ b/lib/ui/painting/image.cc @@ -40,4 +40,12 @@ void CanvasImage::dispose() { ClearDartWrapper(); } +size_t CanvasImage::GetAllocationSize() { + if (image_) { + return image_->width() * image_->height() * 4; + } else { + return sizeof(CanvasImage); + } +} + } // namespace blink diff --git a/lib/ui/painting/image.h b/lib/ui/painting/image.h index 4600d1829..ba416cc57 100644 --- a/lib/ui/painting/image.h +++ b/lib/ui/painting/image.h @@ -32,6 +32,8 @@ class CanvasImage final : public ftl::RefCountedThreadSafe, const sk_sp& image() const { return image_; } void set_image(sk_sp image) { image_ = std::move(image); } + virtual size_t GetAllocationSize() override; + static void RegisterNatives(tonic::DartLibraryNatives* natives); private: diff --git a/lib/ui/painting/picture.cc b/lib/ui/painting/picture.cc index aaeb31a4f..6a0809e69 100644 --- a/lib/ui/painting/picture.cc +++ b/lib/ui/painting/picture.cc @@ -48,4 +48,12 @@ void Picture::dispose() { ClearDartWrapper(); } +size_t Picture::GetAllocationSize() { + if (picture_) { + return picture_->approximateBytesUsed(); + } else { + return sizeof(Picture); + } +} + } // namespace blink diff --git a/lib/ui/painting/picture.h b/lib/ui/painting/picture.h index 96e4e2d7e..a11762a84 100644 --- a/lib/ui/painting/picture.h +++ b/lib/ui/painting/picture.h @@ -31,6 +31,8 @@ class Picture : public ftl::RefCountedThreadSafe, void dispose(); + virtual size_t GetAllocationSize() override; + static void RegisterNatives(tonic::DartLibraryNatives* natives); private: diff --git a/lib/ui/text/paragraph.cc b/lib/ui/text/paragraph.cc index 9f29d3d08..9e62473cd 100644 --- a/lib/ui/text/paragraph.cc +++ b/lib/ui/text/paragraph.cc @@ -51,6 +51,13 @@ Paragraph::~Paragraph() { } } +size_t Paragraph::GetAllocationSize() { + // We don't have an accurate accounting of the paragraph's memory consumption, + // so return a fixed size to indicate that its impact is more than the size + // of the Paragraph class. + return 2000; +} + double Paragraph::width() { return firstChildBox()->width(); } diff --git a/lib/ui/text/paragraph.h b/lib/ui/text/paragraph.h index e75025b07..154f4911e 100644 --- a/lib/ui/text/paragraph.h +++ b/lib/ui/text/paragraph.h @@ -45,6 +45,8 @@ class Paragraph : public ftl::RefCountedThreadSafe, RenderView* renderView() const { return m_renderView.get(); } + virtual size_t GetAllocationSize() override; + static void RegisterNatives(tonic::DartLibraryNatives* natives); private: -- GitLab