66#include <initializer_list>
201struct GpuReadPixelTestRules {
204 bool fAllowUnpremulSrc =
true;
206 bool fUncontainedRectSucceeds =
true;
208 bool fSkipSRGBCT =
false;
210 bool fSkip16BitCT =
false;
215template <
typename T>
using GpuSrcFactory =
T(
SkPixmap&);
228template <
typename T>
using GpuDstFactory =
T(
const SkImageInfo& ii);
279 static constexpr SkScalar kPos3[] = {0.f, 0.15f, 0.5f, 0.85f, 1.f};
281 (
info.width() +
info.height())/10.f,
291 const GpuReadPixelTestRules& rules,
302 auto runTest = [&](
const T&
src,
306 const bool csConversion =
308 const auto readCT = readInfo.colorType();
309 const auto readAT = readInfo.alphaType();
310 const auto srcCT = srcPixels.info().colorType();
311 const auto srcAT = srcPixels.info().alphaType();
313 const auto surfBounds =
SkIRect::MakeWH(srcPixels.width(), srcPixels.height());
317 const size_t dstRB = readBpp * readInfo.width() + 10 * readBpp;
319 const size_t dstSize = readInfo.computeByteSize(dstRB);
320 std::unique_ptr<char[]> dstData(
new char[dstSize]);
321 SkPixmap dstPixels(readInfo, dstData.get(), dstRB);
324 static constexpr auto kInitialByte =
static_cast<char>(0x1B);
337 }
else if (!rules.fUncontainedRectSucceeds && !surfBounds.contains(
rect)) {
343 "Read failed. %sSrc CT: %s, Src AT: %s Read CT: %s, Read AT: %s, "
344 "Rect [%d, %d, %d, %d], CS conversion: %d\n",
354 auto guardCheck = [](
char x) {
return x == kInitialByte; };
362 const bool lumConversion =
370 float numer = (lumConversion || csConversion) ? 3.f : 2.f;
376 float tol = (rgbBits == 0) ? 1.f : numer / ((1 << rgbBits) - 1);
379 float alphaTol = 1.f / ((1 << 10) - 1);
386 alphaTol = (alphaBits == 0) ? 1.f : 2.f / ((1 << alphaBits) - 1);
389 const float tols[4] = {tol, tol, tol, alphaTol};
390 auto error = std::function<ComparePixmapsErrorReporter>([&](
int x,
int y,
391 const float diffs[4]) {
394 "%sSrc CT: %s, Src AT: %s, Read CT: %s, Read AT: %s, Rect [%d, %d, %d, %d]"
395 ", CS conversion: %d\n"
396 "Error at %d, %d. Diff in floats: (%f, %f, %f, %f)",
401 diffs[0], diffs[1], diffs[2], diffs[3]);
414 srcPixels.rowBytes());
416 unpremulSRc.
readPixels(unpremulRef, srcReadRect.
x(), srcReadRect.
y());
418 srcPixels.readPixels(ref, srcReadRect.
x(), srcReadRect.
y());
425 const auto* v = dstData.get();
426 const auto*
end = dstData.get() + dstSize;
427 guardOk = std::all_of(v, v + dstWriteRect.
top() * dstPixels.
rowBytes(), guardCheck);
429 for (
int y = dstWriteRect.
top();
y < dstWriteRect.
bottom(); ++
y) {
430 guardOk |= std::all_of(v, v + dstWriteRect.
left() * readBpp, guardCheck);
431 auto pad = v + dstWriteRect.
right() * readBpp;
434 guardOk |= std::all_of(pad, rowEnd, guardCheck);
437 guardOk |= std::all_of(v,
end, guardCheck);
439 guardOk = std::all_of(dstData.get(), dstData.get() + dstSize, guardCheck);
443 "Result pixels modified result outside read rect [%d, %d, %d, %d]. "
444 "%sSrc CT: %s, Read CT: %s, CS conversion: %d",
452 static constexpr int kW = 16;
453 static constexpr int kH = 16;
466 std::array<bool, kLastEnum_SkColorType + 1> srcCTTestedThoroughly = {},
467 readCTTestedThoroughly = {};
478 if (rules.fSkip16BitCT &&
501 srcPixels.
alloc(srcInfo);
511 refPixels.readPixels(readPixmap, 0, 0);
514 auto src = srcFactory(srcPixels);
549 srcCTTestedThoroughly[sct] && readCTTestedThoroughly[rct]
552 for (
const auto&
rect : rects) {
554 readCT, readAT, readCS);
556 Result r = runTest(
src, srcPixels, readInfo,
offset);
558 srcCTTestedThoroughly[sct] =
true;
559 readCTTestedThoroughly[rct] =
true;
573 using Surface = std::unique_ptr<skgpu::ganesh::SurfaceContext>;
575 auto reader = std::function<GpuReadSrcFn<Surface>>(
582 const auto& caps = *direct->
priv().
caps();
584 !caps.isFormatRenderable(
surface->asSurfaceProxy()->backendFormat(), 1)) {
585 return Result::kExcusedFailure;
590 GpuReadPixelTestRules rules;
591 rules.fAllowUnpremulSrc =
true;
592 rules.fUncontainedRectSucceeds =
true;
596 auto factory = std::function<GpuSrcFactory<Surface>>(
597 [direct, origin, renderable](
const SkPixmap&
src) {
601 sc->writePixels(direct,
src, {0, 0});
605 auto label =
SkStringPrintf(
"Renderable: %d, Origin: %d", (
int)renderable, origin);
623 auto dstII = srcII.makeColorType(
colorType);
624 size_t badRowBytes = (surf->width() + 1)*bpp - 1;
625 auto storage = std::make_unique<char[]>(badRowBytes*surf->height());
642 auto srcII = dstII.makeColorType(
colorType);
643 size_t badRowBytes = (surf->width() + 1)*bpp - 1;
644 auto storage = std::make_unique<char[]>(badRowBytes*surf->height());
645 memset(storage.get(), 0, badRowBytes * surf->height());
648 !surf->getCanvas()->writePixels(srcII, storage.get(), badRowBytes, 0, 0));
654 bool fCalled =
false;
655 std::unique_ptr<const SkImage::AsyncReadResult>
fResult;
663 auto context =
static_cast<AsyncContext*
>(c);
664 context->fResult = std::move(
result);
665 context->fCalled =
true;
673 auto reader = std::function<GpuReadSrcFn<Surface>>(
675 auto direct =
surface->recordingContext()->asDirectContext();
678 AsyncContext context;
683 surface->asyncRescaleAndReadPixels(pixels.info(),
rect,
688 while (!context.fCalled) {
689 direct->checkAsyncWorkCompletion();
691 if (!context.fResult) {
694 SkRectMemcpy(pixels.writable_addr(), pixels.rowBytes(), context.fResult->data(0),
695 context.fResult->rowBytes(0), pixels.info().minRowBytes(),
699 GpuReadPixelTestRules rules;
700 rules.fAllowUnpremulSrc =
false;
701 rules.fUncontainedRectSucceeds =
false;
705 rules.fSkipSRGBCT =
true;
709 auto factory = std::function<GpuSrcFactory<Surface>>(
710 [context = ctxInfo.directContext(), origin](
const SkPixmap&
src) {
714 surf->writePixels(
src, 0, 0);
720 auto backendRTFactory = std::function<GpuSrcFactory<Surface>>(
721 [context = ctxInfo.directContext(), origin](
const SkPixmap&
src) {
727 surf->writePixels(
src, 0, 0);
743 auto reader = std::function<GpuReadSrcFn<Image>>([context](
const Image&
image,
746 AsyncContext asyncContext;
752 if (!context->priv().caps()->isFormatAsColorTypeRenderable(ct,
format)) {
753 return Result::kExcusedFailure;
762 while (!asyncContext.fCalled) {
763 context->checkAsyncWorkCompletion();
765 if (!asyncContext.fResult) {
768 SkRectMemcpy(pixels.writable_addr(), pixels.rowBytes(), asyncContext.fResult->data(0),
769 asyncContext.fResult->rowBytes(0), pixels.info().minRowBytes(),
774 GpuReadPixelTestRules rules;
775 rules.fAllowUnpremulSrc =
true;
776 rules.fUncontainedRectSucceeds =
false;
780 rules.fSkipSRGBCT =
true;
785 rules.fSkip16BitCT =
true;
788 auto factory = std::function<GpuSrcFactory<Image>>([&](
const SkPixmap&
src) {
793 auto label =
SkStringPrintf(
"Renderable: %d, Origin: %d", (
int)renderable, origin);
832 enum class ShutdownSequence {
833 kFreeResult_DestroyContext,
834 kDestroyContext_FreeResult,
835 kFreeResult_ReleaseAndAbandon_DestroyContext,
836 kFreeResult_Abandon_DestroyContext,
837 kReleaseAndAbandon_FreeResult_DestroyContext,
838 kAbandon_FreeResult_DestroyContext,
839 kReleaseAndAbandon_DestroyContext_FreeResult,
840 kAbandon_DestroyContext_FreeResult,
844 for (
auto sequence : {ShutdownSequence::kFreeResult_DestroyContext,
845 ShutdownSequence::kDestroyContext_FreeResult,
846 ShutdownSequence::kFreeResult_ReleaseAndAbandon_DestroyContext,
847 ShutdownSequence::kFreeResult_Abandon_DestroyContext,
848 ShutdownSequence::kReleaseAndAbandon_FreeResult_DestroyContext,
849 ShutdownSequence::kAbandon_FreeResult_DestroyContext,
850 ShutdownSequence::kReleaseAndAbandon_DestroyContext_FreeResult,
851 ShutdownSequence::kAbandon_DestroyContext_FreeResult}) {
855 (sequence == ShutdownSequence::kFreeResult_ReleaseAndAbandon_DestroyContext ||
856 sequence == ShutdownSequence::kFreeResult_Abandon_DestroyContext ||
857 sequence == ShutdownSequence::kReleaseAndAbandon_FreeResult_DestroyContext ||
858 sequence == ShutdownSequence::kReleaseAndAbandon_DestroyContext_FreeResult ||
859 sequence == ShutdownSequence::kAbandon_FreeResult_DestroyContext ||
860 sequence == ShutdownSequence::kAbandon_DestroyContext_FreeResult)) {
863 enum class ReadType {
870 auto direct = factory.
get(
type);
876 if (!direct->priv().caps()->transferFromSurfaceToBufferSupport()) {
883 AsyncContext cbContext;
886 surf->asyncRescaleAndReadPixels(ii, ii.bounds(),
892 surf->asyncRescaleAndReadPixelsYUV420(
898 surf->asyncRescaleAndReadPixelsYUVA420(
906 while (!cbContext.fCalled) {
907 direct->checkAsyncWorkCompletion();
909 if (!cbContext.fResult) {
910 const char* readTypeStr;
913 case ReadType::kYUV: readTypeStr =
"yuv";
break;
927 case ShutdownSequence::kFreeResult_DestroyContext:
928 case ShutdownSequence::kFreeResult_ReleaseAndAbandon_DestroyContext:
929 case ShutdownSequence::kFreeResult_Abandon_DestroyContext:
931 case ShutdownSequence::kDestroyContext_FreeResult:
934 case ShutdownSequence::kReleaseAndAbandon_FreeResult_DestroyContext:
937 case ShutdownSequence::kAbandon_FreeResult_DestroyContext:
940 case ShutdownSequence::kReleaseAndAbandon_DestroyContext_FreeResult:
944 case ShutdownSequence::kAbandon_DestroyContext_FreeResult:
949 cbContext.fResult.reset();
951 case ShutdownSequence::kFreeResult_ReleaseAndAbandon_DestroyContext:
954 case ShutdownSequence::kFreeResult_Abandon_DestroyContext:
957 case ShutdownSequence::kFreeResult_DestroyContext:
958 case ShutdownSequence::kDestroyContext_FreeResult:
959 case ShutdownSequence::kReleaseAndAbandon_FreeResult_DestroyContext:
960 case ShutdownSequence::kAbandon_FreeResult_DestroyContext:
961 case ShutdownSequence::kReleaseAndAbandon_DestroyContext_FreeResult:
962 case ShutdownSequence::kAbandon_DestroyContext_FreeResult:
976 auto runTest = [&](
const T&
dst,
980 const bool csConversion =
982 const auto writeCT = srcPixels.colorType();
983 const auto writeAT = srcPixels.alphaType();
984 const auto dstCT = dstInfo.colorType();
985 const auto dstAT = dstInfo.alphaType();
991 if (!firstReadPM.
addr()) {
996 return Result::kExcusedFailure;
1007 }
else if (
result == Result::kExcusedFailure) {
1013 "Write failed. Write CT: %s, Write AT: %s Dst CT: %s, Dst AT: %s, "
1014 "Rect [%d, %d, %d, %d], CS conversion: %d\n",
1030 if (!secondReadPM.
addr()) {
1033 "could not read from dst (CT: %s, AT: %s)\n",
1042 float tol = (rgbBits == 0) ? 1.f : 2.f / ((1 << rgbBits) - 1);
1050 alphaTol = (alphaBits == 0) ? 1.f : 2.f / ((1 << alphaBits) - 1);
1053 const float tols[4] = {tol, tol, tol, alphaTol};
1054 auto error = std::function<ComparePixmapsErrorReporter>([&](
int x,
1056 const float diffs[4]) {
1059 "Write CT: %s, Write AT: %s, Dst CT: %s, Dst AT: %s, Rect [%d, %d, %d, %d]"
1060 ", CS conversion: %d\n"
1061 "Error at %d, %d. Diff in floats: (%f, %f, %f, %f)",
1093 { 0, 0, secondReadPM.
width(), secondReadPM.
height()},
1098 for (
const auto r : borders) {
1102 auto guardError = std::function<ComparePixmapsErrorReporter>(
1103 [&](
int x,
int y,
const float diffs[4]) {
1107 "Write CT: %s, Write AT: %s, Dst CT: %s, Dst AT: %s,"
1108 "Rect [%d, %d, %d, %d], CS conversion: %d\n"
1109 "Error in guard region %d, %d. Diff in floats: (%f, %f, %f, %f)",
1129 float zeroTols[4] = {};
1136 static constexpr int kW = 16;
1137 static constexpr int kH = 16;
1150 std::array<bool, kLastEnum_SkColorType + 1> dstCTTestedThoroughly = {},
1151 writeCTTestedThoroughly = {};
1157 auto dst = dstFactory(dstInfo);
1172 const auto writeCT =
static_cast<SkColorType>(wct);
1176 const auto writeAT =
static_cast<SkAlphaType>(wat);
1182 writeCTTestedThoroughly[writeCT] &&
1193 dstCTTestedThoroughly[dct] && writeCTTestedThoroughly[wct]
1196 for (
const auto&
rect : rects) {
1207 Result r = runTest(
dst, dstInfo, writePixels,
offset);
1209 dstCTTestedThoroughly[dct] =
true;
1210 writeCTTestedThoroughly[wct] =
true;
1225 using Surface = std::unique_ptr<skgpu::ganesh::SurfaceContext>;
1227 auto writer = std::function<GpuWriteDstFn<Surface>>(
1235 auto reader = std::function<GpuReadDstFn<Surface>>([direct](
const Surface&
s) {
1237 auto grInfo =
s->imageInfo();
1241 grInfo.refColorSpace());
1243 if (!
s->readPixels(direct,
result, {0, 0})) {
1250 auto factory = std::function<GpuDstFactory<Surface>>(
1298 auto direct = ctxInfo.directContext();
1299 if (!direct->priv().caps()->mipmapSupport()) {
1302 static constexpr int kW = 25,
1326 for (
int w =
kW,
h =
kH;
w ||
h;
w/=2,
h/=2) {
1334 for (
bool unowned : {
false,
true}) {
1354 int w = levels[1].width() + 1;
1355 int h = levels[1].height();
1368 if (!sc->writePixels(direct, levels.
begin(), levels.
size())) {
1374 levels[1] = savedLevel;
1385 for (
int i = 1;
i <= 1; ++
i) {
1390 *direct->priv().caps());
1391 dstSC->asFillContext()->fillRectToRectWithFP(
1398 if (!dstSC->readPixels(direct,
read, {0, 0})) {
1404 float rgbTol = (rgbBits == 0) ? 1.f : 2.f / ((1 << rgbBits) - 1);
1406 float alphaTol = (alphaBits == 0) ? 1.f : 2.f / ((1 << alphaBits) - 1);
1407 float tol[] = {rgbTol, rgbTol, rgbTol, alphaTol};
1423 auto error = std::function<ComparePixmapsErrorReporter>(
1424 [&](
int x,
int y,
const float diffs[4]) {
1427 "CT: %s, Level %d, Unowned: %d. "
1428 "Error at %d, %d. Diff in floats:"
1430 GrColorTypeToStr(
info.colorType()),
i, unowned,
x,
y,
1431 diffs[0], diffs[1], diffs[2], diffs[3]);
1458 AsyncContext asyncContext;
1468 if (!asyncContext.fCalled) {
1471 if (!asyncContext.fResult) {
1475 SkPixmap asyncResult(
info, asyncContext.fResult->data(0), asyncContext.fResult->rowBytes(0));
1480 ctxInfo.directContext()->resetContext();
1484 syncResult.
eraseARGB(0xFF, 0xFF, 0xFF, 0xFF);
1489 auto error = std::function<ComparePixmapsErrorReporter>([&](
int x,
int y,
1490 const float diffs[4]) {
1493 "Error at %d, %d. Diff in floats: (%f, %f, %f, %f)",
1494 x,
y, diffs[0], diffs[1], diffs[2], diffs[3]);
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
SkAssertResult(font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, std::size(glyphs))==count)
bool GrConvertPixels(const GrPixmap &dst, const GrCPixmap &src, bool flipY)
static const int kGrColorTypeCnt
static constexpr SkColorType GrColorTypeToSkColorType(GrColorType ct)
static constexpr bool GrColorTypeHasAlpha(GrColorType ct)
static constexpr GrColorType SkColorTypeToGrColorType(SkColorType ct)
@ kBottomLeft_GrSurfaceOrigin
@ kTopLeft_GrSurfaceOrigin
static constexpr int alpha_channel_bits(SkColorType ct)
DEF_GANESH_TEST_FOR_GL_CONTEXT(GLReadPixelsUnbindPBO, reporter, ctxInfo, CtsEnforcement::kApiLevel_T)
static void surface_context_write_pixels(GrRenderable renderable, GrSurfaceOrigin origin, skiatest::Reporter *reporter, const sk_gpu_test::ContextInfo &ctxInfo)
DEF_GANESH_TEST_FOR_ALL_CONTEXTS(ReadPixels_InvalidRowBytes_Gpu, reporter, ctxInfo, CtsEnforcement::kApiLevel_T)
static void image_async_read_pixels(GrRenderable renderable, GrSurfaceOrigin origin, skiatest::Reporter *reporter, const sk_gpu_test::ContextInfo &ctxInfo)
static void async_callback(void *c, std::unique_ptr< const SkImage::AsyncReadResult > result)
std::vector< SkIRect > make_short_rect_array(int w, int h)
std::vector< SkIRect > make_long_rect_array(int w, int h)
static void gpu_write_pixels_test_driver(skiatest::Reporter *reporter, const std::function< GpuDstFactory< T > > &dstFactory, const std::function< GpuWriteDstFn< T > > &write, const std::function< GpuReadDstFn< T > > &read)
static constexpr int min_rgb_channel_bits(SkColorType ct)
static SkAutoPixmapStorage make_ref_data(const SkImageInfo &info, bool forceOpaque)
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(SurfaceContextReadPixels, reporter, ctxInfo, CtsEnforcement::kApiLevel_T)
DEF_GANESH_TEST(AsyncReadPixelsContextShutdown, reporter, options, CtsEnforcement::kApiLevel_T)
static void gpu_read_pixels_test_driver(skiatest::Reporter *reporter, const GpuReadPixelTestRules &rules, const std::function< GpuSrcFactory< T > > &srcFactory, const std::function< GpuReadSrcFn< T > > &read, SkString label)
SkPixmap make_pixmap_have_valid_alpha_type(SkPixmap pm)
@ kUnknown_SkAlphaType
uninitialized
@ kOpaque_SkAlphaType
pixel is opaque
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
@ kLastEnum_SkAlphaType
last valid value
@ kR16G16B16A16_unorm_SkColorType
pixel with a little endian uint16_t for red, green, blue
@ kRGBA_10x6_SkColorType
pixel with 10 used bits (most significant) followed by 6 unused
@ kBGR_101010x_SkColorType
pixel with 10 bits each for blue, green, red; in 32-bit word
@ kARGB_4444_SkColorType
pixel with 4 bits for alpha, red, green, blue; in 16-bit word
@ kR8G8_unorm_SkColorType
pixel with a uint8_t for red and green
@ kBGRA_8888_SkColorType
pixel with 8 bits for blue, green, red, alpha; in 32-bit word
@ kA16_unorm_SkColorType
pixel with a little endian uint16_t for alpha
@ kRGBA_F16_SkColorType
pixel with half floats for red, green, blue, alpha;
@ kAlpha_8_SkColorType
pixel with alpha in 8-bit byte
@ kRGB_101010x_SkColorType
pixel with 10 bits each for red, green, blue; in 32-bit word
@ kLastEnum_SkColorType
last valid value
@ kSRGBA_8888_SkColorType
@ kGray_8_SkColorType
pixel with grayscale level in 8-bit byte
@ kRGB_565_SkColorType
pixel with 5 bits red, 6 bits green, 5 bits blue, in 16-bit word
@ kBGRA_10101010_XR_SkColorType
pixel with 10 bits each for blue, green, red, alpha; in 64-bit word, extended range
@ kRGBA_8888_SkColorType
pixel with 8 bits for red, green, blue, alpha; in 32-bit word
@ kRGB_888x_SkColorType
pixel with 8 bits each for red, green, blue; in 32-bit word
@ kBGRA_1010102_SkColorType
10 bits for blue, green, red; 2 bits for alpha; in 32-bit word
@ kA16_float_SkColorType
pixel with a half float for alpha
@ kRGBA_F32_SkColorType
pixel using C float for red, green, blue, alpha; in 128-bit word
@ kRGBA_1010102_SkColorType
10 bits for red, green, blue; 2 bits for alpha; in 32-bit word
@ kBGR_101010x_XR_SkColorType
pixel with 10 bits each for blue, green, red; in 32-bit word, extended range
@ kR16G16_unorm_SkColorType
pixel with a little endian uint16_t for red and green
@ kRGBA_F16Norm_SkColorType
pixel with half floats in [0,1] for red, green, blue, alpha;
@ kUnknown_SkColorType
uninitialized
@ kR16G16_float_SkColorType
pixel with a half float for red and green
constexpr SkColor SK_ColorBLUE
constexpr SkColor SK_ColorRED
constexpr SkColor SK_ColorBLACK
constexpr SkColor SK_ColorGREEN
@ kGray_SkColorChannelFlag
constexpr SkColor SK_ColorWHITE
static bool read(SkStream *stream, void *buffer, size_t amount)
static SkColorType colorType(AImageDecoder *decoder, const AImageDecoderHeaderInfo *headerInfo)
static uint32_t SkColorTypeChannelFlags(SkColorType ct)
static bool SkColorTypeIsAlphaOnly(SkColorType ct)
SK_API int SkColorTypeBytesPerPixel(SkColorType ct)
@ kIdentity_SkYUVColorSpace
maps Y->R, U->G, V->B
SK_API bool SkColorTypeIsAlwaysOpaque(SkColorType ct)
static void SkRectMemcpy(void *dst, size_t dstRB, const void *src, size_t srcRB, size_t trimRowBytes, int rowCount)
LoopControlFlowInfo fResult
SK_API SkString SkStringPrintf(const char *format,...) SK_PRINTF_LIKE(1
Creates a new string and writes into it using a printf()-style format.
std::unique_ptr< skgpu::ganesh::SurfaceContext > CreateSurfaceContext(GrRecordingContext *rContext, const GrImageInfo &info, SkBackingFit fit, GrSurfaceOrigin origin, GrRenderable renderable, int sampleCount, skgpu::Mipmapped mipmapped, GrProtected isProtected, skgpu::Budgeted budgeted)
bool ComparePixels(const GrCPixmap &a, const GrCPixmap &b, const float tolRGBA[4], std::function< ComparePixmapsErrorReporter > &error)
#define REPORTER_ASSERT(r, cond,...)
const GrCaps * caps() const
SK_API GrBackendApi backend() const
GrDirectContextPriv priv()
GrImageInfo makeDimensions(SkISize dimensions) const
static GrPixmap Allocate(const GrImageInfo &info)
static std::unique_ptr< GrFragmentProcessor > Make(GrSurfaceProxyView, SkAlphaType, const SkMatrix &=SkMatrix::I(), GrSamplerState::Filter=GrSamplerState::Filter::kNearest, GrSamplerState::MipmapMode mipmapMode=GrSamplerState::MipmapMode::kNone)
void alloc(const SkImageInfo &)
void allocPixels(const SkImageInfo &info, size_t rowBytes)
void eraseARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) const
const SkPixmap & pixmap() const
static bool Equals(const SkColorSpace *, const SkColorSpace *)
static sk_sp< SkColorSpace > MakeSRGB()
static sk_sp< SkColorSpace > MakeSRGBLinear()
static sk_sp< SkShader > MakeRadial(const SkPoint ¢er, SkScalar radius, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
static sk_sp< SkShader > MakeLinear(const SkPoint pts[2], const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
bool readPixels(GrDirectContext *context, const SkImageInfo &dstInfo, void *dstPixels, size_t dstRowBytes, int srcX, int srcY, CachingHint cachingHint=kAllow_CachingHint) const
SkColorType colorType() const
void asyncRescaleAndReadPixels(const SkImageInfo &info, const SkIRect &srcRect, RescaleGamma rescaleGamma, RescaleMode rescaleMode, ReadPixelsCallback callback, ReadPixelsContext context) const
static const SkMatrix & I()
bool readPixels(const SkImageInfo &dstInfo, void *dstPixels, size_t dstRowBytes) const
const SkImageInfo & info() const
size_t computeByteSize() const
void * writable_addr() const
const void * addr() const
SkAlphaType alphaType() const
bool extractSubset(SkPixmap *subset, const SkIRect &area) const
void append(const char text[])
const char * c_str() const
GrDirectContext * directContext() const
skgpu::ContextType type() const
GrDirectContext * get(ContextType type, ContextOverrides overrides=ContextOverrides::kNone)
void releaseResourcesAndAbandonContexts()
const uint8_t uint32_t uint32_t GError ** error
uint32_t uint32_t * format
Dart_NativeFunction function
static float sat(float r, float g, float b)
static float max(float r, float g, float b)
static float min(float r, float g, float b)
SK_API sk_sp< SkImage > RasterFromPixmap(const SkPixmap &pixmap, RasterReleaseProc rasterReleaseProc, ReleaseContext releaseContext)
SK_API sk_sp< SkImage > TextureFromImage(GrDirectContext *, const SkImage *, skgpu::Mipmapped=skgpu::Mipmapped::kNo, skgpu::Budgeted=skgpu::Budgeted::kYes)
sk_sp< const SkImage > image
sk_sp< SkBlender > blender SkRect rect
SK_API sk_sp< SkSurface > WrapPixels(const SkImageInfo &imageInfo, void *pixels, size_t rowBytes, const SkSurfaceProps *surfaceProps=nullptr)
SK_API sk_sp< SkSurface > RenderTarget(GrRecordingContext *context, skgpu::Budgeted budgeted, const SkImageInfo &imageInfo, int sampleCount, GrSurfaceOrigin surfaceOrigin, const SkSurfaceProps *surfaceProps, bool shouldCreateWithMips=false, bool isProtected=false)
sk_sp< SkSurface > MakeBackendRenderTargetSurface(GrDirectContext *dContext, const SkImageInfo &ii, GrSurfaceOrigin origin, int sampleCnt, GrProtected isProtected, const SkSurfaceProps *props)
static const int kContextTypeCount
@ kVulkan
ANGLE on Metal ES 3 context.
const char * ContextTypeName(skgpu::ContextType type)
void write(SkWStream *wStream, const T &text)
constexpr int32_t y() const
constexpr int32_t x() const
constexpr int32_t x() const
constexpr int32_t y() const
bool intersect(const SkIRect &r)
static bool Intersects(const SkIRect &a, const SkIRect &b)
int32_t fBottom
larger y-axis bounds
constexpr int32_t top() const
static constexpr SkIRect MakeLTRB(int32_t l, int32_t t, int32_t r, int32_t b)
constexpr SkISize size() const
constexpr int32_t bottom() const
constexpr int32_t right() const
int32_t fTop
smaller y-axis bounds
static constexpr SkIRect MakeSize(const SkISize &size)
constexpr SkIRect makeOffset(int32_t dx, int32_t dy) const
static constexpr SkIRect MakeWH(int32_t w, int32_t h)
int32_t fLeft
smaller x-axis bounds
static constexpr SkIRect MakePtSize(SkIPoint pt, SkISize size)
constexpr int32_t left() const
int32_t fRight
larger x-axis bounds
SkImageInfo makeAlphaType(SkAlphaType newAlphaType) const
SkImageInfo makeDimensions(SkISize newSize) const
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)