| OLD | NEW | 
| (Empty) |  | 
 |    1 /* | 
 |    2  * Copyright 2014 Google Inc. | 
 |    3  * | 
 |    4  * Use of this source code is governed by a BSD-style license that can be | 
 |    5  * found in the LICENSE file. | 
 |    6  */ | 
 |    7  | 
 |    8 #include "SkBBHFactory.h" | 
 |    9 #include "SkCanvas.h" | 
 |   10 #include "SkPictureRecorder.h" | 
 |   11 #include "SkPictureStateTree.h" | 
 |   12 #include "Test.h" | 
 |   13  | 
 |   14 static SkPicture* draw_scene(SkBBHFactory* bbhFactory) { | 
 |   15     SkPictureRecorder recorder; | 
 |   16     SkCanvas* canvas = recorder.beginRecording(200, 200, bbhFactory, 0); | 
 |   17  | 
 |   18     SkPaint p1, p2; | 
 |   19     p1.setStyle(SkPaint::kFill_Style); | 
 |   20     p1.setARGB(0x80, 0, 0xff, 0); | 
 |   21     p2.setStyle(SkPaint::kFill_Style); | 
 |   22     p2.setARGB(0x80, 0xff, 0, 0); | 
 |   23  | 
 |   24     canvas->drawColor(SK_ColorWHITE); | 
 |   25  | 
 |   26     // This is intended to exercise some tricky SkPictureStateTree code paths wh
     en | 
 |   27     // played back with various clips: | 
 |   28     // | 
 |   29     //   * cleanup/rewind when the last draw is not at the root of the state tre
     e. | 
 |   30     //   * state nodes with both kSave_Flag & kSaveLayer_Flag set. | 
 |   31     //   * state tree transitions which implicitly reset the matrix via. restore
     (). | 
 |   32  | 
 |   33     canvas->save(); | 
 |   34       canvas->translate(10, 10); | 
 |   35  | 
 |   36       canvas->drawRect(SkRect::MakeWH(100, 50), p1); | 
 |   37       canvas->drawRect(SkRect::MakeWH(50, 100), p2); | 
 |   38  | 
 |   39       SkRect layerBounds = SkRect::MakeXYWH(0, 0, 90, 90); | 
 |   40       canvas->saveLayer(&layerBounds, NULL); | 
 |   41         canvas->save(); | 
 |   42           canvas->clipRect(layerBounds); | 
 |   43  | 
 |   44           canvas->save(); | 
 |   45             canvas->clipRect(SkRect::MakeWH(25, 25)); | 
 |   46             canvas->rotate(90); | 
 |   47             canvas->drawRect(SkRect::MakeWH(100, 50), p1); | 
 |   48           canvas->restore(); | 
 |   49  | 
 |   50           canvas->save(); | 
 |   51             canvas->clipRect(SkRect::MakeWH(25, 25)); | 
 |   52             canvas->save(); | 
 |   53               canvas->rotate(90); | 
 |   54               canvas->drawRect(SkRect::MakeWH(50, 100), p2); | 
 |   55             canvas->restore(); | 
 |   56             canvas->drawRect(SkRect::MakeWH(100, 50), p1); | 
 |   57           canvas->restore(); | 
 |   58           canvas->drawRect(SkRect::MakeXYWH(99, 99, 1, 1), p1); | 
 |   59         canvas->restore(); | 
 |   60       canvas->restore(); | 
 |   61  | 
 |   62     canvas->restore(); | 
 |   63  | 
 |   64     return recorder.endRecording(); | 
 |   65 } | 
 |   66  | 
 |   67 static void check_bms(skiatest::Reporter* reporter, const SkBitmap& bm1, const S
     kBitmap& bm2) { | 
 |   68     SkASSERT(bm1.getSize() == bm2.getSize()); | 
 |   69     REPORTER_ASSERT(reporter, 0 == memcmp(bm1.getAddr(0, 0), bm2.getAddr(0, 0), 
     bm1.getSize())); | 
 |   70 } | 
 |   71  | 
 |   72 static void test_reference_picture(skiatest::Reporter* reporter) { | 
 |   73     SkRTreeFactory bbhFactory; | 
 |   74  | 
 |   75     SkAutoTUnref<SkPicture> bbhPicture(draw_scene(&bbhFactory)); | 
 |   76     SkAutoTUnref<SkPicture> referencePicture(draw_scene(NULL)); | 
 |   77  | 
 |   78     SkBitmap referenceBitmap; | 
 |   79     referenceBitmap.allocN32Pixels(100, 100); | 
 |   80     SkCanvas referenceCanvas(referenceBitmap); | 
 |   81  | 
 |   82     SkBitmap bbhBitmap; | 
 |   83     bbhBitmap.allocN32Pixels(100, 100); | 
 |   84     SkCanvas bbhCanvas(bbhBitmap); | 
 |   85  | 
 |   86     referenceCanvas.drawColor(SK_ColorTRANSPARENT); | 
 |   87     referenceCanvas.drawPicture(*referencePicture.get()); | 
 |   88     bbhCanvas.drawColor(SK_ColorTRANSPARENT); | 
 |   89     bbhCanvas.drawPicture(*bbhPicture.get()); | 
 |   90     REPORTER_ASSERT(reporter, | 
 |   91                     referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount()); | 
 |   92     REPORTER_ASSERT(reporter, | 
 |   93                     referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix
     ()); | 
 |   94     check_bms(reporter, referenceBitmap, bbhBitmap); | 
 |   95  | 
 |   96     referenceCanvas.drawColor(SK_ColorTRANSPARENT); | 
 |   97     referenceCanvas.clipRect(SkRect::MakeWH(50, 50)); | 
 |   98     referenceCanvas.drawPicture(*referencePicture.get()); | 
 |   99     bbhCanvas.drawColor(SK_ColorTRANSPARENT); | 
 |  100     bbhCanvas.clipRect(SkRect::MakeWH(50, 50)); | 
 |  101     bbhCanvas.drawPicture(*bbhPicture.get()); | 
 |  102     REPORTER_ASSERT(reporter, | 
 |  103                     referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount()); | 
 |  104     REPORTER_ASSERT(reporter, | 
 |  105                     referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix
     ()); | 
 |  106     check_bms(reporter, referenceBitmap, bbhBitmap); | 
 |  107  | 
 |  108     referenceCanvas.drawColor(SK_ColorTRANSPARENT); | 
 |  109     referenceCanvas.clipRect(SkRect::MakeWH(10, 10)); | 
 |  110     referenceCanvas.drawPicture(*referencePicture.get()); | 
 |  111     bbhCanvas.drawColor(SK_ColorTRANSPARENT); | 
 |  112     bbhCanvas.clipRect(SkRect::MakeWH(10, 10)); | 
 |  113     bbhCanvas.drawPicture(*bbhPicture.get()); | 
 |  114     REPORTER_ASSERT(reporter, | 
 |  115                     referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount()); | 
 |  116     REPORTER_ASSERT(reporter, | 
 |  117                     referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix
     ()); | 
 |  118     check_bms(reporter, referenceBitmap, bbhBitmap); | 
 |  119 } | 
 |  120  | 
 |  121 DEF_TEST(PictureStateTree, reporter) { | 
 |  122     test_reference_picture(reporter); | 
 |  123 } | 
| OLD | NEW |