Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit e531d8a

Browse files
committed
Reflect vertex buffer size in pictures
1 parent 787c235 commit e531d8a

File tree

6 files changed

+60
-18
lines changed

6 files changed

+60
-18
lines changed

lib/ui/painting/canvas.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ void Canvas::drawImage(const CanvasImage* image,
293293
if (!image)
294294
Dart_ThrowException(
295295
ToDart("Canvas.drawImage called with non-genuine Image."));
296-
image_allocation_size_ += image->GetAllocationSize();
296+
external_allocation_size_ += image->GetAllocationSize();
297297
canvas_->drawImage(image->image(), x, y, paint.paint());
298298
}
299299

@@ -315,7 +315,7 @@ void Canvas::drawImageRect(const CanvasImage* image,
315315
ToDart("Canvas.drawImageRect called with non-genuine Image."));
316316
SkRect src = SkRect::MakeLTRB(src_left, src_top, src_right, src_bottom);
317317
SkRect dst = SkRect::MakeLTRB(dst_left, dst_top, dst_right, dst_bottom);
318-
image_allocation_size_ += image->GetAllocationSize();
318+
external_allocation_size_ += image->GetAllocationSize();
319319
canvas_->drawImageRect(image->image(), src, dst, paint.paint(),
320320
SkCanvas::kFast_SrcRectConstraint);
321321
}
@@ -341,7 +341,7 @@ void Canvas::drawImageNine(const CanvasImage* image,
341341
SkIRect icenter;
342342
center.round(&icenter);
343343
SkRect dst = SkRect::MakeLTRB(dst_left, dst_top, dst_right, dst_bottom);
344-
image_allocation_size_ += image->GetAllocationSize();
344+
external_allocation_size_ += image->GetAllocationSize();
345345
canvas_->drawImageNine(image->image(), icenter, dst, paint.paint());
346346
}
347347

@@ -351,7 +351,7 @@ void Canvas::drawPicture(Picture* picture) {
351351
if (!picture)
352352
Dart_ThrowException(
353353
ToDart("Canvas.drawPicture called with non-genuine Picture."));
354-
image_allocation_size_ += picture->GetAllocationSize();
354+
external_allocation_size_ += picture->GetAllocationSize();
355355
canvas_->drawPicture(picture->picture().get());
356356
}
357357

@@ -380,7 +380,7 @@ void Canvas::drawVertices(const Vertices* vertices,
380380
if (!vertices)
381381
Dart_ThrowException(
382382
ToDart("Canvas.drawVertices called with non-genuine Vertices."));
383-
383+
external_allocation_size_ += vertices->GetAllocationSize();
384384
canvas_->drawVertices(vertices->vertices(), blend_mode, *paint.paint());
385385
}
386386

@@ -406,7 +406,7 @@ void Canvas::drawAtlas(const Paint& paint,
406406
static_assert(sizeof(SkRect) == sizeof(float) * 4,
407407
"SkRect doesn't use floats.");
408408

409-
image_allocation_size_ += atlas->GetAllocationSize();
409+
external_allocation_size_ += atlas->GetAllocationSize();
410410
canvas_->drawAtlas(
411411
skImage.get(), reinterpret_cast<const SkRSXform*>(transforms.data()),
412412
reinterpret_cast<const SkRect*>(rects.data()),

lib/ui/painting/canvas.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ class Canvas : public RefCountedDartWrappable<Canvas> {
170170

171171
static void RegisterNatives(tonic::DartLibraryNatives* natives);
172172

173-
size_t image_allocation_size() const { return image_allocation_size_; }
173+
size_t external_allocation_size() const { return external_allocation_size_; }
174174

175175
private:
176176
explicit Canvas(SkCanvas* canvas);
@@ -179,7 +179,7 @@ class Canvas : public RefCountedDartWrappable<Canvas> {
179179
// which does not transfer ownership. For this reason, we hold a raw
180180
// pointer and manually set to null in Clear.
181181
SkCanvas* canvas_;
182-
size_t image_allocation_size_ = 0;
182+
size_t external_allocation_size_ = 0;
183183
};
184184

185185
} // namespace flutter

lib/ui/painting/picture.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,18 @@ DART_BIND_ALL(Picture, FOR_EACH_BINDING)
2828

2929
fml::RefPtr<Picture> Picture::Create(Dart_Handle dart_handle,
3030
flutter::SkiaGPUObject<SkPicture> picture,
31-
size_t image_allocation_size) {
31+
size_t external_allocation_size) {
3232
auto canvas_picture =
33-
fml::MakeRefCounted<Picture>(std::move(picture), image_allocation_size);
33+
fml::MakeRefCounted<Picture>(std::move(picture), external_allocation_size);
3434

3535
canvas_picture->AssociateWithDartWrapper(dart_handle);
3636
return canvas_picture;
3737
}
3838

3939
Picture::Picture(flutter::SkiaGPUObject<SkPicture> picture,
40-
size_t image_allocation_size)
40+
size_t external_allocation_size)
4141
: picture_(std::move(picture)),
42-
image_allocation_size_(image_allocation_size) {}
42+
external_allocation_size_(external_allocation_size) {}
4343

4444
Picture::~Picture() = default;
4545

@@ -61,7 +61,7 @@ void Picture::dispose() {
6161
size_t Picture::GetAllocationSize() const {
6262
if (auto picture = picture_.get()) {
6363
return picture->approximateBytesUsed() + sizeof(Picture) +
64-
image_allocation_size_;
64+
external_allocation_size_;
6565
} else {
6666
return sizeof(Picture);
6767
}

lib/ui/painting/picture.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class Picture : public RefCountedDartWrappable<Picture> {
2626
~Picture() override;
2727
static fml::RefPtr<Picture> Create(Dart_Handle dart_handle,
2828
flutter::SkiaGPUObject<SkPicture> picture,
29-
size_t image_allocation_size);
29+
size_t external_allocation_size);
3030

3131
sk_sp<SkPicture> picture() const { return picture_.get(); }
3232

@@ -45,14 +45,14 @@ class Picture : public RefCountedDartWrappable<Picture> {
4545
uint32_t height,
4646
Dart_Handle raw_image_callback);
4747

48-
size_t image_allocation_size() const { return image_allocation_size_; }
48+
size_t external_allocation_size() const { return external_allocation_size_; }
4949

5050
private:
5151
Picture(flutter::SkiaGPUObject<SkPicture> picture,
52-
size_t image_allocation_size_);
52+
size_t external_allocation_size_);
5353

5454
flutter::SkiaGPUObject<SkPicture> picture_;
55-
size_t image_allocation_size_;
55+
size_t external_allocation_size_;
5656
};
5757

5858
} // namespace flutter

lib/ui/painting/picture_recorder.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ fml::RefPtr<Picture> PictureRecorder::endRecording(Dart_Handle dart_picture) {
5656
Picture::Create(dart_picture,
5757
UIDartState::CreateGPUObject(
5858
picture_recorder_.finishRecordingAsPicture()),
59-
canvas_->image_allocation_size());
59+
canvas_->external_allocation_size());
6060

6161
canvas_->Clear();
6262
canvas_->ClearDartWrapper();

testing/dart/canvas_test.dart

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,46 @@ void main() {
245245

246246
expect(picture2.approximateBytesUsed, greaterThan(minimumExpected));
247247
});
248+
249+
test('Vertex buffer size reflected in picture size for drawVertices', () async {
250+
final Image image = await createImage(100, 100);
251+
final PictureRecorder recorder = PictureRecorder();
252+
final Canvas canvas = Canvas(recorder);
253+
254+
const int uint16max = 65535;
255+
256+
final Int32List colors = Int32List(uint16max);
257+
final Float32List coords = Float32List(uint16max * 2);
258+
final Uint16List indices = Uint16List(uint16max);
259+
final Float32List positions = Float32List(uint16max * 2);
260+
colors[0] = const Color(0xFFFF0000).value;
261+
colors[1] = const Color(0xFF00FF00).value;
262+
colors[2] = const Color(0xFF0000FF).value;
263+
colors[3] = const Color(0xFF00FFFF).value;
264+
indices[1] = indices[3] = 1;
265+
indices[2] = indices[5] = 3;
266+
indices[4] = 2;
267+
positions[2] = positions[4] = positions[5] = positions[7] = 250.0;
268+
269+
final Vertices vertices = Vertices.raw(
270+
VertexMode.triangles,
271+
positions,
272+
textureCoordinates: coords,
273+
colors: colors,
274+
indices: indices,
275+
);
276+
canvas.drawVertices(vertices, BlendMode.src, Paint());
277+
final Picture picture = recorder.endRecording();
278+
279+
280+
const int minimumExpected = uint16max * 4;
281+
expect(picture.approximateBytesUsed, greaterThan(minimumExpected));
282+
283+
final PictureRecorder recorder2 = PictureRecorder();
284+
final Canvas canvas2 = Canvas(recorder2);
285+
canvas2.drawPicture(picture);
286+
final Picture picture2 = recorder2.endRecording();
287+
288+
expect(picture2.approximateBytesUsed, greaterThan(minimumExpected));
289+
});
248290
}

0 commit comments

Comments
 (0)