// 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 <memory>

#include "tools/fiddle/examples.h"
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::make_unique<CustomAllocator>(), info);
    char* context = (char*) c2->accessTopRasterHandle();
    SkDebugf("context = %.4s\n", context);
}
}  // END FIDDLE
