Index: tests/PictureTest.cpp |
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp |
index 3cb145e7a4822019b5158b628ea76fca3e4806a3..5bc60371c997f957f56a0f122602812822c813fb 100644 |
--- a/tests/PictureTest.cpp |
+++ b/tests/PictureTest.cpp |
@@ -16,6 +16,7 @@ |
#include "SkError.h" |
#include "SkImageEncoder.h" |
#include "SkImageGenerator.h" |
+#include "SkLayerInfo.h" |
#include "SkPaint.h" |
#include "SkPicture.h" |
#include "SkPictureRecorder.h" |
@@ -29,7 +30,6 @@ |
#if SK_SUPPORT_GPU |
#include "SkSurface.h" |
#include "GrContextFactory.h" |
-#include "GrPictureUtils.h" |
#endif |
#include "Test.h" |
@@ -871,224 +871,209 @@ static void test_gpu_veto(skiatest::Reporter* reporter) { |
REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL)); |
} |
-static void test_gpu_picture_optimization(skiatest::Reporter* reporter, |
- GrContextFactory* factory) { |
- for (int i= 0; i < GrContextFactory::kGLContextTypeCnt; ++i) { |
- GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType) i; |
+#endif |
- if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { |
- continue; |
- } |
+static void test_savelayer_extraction(skiatest::Reporter* reporter) { |
+ static const int kWidth = 100; |
+ static const int kHeight = 100; |
- GrContext* context = factory->get(glCtxType); |
+ // Create complex paint that the bounding box computation code can't |
+ // optimize away |
+ SkScalar blueToRedMatrix[20] = { 0 }; |
+ blueToRedMatrix[2] = blueToRedMatrix[18] = SK_Scalar1; |
+ SkAutoTUnref<SkColorFilter> blueToRed(SkColorMatrixFilter::Create(blueToRedMatrix)); |
+ SkAutoTUnref<SkImageFilter> filter(SkColorFilterImageFilter::Create(blueToRed.get())); |
- if (NULL == context) { |
- continue; |
- } |
+ SkPaint complexPaint; |
+ complexPaint.setImageFilter(filter); |
- static const int kWidth = 100; |
- static const int kHeight = 100; |
+ SkAutoTUnref<SkPicture> pict, child; |
+ SkRTreeFactory bbhFactory; |
- // Create complex paint that the bounding box computation code can't |
- // optimize away |
- SkScalar blueToRedMatrix[20] = { 0 }; |
- blueToRedMatrix[2] = blueToRedMatrix[18] = SK_Scalar1; |
- SkAutoTUnref<SkColorFilter> blueToRed(SkColorMatrixFilter::Create(blueToRedMatrix)); |
- SkAutoTUnref<SkImageFilter> filter(SkColorFilterImageFilter::Create(blueToRed.get())); |
+ { |
+ SkPictureRecorder recorder; |
- SkPaint complexPaint; |
- complexPaint.setImageFilter(filter); |
+ SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), SkIntToScalar(kHeight), |
+ &bbhFactory, |
+ SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag); |
- SkAutoTUnref<SkPicture> pict, child; |
- SkRTreeFactory bbhFactory; |
+ c->saveLayer(NULL, &complexPaint); |
+ c->restore(); |
- { |
- SkPictureRecorder recorder; |
+ child.reset(recorder.endRecording()); |
+ } |
- SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), SkIntToScalar(kHeight), |
- &bbhFactory, |
- SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag); |
+ // create a picture with the structure: |
+ // 1) |
+ // SaveLayer |
+ // Restore |
+ // 2) |
+ // SaveLayer |
+ // Translate |
+ // SaveLayer w/ bound |
+ // Restore |
+ // Restore |
+ // 3) |
+ // SaveLayer w/ copyable paint |
+ // Restore |
+ // 4) |
+ // SaveLayer |
+ // DrawPicture (which has a SaveLayer/Restore pair) |
+ // Restore |
+ // 5) |
+ // SaveLayer |
+ // DrawPicture with Matrix & Paint (with SaveLayer/Restore pair) |
+ // Restore |
+ { |
+ SkPictureRecorder recorder; |
- c->saveLayer(NULL, &complexPaint); |
+ SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), |
+ SkIntToScalar(kHeight), |
+ &bbhFactory, |
+ SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag); |
+ // 1) |
+ c->saveLayer(NULL, &complexPaint); // layer #0 |
+ c->restore(); |
+ |
+ // 2) |
+ c->saveLayer(NULL, NULL); // layer #1 |
+ c->translate(kWidth/2.0f, kHeight/2.0f); |
+ SkRect r = SkRect::MakeXYWH(0, 0, kWidth/2, kHeight/2); |
+ c->saveLayer(&r, &complexPaint); // layer #2 |
c->restore(); |
+ c->restore(); |
- child.reset(recorder.endRecording()); |
+ // 3) |
+ { |
+ c->saveLayer(NULL, &complexPaint); // layer #3 |
+ c->restore(); |
} |
- // create a picture with the structure: |
- // 1) |
- // SaveLayer |
- // Restore |
- // 2) |
- // SaveLayer |
- // Translate |
- // SaveLayer w/ bound |
- // Restore |
- // Restore |
- // 3) |
- // SaveLayer w/ copyable paint |
- // Restore |
+ SkPaint layerPaint; |
+ layerPaint.setColor(SK_ColorRED); // Non-alpha only to avoid SaveLayerDrawRestoreNooper |
// 4) |
- // SaveLayer |
- // DrawPicture (which has a SaveLayer/Restore pair) |
- // Restore |
- // 5) |
- // SaveLayer |
- // DrawPicture with Matrix & Paint (with SaveLayer/Restore pair) |
- // Restore |
{ |
- SkPictureRecorder recorder; |
- |
- SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), |
- SkIntToScalar(kHeight), |
- &bbhFactory, |
- SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag); |
- // 1) |
- c->saveLayer(NULL, &complexPaint); // layer #0 |
+ c->saveLayer(NULL, &layerPaint); // layer #4 |
+ c->drawPicture(child); // layer #5 inside picture |
c->restore(); |
+ } |
+ // 5 |
+ { |
+ SkPaint picturePaint; |
+ SkMatrix trans; |
+ trans.setTranslate(10, 10); |
- // 2) |
- c->saveLayer(NULL, NULL); // layer #1 |
- c->translate(kWidth/2.0f, kHeight/2.0f); |
- SkRect r = SkRect::MakeXYWH(0, 0, kWidth/2, kHeight/2); |
- c->saveLayer(&r, &complexPaint); // layer #2 |
- c->restore(); |
+ c->saveLayer(NULL, &layerPaint); // layer #6 |
+ c->drawPicture(child, &trans, &picturePaint); // layer #7 inside picture |
c->restore(); |
- |
- // 3) |
- { |
- c->saveLayer(NULL, &complexPaint); // layer #3 |
- c->restore(); |
- } |
- |
- SkPaint layerPaint; |
- layerPaint.setColor(SK_ColorRED); // Non-alpha only to avoid SaveLayerDrawRestoreNooper |
- // 4) |
- { |
- c->saveLayer(NULL, &layerPaint); // layer #4 |
- c->drawPicture(child); // layer #5 inside picture |
- c->restore(); |
- } |
- // 5 |
- { |
- SkPaint picturePaint; |
- SkMatrix trans; |
- trans.setTranslate(10, 10); |
- |
- c->saveLayer(NULL, &layerPaint); // layer #6 |
- c->drawPicture(child, &trans, &picturePaint); // layer #7 inside picture |
- c->restore(); |
- } |
- |
- pict.reset(recorder.endRecording()); |
} |
- // Now test out the SaveLayer extraction |
- { |
- SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey(); |
- |
- const SkPicture::AccelData* data = pict->EXPERIMENTAL_getAccelData(key); |
- REPORTER_ASSERT(reporter, data); |
- |
- const GrAccelData *gpuData = static_cast<const GrAccelData*>(data); |
- REPORTER_ASSERT(reporter, 8 == gpuData->numSaveLayers()); |
- |
- const GrAccelData::SaveLayerInfo& info0 = gpuData->saveLayerInfo(0); |
- // The parent/child layers appear in reverse order |
- const GrAccelData::SaveLayerInfo& info1 = gpuData->saveLayerInfo(2); |
- const GrAccelData::SaveLayerInfo& info2 = gpuData->saveLayerInfo(1); |
- |
- const GrAccelData::SaveLayerInfo& info3 = gpuData->saveLayerInfo(3); |
- |
- // The parent/child layers appear in reverse order |
- const GrAccelData::SaveLayerInfo& info4 = gpuData->saveLayerInfo(5); |
- const GrAccelData::SaveLayerInfo& info5 = gpuData->saveLayerInfo(4); |
- |
- // The parent/child layers appear in reverse order |
- const GrAccelData::SaveLayerInfo& info6 = gpuData->saveLayerInfo(7); |
- const GrAccelData::SaveLayerInfo& info7 = gpuData->saveLayerInfo(6); |
- |
- REPORTER_ASSERT(reporter, NULL == info0.fPicture); |
- REPORTER_ASSERT(reporter, kWidth == info0.fBounds.width() && |
- kHeight == info0.fBounds.height()); |
- REPORTER_ASSERT(reporter, info0.fLocalMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info0.fPreMat.isIdentity()); |
- REPORTER_ASSERT(reporter, 0 == info0.fBounds.fLeft && 0 == info0.fBounds.fTop); |
- REPORTER_ASSERT(reporter, NULL != info0.fPaint); |
- REPORTER_ASSERT(reporter, !info0.fIsNested && !info0.fHasNestedLayers); |
- |
- REPORTER_ASSERT(reporter, NULL == info1.fPicture); |
- REPORTER_ASSERT(reporter, kWidth/2.0 == info1.fBounds.width() && |
- kHeight/2.0 == info1.fBounds.height()); |
- REPORTER_ASSERT(reporter, info1.fLocalMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info1.fPreMat.isIdentity()); |
- REPORTER_ASSERT(reporter, kWidth/2.0 == info1.fBounds.fLeft && |
- kHeight/2.0 == info1.fBounds.fTop); |
- REPORTER_ASSERT(reporter, NULL == info1.fPaint); |
- REPORTER_ASSERT(reporter, !info1.fIsNested && |
- info1.fHasNestedLayers); // has a nested SL |
- |
- REPORTER_ASSERT(reporter, NULL == info2.fPicture); |
- REPORTER_ASSERT(reporter, kWidth / 2 == info2.fBounds.width() && |
- kHeight / 2 == info2.fBounds.height()); // bound reduces size |
- REPORTER_ASSERT(reporter, !info2.fLocalMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info2.fPreMat.isIdentity()); |
- REPORTER_ASSERT(reporter, kWidth / 2 == info2.fBounds.fLeft && // translated |
- kHeight / 2 == info2.fBounds.fTop); |
- REPORTER_ASSERT(reporter, NULL != info2.fPaint); |
- REPORTER_ASSERT(reporter, info2.fIsNested && !info2.fHasNestedLayers); // is nested |
- |
- REPORTER_ASSERT(reporter, NULL == info3.fPicture); |
- REPORTER_ASSERT(reporter, kWidth == info3.fBounds.width() && |
- kHeight == info3.fBounds.height()); |
- REPORTER_ASSERT(reporter, info3.fLocalMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info3.fPreMat.isIdentity()); |
- REPORTER_ASSERT(reporter, 0 == info3.fBounds.fLeft && 0 == info3.fBounds.fTop); |
- REPORTER_ASSERT(reporter, info3.fPaint); |
- REPORTER_ASSERT(reporter, !info3.fIsNested && !info3.fHasNestedLayers); |
- |
- REPORTER_ASSERT(reporter, NULL == info4.fPicture); |
- REPORTER_ASSERT(reporter, kWidth == info4.fBounds.width() && |
- kHeight == info4.fBounds.height()); |
- REPORTER_ASSERT(reporter, 0 == info4.fBounds.fLeft && 0 == info4.fBounds.fTop); |
- REPORTER_ASSERT(reporter, info4.fLocalMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info4.fPreMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info4.fPaint); |
- REPORTER_ASSERT(reporter, !info4.fIsNested && |
- info4.fHasNestedLayers); // has a nested SL |
- |
- REPORTER_ASSERT(reporter, child == info5.fPicture); // in a child picture |
- REPORTER_ASSERT(reporter, kWidth == info5.fBounds.width() && |
- kHeight == info5.fBounds.height()); |
- REPORTER_ASSERT(reporter, 0 == info5.fBounds.fLeft && 0 == info5.fBounds.fTop); |
- REPORTER_ASSERT(reporter, info5.fLocalMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info5.fPreMat.isIdentity()); |
- REPORTER_ASSERT(reporter, NULL != info5.fPaint); |
- REPORTER_ASSERT(reporter, info5.fIsNested && !info5.fHasNestedLayers); // is nested |
- |
- REPORTER_ASSERT(reporter, NULL == info6.fPicture); |
- REPORTER_ASSERT(reporter, kWidth-10 == info6.fBounds.width() && |
- kHeight-10 == info6.fBounds.height()); |
- REPORTER_ASSERT(reporter, 10 == info6.fBounds.fLeft && 10 == info6.fBounds.fTop); |
- REPORTER_ASSERT(reporter, info6.fLocalMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info6.fPreMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info6.fPaint); |
- REPORTER_ASSERT(reporter, !info6.fIsNested && |
- info6.fHasNestedLayers); // has a nested SL |
- |
- REPORTER_ASSERT(reporter, child == info7.fPicture); // in a child picture |
- REPORTER_ASSERT(reporter, kWidth == info7.fBounds.width() && |
- kHeight == info7.fBounds.height()); |
- REPORTER_ASSERT(reporter, 0 == info7.fBounds.fLeft && 0 == info7.fBounds.fTop); |
- REPORTER_ASSERT(reporter, info7.fLocalMat.isIdentity()); |
- REPORTER_ASSERT(reporter, info7.fPreMat.isIdentity()); |
- REPORTER_ASSERT(reporter, NULL != info7.fPaint); |
- REPORTER_ASSERT(reporter, info7.fIsNested && !info7.fHasNestedLayers); // is nested |
- } |
+ pict.reset(recorder.endRecording()); |
} |
-} |
-#endif |
+ // Now test out the SaveLayer extraction |
+ { |
+ SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey(); |
+ |
+ const SkPicture::AccelData* data = pict->EXPERIMENTAL_getAccelData(key); |
+ REPORTER_ASSERT(reporter, data); |
+ |
+ const SkLayerInfo *gpuData = static_cast<const SkLayerInfo*>(data); |
+ REPORTER_ASSERT(reporter, 8 == gpuData->numBlocks()); |
+ |
+ const SkLayerInfo::BlockInfo& info0 = gpuData->block(0); |
+ // The parent/child layers appear in reverse order |
+ const SkLayerInfo::BlockInfo& info1 = gpuData->block(2); |
+ const SkLayerInfo::BlockInfo& info2 = gpuData->block(1); |
+ |
+ const SkLayerInfo::BlockInfo& info3 = gpuData->block(3); |
+ |
+ // The parent/child layers appear in reverse order |
+ const SkLayerInfo::BlockInfo& info4 = gpuData->block(5); |
+ const SkLayerInfo::BlockInfo& info5 = gpuData->block(4); |
+ |
+ // The parent/child layers appear in reverse order |
+ const SkLayerInfo::BlockInfo& info6 = gpuData->block(7); |
+ const SkLayerInfo::BlockInfo& info7 = gpuData->block(6); |
+ |
+ REPORTER_ASSERT(reporter, NULL == info0.fPicture); |
+ REPORTER_ASSERT(reporter, kWidth == info0.fBounds.width() && |
+ kHeight == info0.fBounds.height()); |
+ REPORTER_ASSERT(reporter, info0.fLocalMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info0.fPreMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, 0 == info0.fBounds.fLeft && 0 == info0.fBounds.fTop); |
+ REPORTER_ASSERT(reporter, NULL != info0.fPaint); |
+ REPORTER_ASSERT(reporter, !info0.fIsNested && !info0.fHasNestedLayers); |
+ |
+ REPORTER_ASSERT(reporter, NULL == info1.fPicture); |
+ REPORTER_ASSERT(reporter, kWidth/2.0 == info1.fBounds.width() && |
+ kHeight/2.0 == info1.fBounds.height()); |
+ REPORTER_ASSERT(reporter, info1.fLocalMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info1.fPreMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, kWidth/2.0 == info1.fBounds.fLeft && |
+ kHeight/2.0 == info1.fBounds.fTop); |
+ REPORTER_ASSERT(reporter, NULL == info1.fPaint); |
+ REPORTER_ASSERT(reporter, !info1.fIsNested && |
+ info1.fHasNestedLayers); // has a nested SL |
+ |
+ REPORTER_ASSERT(reporter, NULL == info2.fPicture); |
+ REPORTER_ASSERT(reporter, kWidth / 2 == info2.fBounds.width() && |
+ kHeight / 2 == info2.fBounds.height()); // bound reduces size |
+ REPORTER_ASSERT(reporter, !info2.fLocalMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info2.fPreMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, kWidth / 2 == info2.fBounds.fLeft && // translated |
+ kHeight / 2 == info2.fBounds.fTop); |
+ REPORTER_ASSERT(reporter, NULL != info2.fPaint); |
+ REPORTER_ASSERT(reporter, info2.fIsNested && !info2.fHasNestedLayers); // is nested |
+ |
+ REPORTER_ASSERT(reporter, NULL == info3.fPicture); |
+ REPORTER_ASSERT(reporter, kWidth == info3.fBounds.width() && |
+ kHeight == info3.fBounds.height()); |
+ REPORTER_ASSERT(reporter, info3.fLocalMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info3.fPreMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, 0 == info3.fBounds.fLeft && 0 == info3.fBounds.fTop); |
+ REPORTER_ASSERT(reporter, info3.fPaint); |
+ REPORTER_ASSERT(reporter, !info3.fIsNested && !info3.fHasNestedLayers); |
+ |
+ REPORTER_ASSERT(reporter, NULL == info4.fPicture); |
+ REPORTER_ASSERT(reporter, kWidth == info4.fBounds.width() && |
+ kHeight == info4.fBounds.height()); |
+ REPORTER_ASSERT(reporter, 0 == info4.fBounds.fLeft && 0 == info4.fBounds.fTop); |
+ REPORTER_ASSERT(reporter, info4.fLocalMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info4.fPreMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info4.fPaint); |
+ REPORTER_ASSERT(reporter, !info4.fIsNested && |
+ info4.fHasNestedLayers); // has a nested SL |
+ |
+ REPORTER_ASSERT(reporter, child == info5.fPicture); // in a child picture |
+ REPORTER_ASSERT(reporter, kWidth == info5.fBounds.width() && |
+ kHeight == info5.fBounds.height()); |
+ REPORTER_ASSERT(reporter, 0 == info5.fBounds.fLeft && 0 == info5.fBounds.fTop); |
+ REPORTER_ASSERT(reporter, info5.fLocalMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info5.fPreMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, NULL != info5.fPaint); |
+ REPORTER_ASSERT(reporter, info5.fIsNested && !info5.fHasNestedLayers); // is nested |
+ |
+ REPORTER_ASSERT(reporter, NULL == info6.fPicture); |
+ REPORTER_ASSERT(reporter, kWidth-10 == info6.fBounds.width() && |
+ kHeight-10 == info6.fBounds.height()); |
+ REPORTER_ASSERT(reporter, 10 == info6.fBounds.fLeft && 10 == info6.fBounds.fTop); |
+ REPORTER_ASSERT(reporter, info6.fLocalMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info6.fPreMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info6.fPaint); |
+ REPORTER_ASSERT(reporter, !info6.fIsNested && |
+ info6.fHasNestedLayers); // has a nested SL |
+ |
+ REPORTER_ASSERT(reporter, child == info7.fPicture); // in a child picture |
+ REPORTER_ASSERT(reporter, kWidth == info7.fBounds.width() && |
+ kHeight == info7.fBounds.height()); |
+ REPORTER_ASSERT(reporter, 0 == info7.fBounds.fLeft && 0 == info7.fBounds.fTop); |
+ REPORTER_ASSERT(reporter, info7.fLocalMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, info7.fPreMat.isIdentity()); |
+ REPORTER_ASSERT(reporter, NULL != info7.fPaint); |
+ REPORTER_ASSERT(reporter, info7.fIsNested && !info7.fHasNestedLayers); // is nested |
+ } |
+} |
static void test_has_text(skiatest::Reporter* reporter) { |
SkPictureRecorder recorder; |
@@ -1757,14 +1742,9 @@ DEF_TEST(Picture, reporter) { |
test_clip_expansion(reporter); |
test_hierarchical(reporter); |
test_gen_id(reporter); |
+ test_savelayer_extraction(reporter); |
} |
-#if SK_SUPPORT_GPU |
-DEF_GPUTEST(GPUPicture, reporter, factory) { |
- test_gpu_picture_optimization(reporter, factory); |
-} |
-#endif |
- |
static void draw_bitmaps(const SkBitmap bitmap, SkCanvas* canvas) { |
const SkPaint paint; |
const SkRect rect = { 5.0f, 5.0f, 8.0f, 8.0f }; |