OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/graphics/paint/DrawingDisplayItem.h" | 5 #include "platform/graphics/paint/DrawingDisplayItem.h" |
6 | 6 |
7 #include "platform/graphics/GraphicsContext.h" | 7 #include "platform/graphics/GraphicsContext.h" |
| 8 #include "platform/graphics/paint/PaintCanvas.h" |
8 #include "public/platform/WebDisplayItemList.h" | 9 #include "public/platform/WebDisplayItemList.h" |
9 #include "third_party/skia/include/core/SkBitmap.h" | 10 #include "third_party/skia/include/core/SkBitmap.h" |
10 #include "third_party/skia/include/core/SkCanvas.h" | 11 #include "third_party/skia/include/core/SkCanvas.h" |
11 #include "third_party/skia/include/core/SkData.h" | 12 #include "third_party/skia/include/core/SkData.h" |
12 #include "third_party/skia/include/core/SkPictureAnalyzer.h" | 13 #include "third_party/skia/include/core/SkPictureAnalyzer.h" |
13 | 14 |
14 namespace blink { | 15 namespace blink { |
15 | 16 |
16 void DrawingDisplayItem::replay(GraphicsContext& context) const { | 17 void DrawingDisplayItem::replay(GraphicsContext& context) const { |
17 if (m_picture) | 18 if (m_picture) |
(...skipping 22 matching lines...) Expand all Loading... |
40 DisplayItem::dumpPropertiesAsDebugString(stringBuilder); | 41 DisplayItem::dumpPropertiesAsDebugString(stringBuilder); |
41 if (m_picture) { | 42 if (m_picture) { |
42 stringBuilder.append( | 43 stringBuilder.append( |
43 String::format(", rect: [%f,%f %fx%f]", m_picture->cullRect().x(), | 44 String::format(", rect: [%f,%f %fx%f]", m_picture->cullRect().x(), |
44 m_picture->cullRect().y(), m_picture->cullRect().width(), | 45 m_picture->cullRect().y(), m_picture->cullRect().width(), |
45 m_picture->cullRect().height())); | 46 m_picture->cullRect().height())); |
46 } | 47 } |
47 } | 48 } |
48 #endif | 49 #endif |
49 | 50 |
50 static bool picturesEqual(const SkPicture* picture1, | 51 static bool picturesEqual(const PaintRecord* picture1, |
51 const SkPicture* picture2) { | 52 const PaintRecord* picture2) { |
52 if (picture1->approximateOpCount() != picture2->approximateOpCount()) | 53 if (picture1->approximateOpCount() != picture2->approximateOpCount()) |
53 return false; | 54 return false; |
54 | 55 |
55 sk_sp<SkData> data1 = picture1->serialize(); | 56 sk_sp<SkData> data1 = ToSkPicture(picture1)->serialize(); |
56 sk_sp<SkData> data2 = picture2->serialize(); | 57 sk_sp<SkData> data2 = ToSkPicture(picture2)->serialize(); |
57 return data1->equals(data2.get()); | 58 return data1->equals(data2.get()); |
58 } | 59 } |
59 | 60 |
60 static SkBitmap pictureToBitmap(const SkPicture* picture) { | 61 static SkBitmap pictureToBitmap(const PaintRecord* picture) { |
61 SkBitmap bitmap; | 62 SkBitmap bitmap; |
62 SkRect rect = picture->cullRect(); | 63 SkRect rect = picture->cullRect(); |
63 bitmap.allocPixels(SkImageInfo::MakeN32Premul(rect.width(), rect.height())); | 64 bitmap.allocPixels(SkImageInfo::MakeN32Premul(rect.width(), rect.height())); |
64 SkCanvas canvas(bitmap); | 65 SkCanvas bitmapCanvas(bitmap); |
| 66 PaintCanvasPassThrough canvas(&bitmapCanvas); |
65 canvas.clear(SK_ColorTRANSPARENT); | 67 canvas.clear(SK_ColorTRANSPARENT); |
66 canvas.translate(-rect.x(), -rect.y()); | 68 canvas.translate(-rect.x(), -rect.y()); |
67 canvas.drawPicture(picture); | 69 canvas.drawPicture(picture); |
68 return bitmap; | 70 return bitmap; |
69 } | 71 } |
70 | 72 |
71 static bool bitmapsEqual(const SkPicture* picture1, const SkPicture* picture2) { | 73 static bool bitmapsEqual(const PaintRecord* picture1, |
| 74 const PaintRecord* picture2) { |
72 SkRect rect = picture1->cullRect(); | 75 SkRect rect = picture1->cullRect(); |
73 if (rect != picture2->cullRect()) | 76 if (rect != picture2->cullRect()) |
74 return false; | 77 return false; |
75 | 78 |
76 SkBitmap bitmap1 = pictureToBitmap(picture1); | 79 SkBitmap bitmap1 = pictureToBitmap(picture1); |
77 SkBitmap bitmap2 = pictureToBitmap(picture2); | 80 SkBitmap bitmap2 = pictureToBitmap(picture2); |
78 bitmap1.lockPixels(); | 81 bitmap1.lockPixels(); |
79 bitmap2.lockPixels(); | 82 bitmap2.lockPixels(); |
80 int mismatchCount = 0; | 83 int mismatchCount = 0; |
81 const int maxMismatches = 10; | 84 const int maxMismatches = 10; |
(...skipping 10 matching lines...) Expand all Loading... |
92 } | 95 } |
93 bitmap1.unlockPixels(); | 96 bitmap1.unlockPixels(); |
94 bitmap2.unlockPixels(); | 97 bitmap2.unlockPixels(); |
95 return !mismatchCount; | 98 return !mismatchCount; |
96 } | 99 } |
97 | 100 |
98 bool DrawingDisplayItem::equals(const DisplayItem& other) const { | 101 bool DrawingDisplayItem::equals(const DisplayItem& other) const { |
99 if (!DisplayItem::equals(other)) | 102 if (!DisplayItem::equals(other)) |
100 return false; | 103 return false; |
101 | 104 |
102 const SkPicture* picture = this->picture(); | 105 const PaintRecord* picture = this->picture(); |
103 const SkPicture* otherPicture = | 106 const PaintRecord* otherPicture = |
104 static_cast<const DrawingDisplayItem&>(other).picture(); | 107 static_cast<const DrawingDisplayItem&>(other).picture(); |
105 | 108 |
106 if (!picture && !otherPicture) | 109 if (!picture && !otherPicture) |
107 return true; | 110 return true; |
108 if (!picture || !otherPicture) | 111 if (!picture || !otherPicture) |
109 return false; | 112 return false; |
110 | 113 |
111 if (picturesEqual(picture, otherPicture)) | 114 if (picturesEqual(picture, otherPicture)) |
112 return true; | 115 return true; |
113 | 116 |
114 // Sometimes the client may produce different pictures for the same visual | 117 // Sometimes the client may produce different pictures for the same visual |
115 // result, which should be treated as equal. | 118 // result, which should be treated as equal. |
116 return bitmapsEqual(picture, otherPicture); | 119 return bitmapsEqual(picture, otherPicture); |
117 } | 120 } |
118 | 121 |
119 } // namespace blink | 122 } // namespace blink |
OLD | NEW |