fad98562d8
This makes inspecting things in SkDebugger far more useful - any filter or other complex object on the paint is ultimately visible. You still have to do some guess work to figure out what the fields actually mean, but you can at least cross-reference with the code in flatten(). Screenshots: Before: https://screenshot.googleplex.com/a6JM5HBBe6G.png After : https://screenshot.googleplex.com/XQfr4YJ6mnH.png Changes to public API are just removals and changes to make some functions virtual. TBR=reed@google.com BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1920423002 Review-Url: https://codereview.chromium.org/1920423002
82 lines
2.9 KiB
C++
82 lines
2.9 KiB
C++
/*
|
|
* Copyright 2014 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "SkTypes.h"
|
|
#include "Test.h"
|
|
|
|
#if SK_SUPPORT_GPU
|
|
#include "GrContext.h"
|
|
#endif
|
|
#include "SkImage.h"
|
|
#include "SkSurface.h"
|
|
#include "SkReadBuffer.h"
|
|
#include "SkWriteBuffer.h"
|
|
|
|
static void test_flatten(skiatest::Reporter* reporter, const SkImageInfo& info) {
|
|
// just need a safe amount of storage, but ensure that it is 4-byte aligned.
|
|
int32_t storage[(sizeof(SkImageInfo)*2) / sizeof(int32_t)];
|
|
SkBinaryWriteBuffer wb(storage, sizeof(storage));
|
|
info.flatten(wb);
|
|
SkASSERT(wb.bytesWritten() < sizeof(storage));
|
|
|
|
SkReadBuffer rb(storage, wb.bytesWritten());
|
|
SkImageInfo info2;
|
|
|
|
// pick a noisy byte pattern, so we ensure that unflatten sets all of our fields
|
|
memset(&info2, 0xB8, sizeof(info2));
|
|
|
|
info2.unflatten(rb);
|
|
REPORTER_ASSERT(reporter, rb.offset() == wb.bytesWritten());
|
|
REPORTER_ASSERT(reporter, info == info2);
|
|
}
|
|
|
|
DEF_TEST(ImageInfo_flattening, reporter) {
|
|
for (int ct = 0; ct <= kLastEnum_SkColorType; ++ct) {
|
|
for (int at = 0; at <= kLastEnum_SkAlphaType; ++at) {
|
|
for (int pt = 0; pt <= kLastEnum_SkColorProfileType; ++pt) {
|
|
SkImageInfo info = SkImageInfo::Make(100, 200,
|
|
static_cast<SkColorType>(ct),
|
|
static_cast<SkAlphaType>(at),
|
|
static_cast<SkColorProfileType>(pt));
|
|
test_flatten(reporter, info);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void check_isopaque(skiatest::Reporter* reporter, const sk_sp<SkSurface>& surface,
|
|
bool expectedOpaque) {
|
|
sk_sp<SkImage> image(surface->makeImageSnapshot());
|
|
REPORTER_ASSERT(reporter, image->isOpaque() == expectedOpaque);
|
|
}
|
|
|
|
DEF_TEST(ImageIsOpaqueTest, reporter) {
|
|
SkImageInfo infoTransparent = SkImageInfo::MakeN32Premul(5, 5);
|
|
auto surfaceTransparent(SkSurface::MakeRaster(infoTransparent));
|
|
check_isopaque(reporter, surfaceTransparent, false);
|
|
|
|
SkImageInfo infoOpaque = SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType);
|
|
auto surfaceOpaque(SkSurface::MakeRaster(infoOpaque));
|
|
check_isopaque(reporter, surfaceOpaque, true);
|
|
}
|
|
|
|
#if SK_SUPPORT_GPU
|
|
|
|
DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(ImageIsOpaqueTest_Gpu, reporter, ctxInfo) {
|
|
GrContext* context = ctxInfo.fGrContext;
|
|
SkImageInfo infoTransparent = SkImageInfo::MakeN32Premul(5, 5);
|
|
auto surfaceTransparent(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, infoTransparent));
|
|
check_isopaque(reporter, surfaceTransparent, false);
|
|
|
|
SkImageInfo infoOpaque = SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType);
|
|
auto surfaceOpaque(SkSurface::MakeRenderTarget(context,SkBudgeted::kNo, infoOpaque));
|
|
|
|
check_isopaque(reporter, surfaceOpaque, true);
|
|
}
|
|
|
|
#endif
|