| // Copyright 2019 Google LLC. | 
 | // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. | 
 | #include "tools/fiddle/examples.h" | 
 | // HASH=eb6f861ca1839146d26e40d56c2a001c | 
 | REG_FIDDLE(Bitmap_tryAllocPixels_4, 256, 100, false, 0) { | 
 | class LargePixelRef : public SkPixelRef { | 
 | public: | 
 |     LargePixelRef(const SkImageInfo& info, char* storage, size_t rowBytes) | 
 |         : SkPixelRef(info.width(), info.height(), storage, rowBytes) { | 
 |     } | 
 |     ~LargePixelRef() override { | 
 |         delete[] (char* ) this->pixels(); | 
 |     } | 
 | }; | 
 | class LargeAllocator : public SkBitmap::Allocator { | 
 | public: | 
 |     bool allocPixelRef(SkBitmap* bitmap) override { | 
 |         const SkImageInfo& info = bitmap->info(); | 
 |         uint64_t rowBytes = info.minRowBytes64(); | 
 |         uint64_t size = info.height() * rowBytes; | 
 |         char* addr = new char[size]; | 
 |         if (nullptr == addr) { | 
 |             return false; | 
 |         } | 
 |         sk_sp<SkPixelRef> pr = sk_sp<SkPixelRef>(new LargePixelRef(info, addr, rowBytes)); | 
 |         if (!pr) { | 
 |             return false; | 
 |         } | 
 |         bitmap->setPixelRef(std::move(pr), 0, 0); | 
 |         return true; | 
 |     } | 
 | }; | 
 |  | 
 | void draw(SkCanvas* canvas) { | 
 |    LargeAllocator largeAllocator; | 
 |    SkBitmap bitmap; | 
 |    int width = 100; // make this 20000 | 
 |    int height = 100; // and this 100000 to allocate 8 gigs on a 64-bit platform | 
 |    bitmap.setInfo(SkImageInfo::MakeN32(width, height, kOpaque_SkAlphaType)); | 
 |    if (bitmap.tryAllocPixels(&largeAllocator)) { | 
 |        bitmap.eraseColor(0xff55aa33); | 
 |        canvas->drawImage(bitmap.asImage(), 0, 0); | 
 |    } | 
 | } | 
 | }  // END FIDDLE |