| Index: tests/ImageTest.cpp
|
| diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
|
| index 2ec1f342b360f8f93649a34458de56165cdf4f36..603a309acfc809f5eb1395ce269caa5769326add 100644
|
| --- a/tests/ImageTest.cpp
|
| +++ b/tests/ImageTest.cpp
|
| @@ -6,6 +6,7 @@
|
| */
|
|
|
| #include <functional>
|
| +#include <initializer_list>
|
| #include "DMGpuSupport.h"
|
|
|
| #include "SkBitmap.h"
|
| @@ -67,6 +68,31 @@ static SkImage* create_image() {
|
| draw_image_test_pattern(surface->getCanvas());
|
| return surface->newImageSnapshot();
|
| }
|
| +static SkImage* create_image_565() {
|
| + const SkImageInfo info = SkImageInfo::Make(20, 20, kRGB_565_SkColorType, kOpaque_SkAlphaType);
|
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info));
|
| + draw_image_test_pattern(surface->getCanvas());
|
| + return surface->newImageSnapshot();
|
| +}
|
| +#if 0
|
| +static SkImage* create_image_ct() {
|
| + SkPMColor colors[] = {
|
| + SkPreMultiplyARGB(0xFF, 0xFF, 0xFF, 0x00),
|
| + SkPreMultiplyARGB(0x80, 0x00, 0xA0, 0xFF),
|
| + SkPreMultiplyARGB(0xFF, 0xBB, 0x00, 0xBB)
|
| + };
|
| + SkAutoTUnref<SkColorTable> colorTable(new SkColorTable(colors, SK_ARRAY_COUNT(colors)));
|
| + uint8_t data[] = {
|
| + 0, 0, 0, 0, 0,
|
| + 0, 1, 1, 1, 0,
|
| + 0, 1, 2, 1, 0,
|
| + 0, 1, 1, 1, 0,
|
| + 0, 0, 0, 0, 0
|
| + };
|
| + SkImageInfo info = SkImageInfo::Make(5, 5, kIndex_8_SkColorType, kPremul_SkAlphaType);
|
| + return SkImage::NewRasterCopy(info, data, 5, colorTable);
|
| +}
|
| +#endif
|
| static SkData* create_image_data(SkImageInfo* info) {
|
| *info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
|
| const size_t rowBytes = info->minRowBytes();
|
| @@ -737,4 +763,72 @@ DEF_GPUTEST_FOR_NATIVE_CONTEXT(SkImage_NewFromTexture, reporter, context) {
|
| refImg.reset(nullptr); // force a release of the image
|
| REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount);
|
| }
|
| +
|
| +static void check_images_same(skiatest::Reporter* reporter, const SkImage* a, const SkImage* b) {
|
| + if (a->width() != b->width() || a->height() != b->height()) {
|
| + ERRORF(reporter, "Images must have the same size");
|
| + return;
|
| + }
|
| + if (a->isOpaque() != b->isOpaque()) {
|
| + ERRORF(reporter, "Images must have the same opaquness");
|
| + return;
|
| + }
|
| +
|
| + SkImageInfo info = SkImageInfo::MakeN32Premul(a->width(), a->height());
|
| + SkAutoPixmapStorage apm;
|
| + SkAutoPixmapStorage bpm;
|
| +
|
| + apm.alloc(info);
|
| + bpm.alloc(info);
|
| +
|
| + if (!a->readPixels(apm, 0, 0)) {
|
| + ERRORF(reporter, "Could not read image a's pixels");
|
| + return;
|
| + }
|
| + if (!b->readPixels(bpm, 0, 0)) {
|
| + ERRORF(reporter, "Could not read image b's pixels");
|
| + return;
|
| + }
|
| +
|
| + for (auto y = 0; y < info.height(); ++y) {
|
| + for (auto x = 0; x < info.width(); ++x) {
|
| + uint32_t pixelA = *apm.addr32(x, y);
|
| + uint32_t pixelB = *bpm.addr32(x, y);
|
| + if (pixelA != pixelB) {
|
| + ERRORF(reporter, "Expected image pixels to be the same. At %d,%d 0x%08x != 0x%08x",
|
| + x, y, pixelA, pixelB);
|
| + return;
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +DEF_GPUTEST_FOR_RENDERING_CONTEXTS(NewTextureFromPixmap, reporter, context) {
|
| + for (auto create : {&create_image,
|
| + &create_image_565
|
| +#if 0 // peekPixels on color table images is currently broken.
|
| + , &create_image_ct
|
| +#endif
|
| + }) {
|
| + SkAutoTUnref<SkImage> image((*create)());
|
| + if (!image) {
|
| + ERRORF(reporter, "Could not create image");
|
| + return;
|
| + }
|
| +
|
| + SkPixmap pixmap;
|
| + if (!image->peekPixels(&pixmap)) {
|
| + ERRORF(reporter, "peek failed");
|
| + } else {
|
| + SkAutoTUnref<SkImage> texImage(SkImage::NewTextureFromPixmap(context, pixmap,
|
| + SkBudgeted::kNo));
|
| + if (!texImage) {
|
| + ERRORF(reporter, "NewTextureFromPixmap failed.");
|
| + } else {
|
| + check_images_same(reporter, image, texImage);
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| #endif
|
|
|