Home | History | Annotate | Download | only in ext
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/compiler_specific.h"
      6 #include "base/memory/scoped_ptr.h"
      7 #include "cc/test/geometry_test_utils.h"
      8 #include "skia/ext/pixel_ref_utils.h"
      9 #include "skia/ext/refptr.h"
     10 #include "testing/gtest/include/gtest/gtest.h"
     11 #include "third_party/skia/include/core/SkBitmap.h"
     12 #include "third_party/skia/include/core/SkCanvas.h"
     13 #include "third_party/skia/include/core/SkFlattenableBuffers.h"
     14 #include "third_party/skia/include/core/SkPictureRecorder.h"
     15 #include "third_party/skia/include/core/SkPixelRef.h"
     16 #include "third_party/skia/include/core/SkPoint.h"
     17 #include "third_party/skia/include/core/SkShader.h"
     18 #include "third_party/skia/src/core/SkOrderedReadBuffer.h"
     19 #include "ui/gfx/rect.h"
     20 #include "ui/gfx/skia_util.h"
     21 
     22 namespace skia {
     23 
     24 namespace {
     25 
     26 void CreateBitmap(gfx::Size size, const char* uri, SkBitmap* bitmap);
     27 
     28 class TestDiscardableShader : public SkShader {
     29  public:
     30   TestDiscardableShader() {
     31     CreateBitmap(gfx::Size(50, 50), "discardable", &bitmap_);
     32   }
     33 
     34   TestDiscardableShader(SkFlattenableReadBuffer& flattenable_buffer) {
     35     SkOrderedReadBuffer& buffer =
     36         static_cast<SkOrderedReadBuffer&>(flattenable_buffer);
     37     SkReader32* reader = buffer.getReader32();
     38 
     39     reader->skip(-4);
     40     uint32_t toSkip = reader->readU32();
     41     reader->skip(toSkip);
     42 
     43     CreateBitmap(gfx::Size(50, 50), "discardable", &bitmap_);
     44   }
     45 
     46   virtual SkShader::BitmapType asABitmap(SkBitmap* bitmap,
     47                                          SkMatrix* matrix,
     48                                          TileMode xy[2]) const OVERRIDE {
     49     if (bitmap)
     50       *bitmap = bitmap_;
     51     return SkShader::kDefault_BitmapType;
     52   }
     53 
     54   // not indended to return an actual context. Just need to supply this.
     55   virtual size_t contextSize() const OVERRIDE {
     56     return sizeof(SkShader::Context);
     57   }
     58 
     59   SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(TestDiscardableShader);
     60 
     61  private:
     62   SkBitmap bitmap_;
     63 };
     64 
     65 void CreateBitmap(gfx::Size size, const char* uri, SkBitmap* bitmap) {
     66   const SkImageInfo info = {
     67     size.width(), size.height(), kPMColor_SkColorType, kPremul_SkAlphaType
     68   };
     69 
     70   bitmap->allocPixels(info);
     71   bitmap->pixelRef()->setImmutable();
     72   bitmap->pixelRef()->setURI(uri);
     73 }
     74 
     75 SkCanvas* StartRecording(SkPictureRecorder* recorder, gfx::Rect layer_rect) {
     76   SkCanvas* canvas =
     77       recorder->beginRecording(layer_rect.width(), layer_rect.height());
     78 
     79   canvas->save();
     80   canvas->translate(-layer_rect.x(), -layer_rect.y());
     81   canvas->clipRect(SkRect::MakeXYWH(
     82       layer_rect.x(), layer_rect.y(), layer_rect.width(), layer_rect.height()));
     83 
     84   return canvas;
     85 }
     86 
     87 SkPicture* StopRecording(SkPictureRecorder* recorder, SkCanvas* canvas) {
     88   canvas->restore();
     89   return recorder->endRecording();
     90 }
     91 
     92 }  // namespace
     93 
     94 TEST(PixelRefUtilsTest, DrawPaint) {
     95   gfx::Rect layer_rect(0, 0, 256, 256);
     96 
     97   SkPictureRecorder recorder;
     98   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
     99 
    100   TestDiscardableShader first_shader;
    101   SkPaint first_paint;
    102   first_paint.setShader(&first_shader);
    103 
    104   TestDiscardableShader second_shader;
    105   SkPaint second_paint;
    106   second_paint.setShader(&second_shader);
    107 
    108   TestDiscardableShader third_shader;
    109   SkPaint third_paint;
    110   third_paint.setShader(&third_shader);
    111 
    112   canvas->drawPaint(first_paint);
    113   canvas->clipRect(SkRect::MakeXYWH(34, 45, 56, 67));
    114   canvas->drawPaint(second_paint);
    115   // Total clip is now (34, 45, 56, 55)
    116   canvas->clipRect(SkRect::MakeWH(100, 100));
    117   canvas->drawPaint(third_paint);
    118 
    119   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    120 
    121   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    122   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    123 
    124   EXPECT_EQ(3u, pixel_refs.size());
    125   EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 256, 256),
    126                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    127   EXPECT_FLOAT_RECT_EQ(gfx::RectF(34, 45, 56, 67),
    128                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    129   EXPECT_FLOAT_RECT_EQ(gfx::RectF(34, 45, 56, 55),
    130                        gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect));
    131 }
    132 
    133 TEST(PixelRefUtilsTest, DrawPoints) {
    134   gfx::Rect layer_rect(0, 0, 256, 256);
    135 
    136   SkPictureRecorder recorder;
    137   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    138 
    139   TestDiscardableShader first_shader;
    140   SkPaint first_paint;
    141   first_paint.setShader(&first_shader);
    142 
    143   TestDiscardableShader second_shader;
    144   SkPaint second_paint;
    145   second_paint.setShader(&second_shader);
    146 
    147   TestDiscardableShader third_shader;
    148   SkPaint third_paint;
    149   third_paint.setShader(&third_shader);
    150 
    151   SkPoint points[3];
    152   points[0].set(10, 10);
    153   points[1].set(100, 20);
    154   points[2].set(50, 100);
    155   // (10, 10, 90, 90).
    156   canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, first_paint);
    157 
    158   canvas->save();
    159 
    160   canvas->clipRect(SkRect::MakeWH(50, 50));
    161   // (10, 10, 40, 40).
    162   canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, second_paint);
    163 
    164   canvas->restore();
    165 
    166   points[0].set(50, 55);
    167   points[1].set(50, 55);
    168   points[2].set(200, 200);
    169   // (50, 55, 150, 145).
    170   canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, third_paint);
    171 
    172   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    173 
    174   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    175   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    176 
    177   EXPECT_EQ(3u, pixel_refs.size());
    178   EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 90, 90),
    179                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    180   EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 40, 40),
    181                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    182   EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 55, 150, 145),
    183                        gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect));
    184 }
    185 
    186 TEST(PixelRefUtilsTest, DrawRect) {
    187   gfx::Rect layer_rect(0, 0, 256, 256);
    188 
    189   SkPictureRecorder recorder;
    190   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    191 
    192   TestDiscardableShader first_shader;
    193   SkPaint first_paint;
    194   first_paint.setShader(&first_shader);
    195 
    196   TestDiscardableShader second_shader;
    197   SkPaint second_paint;
    198   second_paint.setShader(&second_shader);
    199 
    200   TestDiscardableShader third_shader;
    201   SkPaint third_paint;
    202   third_paint.setShader(&third_shader);
    203 
    204   // (10, 20, 30, 40).
    205   canvas->drawRect(SkRect::MakeXYWH(10, 20, 30, 40), first_paint);
    206 
    207   canvas->save();
    208 
    209   canvas->translate(5, 17);
    210   // (5, 50, 25, 35)
    211   canvas->drawRect(SkRect::MakeXYWH(0, 33, 25, 35), second_paint);
    212 
    213   canvas->restore();
    214 
    215   canvas->clipRect(SkRect::MakeXYWH(50, 50, 50, 50));
    216   canvas->translate(20, 20);
    217   // (50, 50, 50, 50)
    218   canvas->drawRect(SkRect::MakeXYWH(0, 0, 100, 100), third_paint);
    219 
    220   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    221 
    222   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    223   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    224 
    225   EXPECT_EQ(3u, pixel_refs.size());
    226   EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 20, 30, 40),
    227                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    228   EXPECT_FLOAT_RECT_EQ(gfx::RectF(5, 50, 25, 35),
    229                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    230   EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50),
    231                        gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect));
    232 }
    233 
    234 TEST(PixelRefUtilsTest, DrawRRect) {
    235   gfx::Rect layer_rect(0, 0, 256, 256);
    236 
    237   SkPictureRecorder recorder;
    238   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    239 
    240   TestDiscardableShader first_shader;
    241   SkPaint first_paint;
    242   first_paint.setShader(&first_shader);
    243 
    244   TestDiscardableShader second_shader;
    245   SkPaint second_paint;
    246   second_paint.setShader(&second_shader);
    247 
    248   TestDiscardableShader third_shader;
    249   SkPaint third_paint;
    250   third_paint.setShader(&third_shader);
    251 
    252   SkRRect rrect;
    253   rrect.setRect(SkRect::MakeXYWH(10, 20, 30, 40));
    254 
    255   // (10, 20, 30, 40).
    256   canvas->drawRRect(rrect, first_paint);
    257 
    258   canvas->save();
    259 
    260   canvas->translate(5, 17);
    261   rrect.setRect(SkRect::MakeXYWH(0, 33, 25, 35));
    262   // (5, 50, 25, 35)
    263   canvas->drawRRect(rrect, second_paint);
    264 
    265   canvas->restore();
    266 
    267   canvas->clipRect(SkRect::MakeXYWH(50, 50, 50, 50));
    268   canvas->translate(20, 20);
    269   rrect.setRect(SkRect::MakeXYWH(0, 0, 100, 100));
    270   // (50, 50, 50, 50)
    271   canvas->drawRRect(rrect, third_paint);
    272 
    273   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    274 
    275   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    276   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    277 
    278   EXPECT_EQ(3u, pixel_refs.size());
    279   EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 20, 30, 40),
    280                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    281   EXPECT_FLOAT_RECT_EQ(gfx::RectF(5, 50, 25, 35),
    282                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    283   EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50),
    284                        gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect));
    285 }
    286 
    287 TEST(PixelRefUtilsTest, DrawOval) {
    288   gfx::Rect layer_rect(0, 0, 256, 256);
    289 
    290   SkPictureRecorder recorder;
    291   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    292 
    293   TestDiscardableShader first_shader;
    294   SkPaint first_paint;
    295   first_paint.setShader(&first_shader);
    296 
    297   TestDiscardableShader second_shader;
    298   SkPaint second_paint;
    299   second_paint.setShader(&second_shader);
    300 
    301   TestDiscardableShader third_shader;
    302   SkPaint third_paint;
    303   third_paint.setShader(&third_shader);
    304 
    305   canvas->save();
    306 
    307   canvas->scale(2, 0.5);
    308   // (20, 10, 60, 20).
    309   canvas->drawOval(SkRect::MakeXYWH(10, 20, 30, 40), first_paint);
    310 
    311   canvas->restore();
    312   canvas->save();
    313 
    314   canvas->translate(1, 2);
    315   // (1, 35, 25, 35)
    316   canvas->drawRect(SkRect::MakeXYWH(0, 33, 25, 35), second_paint);
    317 
    318   canvas->restore();
    319 
    320   canvas->clipRect(SkRect::MakeXYWH(50, 50, 50, 50));
    321   canvas->translate(20, 20);
    322   // (50, 50, 50, 50)
    323   canvas->drawRect(SkRect::MakeXYWH(0, 0, 100, 100), third_paint);
    324 
    325   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    326 
    327   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    328   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    329 
    330   EXPECT_EQ(3u, pixel_refs.size());
    331   EXPECT_FLOAT_RECT_EQ(gfx::RectF(20, 10, 60, 20),
    332                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    333   EXPECT_FLOAT_RECT_EQ(gfx::RectF(1, 35, 25, 35),
    334                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    335   EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50),
    336                        gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect));
    337 }
    338 
    339 TEST(PixelRefUtilsTest, DrawPath) {
    340   gfx::Rect layer_rect(0, 0, 256, 256);
    341 
    342   SkPictureRecorder recorder;
    343   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    344 
    345   TestDiscardableShader first_shader;
    346   SkPaint first_paint;
    347   first_paint.setShader(&first_shader);
    348 
    349   TestDiscardableShader second_shader;
    350   SkPaint second_paint;
    351   second_paint.setShader(&second_shader);
    352 
    353   SkPath path;
    354   path.moveTo(12, 13);
    355   path.lineTo(50, 50);
    356   path.lineTo(22, 101);
    357 
    358   // (12, 13, 38, 88).
    359   canvas->drawPath(path, first_paint);
    360 
    361   canvas->save();
    362   canvas->clipRect(SkRect::MakeWH(50, 50));
    363 
    364   // (12, 13, 38, 37).
    365   canvas->drawPath(path, second_paint);
    366 
    367   canvas->restore();
    368 
    369   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    370 
    371   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    372   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    373 
    374   EXPECT_EQ(2u, pixel_refs.size());
    375   EXPECT_FLOAT_RECT_EQ(gfx::RectF(12, 13, 38, 88),
    376                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    377   EXPECT_FLOAT_RECT_EQ(gfx::RectF(12, 13, 38, 37),
    378                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    379 }
    380 
    381 TEST(PixelRefUtilsTest, DrawBitmap) {
    382   gfx::Rect layer_rect(0, 0, 256, 256);
    383 
    384   SkPictureRecorder recorder;
    385   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    386 
    387   SkBitmap first;
    388   CreateBitmap(gfx::Size(50, 50), "discardable", &first);
    389   SkBitmap second;
    390   CreateBitmap(gfx::Size(50, 50), "discardable", &second);
    391   SkBitmap third;
    392   CreateBitmap(gfx::Size(50, 50), "discardable", &third);
    393   SkBitmap fourth;
    394   CreateBitmap(gfx::Size(50, 1), "discardable", &fourth);
    395   SkBitmap fifth;
    396   CreateBitmap(gfx::Size(10, 10), "discardable", &fifth);
    397 
    398   canvas->save();
    399 
    400   // At (0, 0).
    401   canvas->drawBitmap(first, 0, 0);
    402   canvas->translate(25, 0);
    403   // At (25, 0).
    404   canvas->drawBitmap(second, 0, 0);
    405   canvas->translate(0, 50);
    406   // At (50, 50).
    407   canvas->drawBitmap(third, 25, 0);
    408 
    409   canvas->restore();
    410   canvas->save();
    411 
    412   canvas->translate(1, 0);
    413   canvas->rotate(90);
    414   // At (1, 0), rotated 90 degrees
    415   canvas->drawBitmap(fourth, 0, 0);
    416 
    417   canvas->restore();
    418 
    419   canvas->scale(5, 6);
    420   // At (0, 0), scaled by 5 and 6
    421   canvas->drawBitmap(fifth, 0, 0);
    422 
    423   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    424 
    425   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    426   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    427 
    428   EXPECT_EQ(5u, pixel_refs.size());
    429   EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 50),
    430                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    431   EXPECT_FLOAT_RECT_EQ(gfx::RectF(25, 0, 50, 50),
    432                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    433   EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50),
    434                        gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect));
    435   EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 1, 50),
    436                        gfx::SkRectToRectF(pixel_refs[3].pixel_ref_rect));
    437   EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 60),
    438                        gfx::SkRectToRectF(pixel_refs[4].pixel_ref_rect));
    439 
    440 }
    441 
    442 TEST(PixelRefUtilsTest, DrawBitmapRect) {
    443   gfx::Rect layer_rect(0, 0, 256, 256);
    444 
    445   SkPictureRecorder recorder;
    446   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    447 
    448   SkBitmap first;
    449   CreateBitmap(gfx::Size(50, 50), "discardable", &first);
    450   SkBitmap second;
    451   CreateBitmap(gfx::Size(50, 50), "discardable", &second);
    452   SkBitmap third;
    453   CreateBitmap(gfx::Size(50, 50), "discardable", &third);
    454 
    455   TestDiscardableShader first_shader;
    456   SkPaint first_paint;
    457   first_paint.setShader(&first_shader);
    458 
    459   SkPaint non_discardable_paint;
    460 
    461   canvas->save();
    462 
    463   // (0, 0, 100, 100).
    464   canvas->drawBitmapRect(
    465       first, SkRect::MakeWH(100, 100), &non_discardable_paint);
    466   canvas->translate(25, 0);
    467   // (75, 50, 10, 10).
    468   canvas->drawBitmapRect(
    469       second, SkRect::MakeXYWH(50, 50, 10, 10), &non_discardable_paint);
    470   canvas->translate(5, 50);
    471   // (0, 30, 100, 100). One from bitmap, one from paint.
    472   canvas->drawBitmapRect(
    473       third, SkRect::MakeXYWH(-30, -20, 100, 100), &first_paint);
    474 
    475   canvas->restore();
    476 
    477   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    478 
    479   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    480   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    481 
    482   EXPECT_EQ(4u, pixel_refs.size());
    483   EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 100, 100),
    484                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    485   EXPECT_FLOAT_RECT_EQ(gfx::RectF(75, 50, 10, 10),
    486                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    487   EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 30, 100, 100),
    488                        gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect));
    489   EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 30, 100, 100),
    490                        gfx::SkRectToRectF(pixel_refs[3].pixel_ref_rect));
    491 }
    492 
    493 TEST(PixelRefUtilsTest, DrawSprite) {
    494   gfx::Rect layer_rect(0, 0, 256, 256);
    495 
    496   SkPictureRecorder recorder;
    497   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    498 
    499   SkBitmap first;
    500   CreateBitmap(gfx::Size(50, 50), "discardable", &first);
    501   SkBitmap second;
    502   CreateBitmap(gfx::Size(50, 50), "discardable", &second);
    503   SkBitmap third;
    504   CreateBitmap(gfx::Size(50, 50), "discardable", &third);
    505   SkBitmap fourth;
    506   CreateBitmap(gfx::Size(50, 50), "discardable", &fourth);
    507   SkBitmap fifth;
    508   CreateBitmap(gfx::Size(50, 50), "discardable", &fifth);
    509 
    510   canvas->save();
    511 
    512   // Sprites aren't affected by the current matrix.
    513 
    514   // (0, 0, 50, 50).
    515   canvas->drawSprite(first, 0, 0);
    516   canvas->translate(25, 0);
    517   // (10, 0, 50, 50).
    518   canvas->drawSprite(second, 10, 0);
    519   canvas->translate(0, 50);
    520   // (25, 0, 50, 50).
    521   canvas->drawSprite(third, 25, 0);
    522 
    523   canvas->restore();
    524   canvas->save();
    525 
    526   canvas->rotate(90);
    527   // (0, 0, 50, 50).
    528   canvas->drawSprite(fourth, 0, 0);
    529 
    530   canvas->restore();
    531 
    532   TestDiscardableShader first_shader;
    533   SkPaint first_paint;
    534   first_paint.setShader(&first_shader);
    535 
    536   canvas->scale(5, 6);
    537   // (100, 100, 50, 50).
    538   canvas->drawSprite(fifth, 100, 100, &first_paint);
    539 
    540   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    541 
    542   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    543   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    544 
    545   EXPECT_EQ(6u, pixel_refs.size());
    546   EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 50),
    547                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    548   EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 0, 50, 50),
    549                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    550   EXPECT_FLOAT_RECT_EQ(gfx::RectF(25, 0, 50, 50),
    551                        gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect));
    552   EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 50),
    553                        gfx::SkRectToRectF(pixel_refs[3].pixel_ref_rect));
    554   EXPECT_FLOAT_RECT_EQ(gfx::RectF(100, 100, 50, 50),
    555                        gfx::SkRectToRectF(pixel_refs[4].pixel_ref_rect));
    556   EXPECT_FLOAT_RECT_EQ(gfx::RectF(100, 100, 50, 50),
    557                        gfx::SkRectToRectF(pixel_refs[5].pixel_ref_rect));
    558 }
    559 
    560 TEST(PixelRefUtilsTest, DrawText) {
    561   gfx::Rect layer_rect(0, 0, 256, 256);
    562 
    563   SkPictureRecorder recorder;
    564   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    565 
    566   TestDiscardableShader first_shader;
    567   SkPaint first_paint;
    568   first_paint.setShader(&first_shader);
    569 
    570   SkPoint points[4];
    571   points[0].set(10, 50);
    572   points[1].set(20, 50);
    573   points[2].set(30, 50);
    574   points[3].set(40, 50);
    575 
    576   SkPath path;
    577   path.moveTo(10, 50);
    578   path.lineTo(20, 50);
    579   path.lineTo(30, 50);
    580   path.lineTo(40, 50);
    581   path.lineTo(50, 50);
    582 
    583   canvas->drawText("text", 4, 50, 50, first_paint);
    584   canvas->drawPosText("text", 4, points, first_paint);
    585   canvas->drawTextOnPath("text", 4, path, NULL, first_paint);
    586 
    587   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    588 
    589   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    590   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    591 
    592   EXPECT_EQ(3u, pixel_refs.size());
    593 }
    594 
    595 TEST(PixelRefUtilsTest, DrawVertices) {
    596   gfx::Rect layer_rect(0, 0, 256, 256);
    597 
    598   SkPictureRecorder recorder;
    599   SkCanvas* canvas = StartRecording(&recorder, layer_rect);
    600 
    601   TestDiscardableShader first_shader;
    602   SkPaint first_paint;
    603   first_paint.setShader(&first_shader);
    604 
    605   TestDiscardableShader second_shader;
    606   SkPaint second_paint;
    607   second_paint.setShader(&second_shader);
    608 
    609   TestDiscardableShader third_shader;
    610   SkPaint third_paint;
    611   third_paint.setShader(&third_shader);
    612 
    613   SkPoint points[3];
    614   SkColor colors[3];
    615   uint16_t indecies[3] = {0, 1, 2};
    616   points[0].set(10, 10);
    617   points[1].set(100, 20);
    618   points[2].set(50, 100);
    619   // (10, 10, 90, 90).
    620   canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
    621                        3,
    622                        points,
    623                        points,
    624                        colors,
    625                        NULL,
    626                        indecies,
    627                        3,
    628                        first_paint);
    629 
    630   canvas->save();
    631 
    632   canvas->clipRect(SkRect::MakeWH(50, 50));
    633   // (10, 10, 40, 40).
    634   canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
    635                        3,
    636                        points,
    637                        points,
    638                        colors,
    639                        NULL,
    640                        indecies,
    641                        3,
    642                        second_paint);
    643 
    644   canvas->restore();
    645 
    646   points[0].set(50, 55);
    647   points[1].set(50, 55);
    648   points[2].set(200, 200);
    649   // (50, 55, 150, 145).
    650   canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
    651                        3,
    652                        points,
    653                        points,
    654                        colors,
    655                        NULL,
    656                        indecies,
    657                        3,
    658                        third_paint);
    659 
    660   skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas));
    661 
    662   std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs;
    663   skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs);
    664 
    665   EXPECT_EQ(3u, pixel_refs.size());
    666   EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 90, 90),
    667                        gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect));
    668   EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 40, 40),
    669                        gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect));
    670   EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 55, 150, 145),
    671                        gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect));
    672 }
    673 
    674 }  // namespace skia
    675