xref: /aosp_15_r20/external/skia/docs/examples/Bitmap_tryAllocPixels_4.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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