blob: 5f2966a3e428a5c0cd3a834c4e9449af99f9b712 [file] [log] [blame]
/*
* Copyright 2024 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkCanvas.h"
#include "include/core/SkRRect.h"
#include "include/core/SkRect.h"
#include "include/core/SkStream.h"
#include "include/core/SkSurface.h"
#include "include/gpu/GrDirectContext.h"
#include "include/gpu/ganesh/SkSurfaceGanesh.h"
#include "include/gpu/ganesh/mtl/GrMtlDirectContext.h"
#include "include/gpu/ganesh/mtl/GrMtlBackendContext.h"
#include "include/encode/SkJpegEncoder.h"
#include "metal_context_helper.h"
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <name.jpeg>\n", argv[0]);
return 1;
}
SkFILEWStream output(argv[1]);
if (!output.isValid()) {
printf("Cannot open output file %s\n", argv[1]);
return 1;
}
GrMtlBackendContext backendContext = GetMetalContext();
sk_sp<GrDirectContext> ctx = GrDirectContexts::MakeMetal(backendContext);
if (!ctx) {
printf("Could not make metal context\n");
return 1;
}
printf("Context made, now to make the surface\n");
SkImageInfo imageInfo =
SkImageInfo::Make(200, 400, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
sk_sp<SkSurface> surface =
SkSurfaces::RenderTarget(ctx.get(), skgpu::Budgeted::kYes, imageInfo);
if (!surface) {
printf("Could not make surface from Metal DirectContext\n");
return 1;
}
SkCanvas* canvas = surface->getCanvas();
canvas->clear(SK_ColorCYAN);
SkRRect rrect = SkRRect::MakeRectXY(SkRect::MakeLTRB(10, 20, 50, 70), 10, 10);
SkPaint paint;
paint.setColor(SK_ColorMAGENTA);
paint.setAntiAlias(true);
canvas->drawRRect(rrect, paint);
ctx->flush();
printf("Drew to surface, now doing readback\n");
sk_sp<SkImage> img = surface->makeImageSnapshot();
sk_sp<SkData> jpeg = SkJpegEncoder::Encode(ctx.get(), img.get(), {});
if (!jpeg) {
printf("Readback of pixels (or encoding) failed\n");
return 1;
}
output.write(jpeg->data(), jpeg->size());
output.fsync();
return 0;
}