1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2019 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fiddle/examples.h"
4*c8dee2aaSAndroid Build Coastguard Worker REG_FIDDLE(Bitmap_tryAllocPixels_4, 256, 100, false, 0) {
5*c8dee2aaSAndroid Build Coastguard Worker class LargePixelRef : public SkPixelRef {
6*c8dee2aaSAndroid Build Coastguard Worker public:
LargePixelRef(const SkImageInfo & info,char * storage,size_t rowBytes)7*c8dee2aaSAndroid Build Coastguard Worker LargePixelRef(const SkImageInfo& info, char* storage, size_t rowBytes)
8*c8dee2aaSAndroid Build Coastguard Worker : SkPixelRef(info.width(), info.height(), storage, rowBytes) {
9*c8dee2aaSAndroid Build Coastguard Worker }
~LargePixelRef()10*c8dee2aaSAndroid Build Coastguard Worker ~LargePixelRef() override {
11*c8dee2aaSAndroid Build Coastguard Worker delete[] (char* ) this->pixels();
12*c8dee2aaSAndroid Build Coastguard Worker }
13*c8dee2aaSAndroid Build Coastguard Worker };
14*c8dee2aaSAndroid Build Coastguard Worker class LargeAllocator : public SkBitmap::Allocator {
15*c8dee2aaSAndroid Build Coastguard Worker public:
allocPixelRef(SkBitmap * bitmap)16*c8dee2aaSAndroid Build Coastguard Worker bool allocPixelRef(SkBitmap* bitmap) override {
17*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo& info = bitmap->info();
18*c8dee2aaSAndroid Build Coastguard Worker uint64_t rowBytes = info.minRowBytes64();
19*c8dee2aaSAndroid Build Coastguard Worker uint64_t size = info.height() * rowBytes;
20*c8dee2aaSAndroid Build Coastguard Worker char* addr = new char[size];
21*c8dee2aaSAndroid Build Coastguard Worker if (nullptr == addr) {
22*c8dee2aaSAndroid Build Coastguard Worker return false;
23*c8dee2aaSAndroid Build Coastguard Worker }
24*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPixelRef> pr = sk_sp<SkPixelRef>(new LargePixelRef(info, addr, rowBytes));
25*c8dee2aaSAndroid Build Coastguard Worker if (!pr) {
26*c8dee2aaSAndroid Build Coastguard Worker return false;
27*c8dee2aaSAndroid Build Coastguard Worker }
28*c8dee2aaSAndroid Build Coastguard Worker bitmap->setPixelRef(std::move(pr), 0, 0);
29*c8dee2aaSAndroid Build Coastguard Worker return true;
30*c8dee2aaSAndroid Build Coastguard Worker }
31*c8dee2aaSAndroid Build Coastguard Worker };
32*c8dee2aaSAndroid Build Coastguard Worker
draw(SkCanvas * canvas)33*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) {
34*c8dee2aaSAndroid Build Coastguard Worker LargeAllocator largeAllocator;
35*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bitmap;
36*c8dee2aaSAndroid Build Coastguard Worker int width = 100; // make this 20000
37*c8dee2aaSAndroid Build Coastguard Worker int height = 100; // and this 100000 to allocate 8 gigs on a 64-bit platform
38*c8dee2aaSAndroid Build Coastguard Worker bitmap.setInfo(SkImageInfo::MakeN32(width, height, kOpaque_SkAlphaType));
39*c8dee2aaSAndroid Build Coastguard Worker if (bitmap.tryAllocPixels(&largeAllocator)) {
40*c8dee2aaSAndroid Build Coastguard Worker bitmap.eraseColor(0xff55aa33);
41*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(bitmap.asImage(), 0, 0);
42*c8dee2aaSAndroid Build Coastguard Worker }
43*c8dee2aaSAndroid Build Coastguard Worker }
44*c8dee2aaSAndroid Build Coastguard Worker } // END FIDDLE
45