| // 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=4486d0c0b22ad2931db130f42da4c80c | 
 | REG_FIDDLE(Canvas_accessTopRasterHandle, 256, 256, true, 0) { | 
 | static void DeleteCallback(void*, void* context) { | 
 |     delete (char*) context; | 
 | } | 
 | class CustomAllocator : public SkRasterHandleAllocator { | 
 | public: | 
 |     bool allocHandle(const SkImageInfo& info, Rec* rec) override { | 
 |         char* context = new char[4]{'s', 'k', 'i', 'a'}; | 
 |         rec->fReleaseProc = DeleteCallback; | 
 |         rec->fReleaseCtx = context; | 
 |         rec->fHandle = context; | 
 |         rec->fPixels = context; | 
 |         rec->fRowBytes = 4; | 
 |         return true; | 
 |     } | 
 |     void updateHandle(Handle handle, const SkMatrix& ctm, const SkIRect& clip_bounds) override { | 
 |         // apply canvas matrix and clip to custom environment | 
 |     } | 
 | }; | 
 |  | 
 | void draw(SkCanvas* canvas) { | 
 |     const SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1); | 
 |     std::unique_ptr<SkCanvas> c2 = | 
 |             SkRasterHandleAllocator::MakeCanvas(std::unique_ptr<CustomAllocator>( | 
 |             new CustomAllocator()), info); | 
 |     char* context = (char*) c2->accessTopRasterHandle(); | 
 |     SkDebugf("context = %.4s\n", context); | 
 | } | 
 | }  // END FIDDLE |