add gm that exercises compose shader allocations
authorcaryclark <caryclark@google.com>
Mon, 15 Aug 2016 19:03:33 +0000 (12:03 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 15 Aug 2016 19:03:33 +0000 (12:03 -0700)
This gm triggers the assert in SkSmallAllocator.h
commented out by this CL.

PDFium constructs shaders that resemble the GM.

R=reed@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2249703002

Review-Url: https://codereview.chromium.org/2249703002

gm/composeshader.cpp
src/core/SkSmallAllocator.h

index efcfe79..c029c98 100644 (file)
@@ -221,6 +221,44 @@ private:
     typedef GM INHERITED;
 };
 
+DEF_SIMPLE_GM(composeshader_bitmap2, canvas, 200, 200) {
+    int width = 255;
+    int height = 255;
+    SkTDArray<uint8_t> dst8Storage;
+    dst8Storage.setCount(width * height);
+    SkTDArray<uint32_t> dst32Storage;
+    dst32Storage.setCount(width * height * sizeof(int32_t));
+    for (int y = 0; y < height; ++y) {
+        for (int x = 0; x < width; ++x) {
+            dst8Storage[y * width + x] = (y + x) / 2;
+            dst32Storage[y * width + x] = SkPackARGB32(0xFF, x, y, 0);
+        }
+    }
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(SK_ColorBLUE);
+    SkRect r = {0, 0, SkIntToScalar(width), SkIntToScalar(height)};
+    canvas->drawRect(r, paint);
+    SkBitmap skBitmap, skMask;
+    SkImageInfo imageInfo = SkImageInfo::Make(width, height,
+            SkColorType::kN32_SkColorType, kPremul_SkAlphaType);
+    skBitmap.installPixels(imageInfo, dst32Storage.begin(), width * sizeof(int32_t),
+            nullptr, nullptr, nullptr);
+    imageInfo = SkImageInfo::Make(width, height,
+            SkColorType::kAlpha_8_SkColorType, kPremul_SkAlphaType);
+    skMask.installPixels(imageInfo, dst8Storage.begin(), width, nullptr, nullptr, nullptr);
+    sk_sp<SkImage> skSrc = SkImage::MakeFromBitmap(skBitmap);
+    sk_sp<SkShader> skSrcShader =
+        skSrc->makeShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
+    sk_sp<SkImage> skMaskImage = SkImage::MakeFromBitmap(skMask);
+    sk_sp<SkShader> skMaskShader = skMaskImage->makeShader(
+        SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
+    sk_sp<SkXfermode> dstInMode = SkXfermode::Make(SkXfermode::kSrcIn_Mode);
+    paint.setShader(
+        SkShader::MakeComposeShader(skMaskShader, skSrcShader, dstInMode));
+    canvas->drawRect(r, paint);
+}
+
 //////////////////////////////////////////////////////////////////////////////
 
 DEF_GM( return new ComposeShaderGM; )
index 22baa89..9095fa5 100644 (file)
@@ -80,10 +80,12 @@ public:
         const size_t storageRemaining = sizeof(fStorage) - fStorageUsed;
         Rec* rec = &fRecs[fNumObjects];
         if (storageRequired > storageRemaining) {
-            // Allocate on the heap. Ideally we want to avoid this situation,
-            // but we're not sure we can catch all callers, so handle it but
-            // assert false in debug mode.
-            SkASSERT(false);
+            // Allocate on the heap. Ideally we want to avoid this situation.
+
+            // With the gm composeshader_bitmap2, storage required is 4476
+            // and storage remaining is 3392. Increasing the base storage
+            // causes google 3 tests to fail.
+
             rec->fStorageSize = 0;
             rec->fHeapStorage = sk_malloc_throw(storageRequired);
             rec->fObj = static_cast<void*>(rec->fHeapStorage);