| Index: tests/Index8Test.cpp
|
| diff --git a/tests/Index8Test.cpp b/tests/Index8Test.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..810cd81070cec67921209bd0768d8aa2afbe3def
|
| --- /dev/null
|
| +++ b/tests/Index8Test.cpp
|
| @@ -0,0 +1,93 @@
|
| +/*
|
| + * Copyright 2015 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "GrContextFactory.h"
|
| +#include "SkGr.h"
|
| +#include "SkGrPriv.h"
|
| +#include "SkConfig8888.h"
|
| +#include "Test.h"
|
| +
|
| +#if SK_SUPPORT_GPU
|
| +
|
| +static void make_index8_bitmap(SkBitmap* result, int width, int height, int ccount, bool opaque) {
|
| + SkAutoMalloc storage(ccount * sizeof(SkPMColor));
|
| + SkPMColor* palette = static_cast<SkPMColor*>(storage.get());
|
| + for (int i = 0; i < ccount; ++i) {
|
| + palette[i] = SkPreMultiplyARGB(opaque ? 0xFF : i, 0xFF - i, i, 0xFF - i);
|
| + }
|
| + result->setInfo(SkImageInfo::Make(width, height, kIndex_8_SkColorType,
|
| + opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType));
|
| + SkAutoTUnref<SkColorTable> ctable(new SkColorTable(palette, ccount));
|
| + result->allocPixels(ctable);
|
| + for (int j = 0; j < height; ++j) {
|
| + uint8_t* scanline = result->getAddr8(0, j);
|
| + int c = (j * height);
|
| + for (int i = 0; i < width; ++i)
|
| + *scanline++ = ((c++) % ccount);
|
| + }
|
| + result->setImmutable();
|
| +}
|
| +
|
| +static void compare_texture_with_bitmap(skiatest::Reporter* reporter, GrTexture* txa,
|
| + const SkBitmap& bm) {
|
| + SkAutoLockPixels alp(bm);
|
| + REPORTER_ASSERT(reporter, txa->width() == bm.width());
|
| + REPORTER_ASSERT(reporter, txa->height() == bm.height());
|
| + REPORTER_ASSERT(reporter, bm.colorType() == kN32_SkColorType);
|
| + SkAutoMalloc storage(bm.width() * bm.height() * sizeof(SkPMColor));
|
| + SkPMColor* pixels = static_cast<SkPMColor*>(storage.get());
|
| + REPORTER_ASSERT(reporter, txa->readPixels(0, 0, bm.width(), bm.height(), txa->config(),
|
| + pixels));
|
| +
|
| + SkDstPixelInfo dstPI;
|
| + dstPI.fColorType = kN32_SkColorType;
|
| + dstPI.fAlphaType = bm.alphaType();
|
| + dstPI.fPixels = pixels;
|
| + dstPI.fRowBytes = bm.width() * sizeof(SkPMColor);
|
| +
|
| + SkSrcPixelInfo srcPI;
|
| + memcpy(&srcPI, &dstPI, sizeof(SkSrcPixelInfo));
|
| + srcPI.fColorType = kRGBA_8888_SkColorType;
|
| +
|
| + srcPI.convertPixelsTo(&dstPI, bm.width(), bm.height());
|
| +
|
| + for (int j = 0; j < bm.height(); ++j) {
|
| + for (int i = 0; i < bm.width(); ++i) {
|
| + REPORTER_ASSERT(reporter, pixels[i + bm.width() * j] == *bm.getAddr32(i, j));
|
| + }
|
| + }
|
| +}
|
| +
|
| +/*
|
| + * Test two different ways to upload Index8 bitmap to texture.
|
| + */
|
| +DEF_GPUTEST(Index8_Texture_Upload, reporter, factory) {
|
| + GrContext* ctx = factory->get(GrContextFactory::kNative_GLContextType);
|
| + if (!ctx) {
|
| + REPORTER_ASSERT(reporter, false);
|
| + return;
|
| + }
|
| +
|
| + for (int opaque = 0; opaque < 2; ++opaque) {
|
| + SkBitmap bitmap;
|
| + make_index8_bitmap(&bitmap, 37, 39, 254, false);
|
| + SkBitmap bitmapN32;
|
| + bitmap.copyTo(&bitmapN32, kN32_SkColorType);
|
| +
|
| + // make two textures...
|
| + SkAutoTUnref<GrTexture> i8tex(GrUploadBitmapToTexture(ctx, bitmap));
|
| + SkAutoTUnref<GrTexture> rgbatex(GrUploadBitmapToTexture(ctx, bitmapN32));
|
| +
|
| + REPORTER_ASSERT(reporter, i8tex->width() == bitmap.width());
|
| + REPORTER_ASSERT(reporter, i8tex->height() == bitmap.height());
|
| +
|
| + // Did we get the same?
|
| + compare_texture_with_bitmap(reporter, rgbatex, bitmapN32);
|
| + compare_texture_with_bitmap(reporter, i8tex, bitmapN32);
|
| + }
|
| +}
|
| +#endif
|
|
|