| 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 "cc/playback/display_item_list.h" | 5 #include "cc/playback/display_item_list.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "cc/output/filter_operation.h" | 12 #include "cc/output/filter_operation.h" |
| 13 #include "cc/output/filter_operations.h" | 13 #include "cc/output/filter_operations.h" |
| 14 #include "cc/playback/clip_display_item.h" | 14 #include "cc/playback/clip_display_item.h" |
| 15 #include "cc/playback/clip_path_display_item.h" | 15 #include "cc/playback/clip_path_display_item.h" |
| 16 #include "cc/playback/compositing_display_item.h" | 16 #include "cc/playback/compositing_display_item.h" |
| 17 #include "cc/playback/display_item_list_settings.h" | 17 #include "cc/playback/display_item_list_settings.h" |
| 18 #include "cc/playback/drawing_display_item.h" | 18 #include "cc/playback/drawing_display_item.h" |
| 19 #include "cc/playback/filter_display_item.h" | 19 #include "cc/playback/filter_display_item.h" |
| 20 #include "cc/playback/float_clip_display_item.h" | 20 #include "cc/playback/float_clip_display_item.h" |
| 21 #include "cc/playback/transform_display_item.h" | 21 #include "cc/playback/transform_display_item.h" |
| 22 #include "cc/proto/display_item.pb.h" | 22 #include "cc/proto/display_item.pb.h" |
| 23 #include "cc/test/fake_client_picture_cache.h" | 23 #include "cc/test/fake_client_picture_cache.h" |
| 24 #include "cc/test/fake_engine_picture_cache.h" | 24 #include "cc/test/fake_engine_picture_cache.h" |
| 25 #include "cc/test/fake_image_serialization_processor.h" | 25 #include "cc/test/fake_image_serialization_processor.h" |
| 26 #include "cc/test/geometry_test_utils.h" |
| 26 #include "cc/test/skia_common.h" | 27 #include "cc/test/skia_common.h" |
| 27 #include "testing/gmock/include/gmock/gmock.h" | 28 #include "testing/gmock/include/gmock/gmock.h" |
| 28 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
| 29 #include "third_party/skia/include/core/SkBitmap.h" | 30 #include "third_party/skia/include/core/SkBitmap.h" |
| 30 #include "third_party/skia/include/core/SkCanvas.h" | 31 #include "third_party/skia/include/core/SkCanvas.h" |
| 31 #include "third_party/skia/include/core/SkColor.h" | 32 #include "third_party/skia/include/core/SkColor.h" |
| 32 #include "third_party/skia/include/core/SkPictureRecorder.h" | 33 #include "third_party/skia/include/core/SkPictureRecorder.h" |
| 33 #include "third_party/skia/include/core/SkSurface.h" | 34 #include "third_party/skia/include/core/SkSurface.h" |
| 34 #include "third_party/skia/include/core/SkXfermode.h" | 35 #include "third_party/skia/include/core/SkXfermode.h" |
| 35 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" | 36 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" |
| 36 #include "third_party/skia/include/effects/SkImageSource.h" | 37 #include "third_party/skia/include/effects/SkImageSource.h" |
| 37 #include "third_party/skia/include/utils/SkPictureUtils.h" | 38 #include "third_party/skia/include/utils/SkPictureUtils.h" |
| 38 #include "ui/gfx/geometry/rect.h" | 39 #include "ui/gfx/geometry/rect.h" |
| 39 #include "ui/gfx/geometry/rect_conversions.h" | 40 #include "ui/gfx/geometry/rect_conversions.h" |
| 40 #include "ui/gfx/skia_util.h" | 41 #include "ui/gfx/skia_util.h" |
| 41 | 42 |
| 42 namespace cc { | 43 namespace cc { |
| 43 | 44 |
| 44 namespace { | 45 namespace { |
| 45 | 46 |
| 46 const gfx::Rect kVisualRect(0, 0, 42, 42); | 47 const gfx::Rect kVisualRect(0, 0, 42, 42); |
| 47 | 48 |
| 49 scoped_refptr<DisplayItemList> CreateDefaultList() { |
| 50 return DisplayItemList::Create(gfx::Rect(), DisplayItemListSettings()); |
| 51 } |
| 52 |
| 53 sk_sp<const SkPicture> CreateRectPicture(const gfx::Rect& bounds) { |
| 54 SkPictureRecorder recorder; |
| 55 sk_sp<SkCanvas> canvas; |
| 56 |
| 57 canvas = sk_ref_sp(recorder.beginRecording(bounds.width(), bounds.height())); |
| 58 canvas->drawRect( |
| 59 SkRect::MakeXYWH(bounds.x(), bounds.y(), bounds.width(), bounds.height()), |
| 60 SkPaint()); |
| 61 return recorder.finishRecordingAsPicture(); |
| 62 } |
| 63 |
| 48 void AppendFirstSerializationTestPicture(scoped_refptr<DisplayItemList> list, | 64 void AppendFirstSerializationTestPicture(scoped_refptr<DisplayItemList> list, |
| 49 const gfx::Size& layer_size) { | 65 const gfx::Size& layer_size) { |
| 50 gfx::PointF offset(2.f, 3.f); | 66 gfx::PointF offset(2.f, 3.f); |
| 51 SkPictureRecorder recorder; | 67 SkPictureRecorder recorder; |
| 52 sk_sp<SkCanvas> canvas; | 68 sk_sp<SkCanvas> canvas; |
| 53 | 69 |
| 54 SkPaint red_paint; | 70 SkPaint red_paint; |
| 55 red_paint.setColor(SK_ColorRED); | 71 red_paint.setColor(SK_ColorRED); |
| 56 | 72 |
| 57 canvas = sk_ref_sp(recorder.beginRecording(SkRect::MakeXYWH( | 73 canvas = sk_ref_sp(recorder.beginRecording(SkRect::MakeXYWH( |
| 58 offset.x(), offset.y(), layer_size.width(), layer_size.height()))); | 74 offset.x(), offset.y(), layer_size.width(), layer_size.height()))); |
| 59 canvas->translate(offset.x(), offset.y()); | 75 canvas->translate(offset.x(), offset.y()); |
| 60 canvas->drawRectCoords(0.f, 0.f, 4.f, 4.f, red_paint); | 76 canvas->drawRectCoords(0.f, 0.f, 4.f, 4.f, red_paint); |
| 61 list->CreateAndAppendItem<DrawingDisplayItem>( | 77 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 62 kVisualRect, recorder.finishRecordingAsPicture()); | 78 kVisualRect, recorder.finishRecordingAsPicture()); |
| 63 } | 79 } |
| 64 | 80 |
| 65 void AppendSecondSerializationTestPicture(scoped_refptr<DisplayItemList> list, | 81 void AppendSecondSerializationTestPicture(scoped_refptr<DisplayItemList> list, |
| 66 const gfx::Size& layer_size) { | 82 const gfx::Size& layer_size) { |
| 67 gfx::PointF offset(2.f, 2.f); | 83 gfx::PointF offset(2.f, 2.f); |
| 68 SkPictureRecorder recorder; | 84 SkPictureRecorder recorder; |
| 69 sk_sp<SkCanvas> canvas; | 85 sk_sp<SkCanvas> canvas; |
| 70 | 86 |
| 71 SkPaint blue_paint; | 87 SkPaint blue_paint; |
| 72 blue_paint.setColor(SK_ColorBLUE); | 88 blue_paint.setColor(SK_ColorBLUE); |
| 73 | 89 |
| 74 canvas = sk_ref_sp(recorder.beginRecording(SkRect::MakeXYWH( | 90 canvas = sk_ref_sp(recorder.beginRecording(SkRect::MakeXYWH( |
| 75 offset.x(), offset.y(), layer_size.width(), layer_size.height()))); | 91 offset.x(), offset.y(), layer_size.width(), layer_size.height()))); |
| 76 canvas->translate(offset.x(), offset.y()); | 92 canvas->translate(offset.x(), offset.y()); |
| 77 canvas->drawRectCoords(3.f, 3.f, 7.f, 7.f, blue_paint); | 93 canvas->drawRectCoords(3.f, 3.f, 7.f, 7.f, blue_paint); |
| 78 list->CreateAndAppendItem<DrawingDisplayItem>( | 94 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 79 kVisualRect, recorder.finishRecordingAsPicture()); | 95 kVisualRect, recorder.finishRecordingAsPicture()); |
| 80 } | 96 } |
| 81 | 97 |
| 82 void ValidateDisplayItemListSerialization(const gfx::Size& layer_size, | 98 void ValidateDisplayItemListSerialization(const gfx::Size& layer_size, |
| 83 scoped_refptr<DisplayItemList> list) { | 99 scoped_refptr<DisplayItemList> list) { |
| 84 list->Finalize(); | 100 list->Finalize(); |
| 85 | 101 |
| 86 std::unique_ptr<FakeImageSerializationProcessor> | 102 std::unique_ptr<FakeImageSerializationProcessor> |
| 87 fake_image_serialization_processor = | 103 fake_image_serialization_processor = |
| 88 base::WrapUnique(new FakeImageSerializationProcessor); | 104 base::WrapUnique(new FakeImageSerializationProcessor); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 scoped_refptr<DisplayItemList> list = | 169 scoped_refptr<DisplayItemList> list = |
| 154 DisplayItemList::Create(gfx::Rect(layer_size), settings); | 170 DisplayItemList::Create(gfx::Rect(layer_size), settings); |
| 155 | 171 |
| 156 // Build the DrawingDisplayItem. | 172 // Build the DrawingDisplayItem. |
| 157 AppendFirstSerializationTestPicture(list, layer_size); | 173 AppendFirstSerializationTestPicture(list, layer_size); |
| 158 | 174 |
| 159 // Build the ClipDisplayItem. | 175 // Build the ClipDisplayItem. |
| 160 gfx::Rect clip_rect(6, 6, 1, 1); | 176 gfx::Rect clip_rect(6, 6, 1, 1); |
| 161 std::vector<SkRRect> rrects; | 177 std::vector<SkRRect> rrects; |
| 162 rrects.push_back(SkRRect::MakeOval(SkRect::MakeXYWH(5.f, 5.f, 4.f, 4.f))); | 178 rrects.push_back(SkRRect::MakeOval(SkRect::MakeXYWH(5.f, 5.f, 4.f, 4.f))); |
| 163 list->CreateAndAppendItem<ClipDisplayItem>(kVisualRect, clip_rect, rrects, | 179 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>(clip_rect, rrects, |
| 164 true); | 180 true); |
| 165 | 181 |
| 166 // Build the second DrawingDisplayItem. | 182 // Build the second DrawingDisplayItem. |
| 167 AppendSecondSerializationTestPicture(list, layer_size); | 183 AppendSecondSerializationTestPicture(list, layer_size); |
| 168 | 184 |
| 169 // Build the EndClipDisplayItem. | 185 // Build the EndClipDisplayItem. |
| 170 list->CreateAndAppendItem<EndClipDisplayItem>(kVisualRect); | 186 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 171 | 187 |
| 172 ValidateDisplayItemListSerialization(layer_size, list); | 188 ValidateDisplayItemListSerialization(layer_size, list); |
| 173 } | 189 } |
| 174 | 190 |
| 175 TEST(DisplayItemListTest, SerializeClipPathItem) { | 191 TEST(DisplayItemListTest, SerializeClipPathItem) { |
| 176 gfx::Size layer_size(10, 10); | 192 gfx::Size layer_size(10, 10); |
| 177 | 193 |
| 178 DisplayItemListSettings settings; | 194 DisplayItemListSettings settings; |
| 179 scoped_refptr<DisplayItemList> list = | 195 scoped_refptr<DisplayItemList> list = |
| 180 DisplayItemList::Create(gfx::Rect(layer_size), settings); | 196 DisplayItemList::Create(gfx::Rect(layer_size), settings); |
| 181 | 197 |
| 182 // Build the DrawingDisplayItem. | 198 // Build the DrawingDisplayItem. |
| 183 AppendFirstSerializationTestPicture(list, layer_size); | 199 AppendFirstSerializationTestPicture(list, layer_size); |
| 184 | 200 |
| 185 // Build the ClipPathDisplayItem. | 201 // Build the ClipPathDisplayItem. |
| 186 SkPath path; | 202 SkPath path; |
| 187 path.addCircle(5.f, 5.f, 2.f, SkPath::Direction::kCW_Direction); | 203 path.addCircle(5.f, 5.f, 2.f, SkPath::Direction::kCW_Direction); |
| 188 list->CreateAndAppendItem<ClipPathDisplayItem>( | 204 list->CreateAndAppendPairedBeginItem<ClipPathDisplayItem>( |
| 189 kVisualRect, path, SkRegion::Op::kReplace_Op, false); | 205 path, SkRegion::Op::kReplace_Op, false); |
| 190 | 206 |
| 191 // Build the second DrawingDisplayItem. | 207 // Build the second DrawingDisplayItem. |
| 192 AppendSecondSerializationTestPicture(list, layer_size); | 208 AppendSecondSerializationTestPicture(list, layer_size); |
| 193 | 209 |
| 194 // Build the EndClipPathDisplayItem. | 210 // Build the EndClipPathDisplayItem. |
| 195 list->CreateAndAppendItem<EndClipPathDisplayItem>(kVisualRect); | 211 list->CreateAndAppendPairedEndItem<EndClipPathDisplayItem>(); |
| 196 | 212 |
| 197 ValidateDisplayItemListSerialization(layer_size, list); | 213 ValidateDisplayItemListSerialization(layer_size, list); |
| 198 } | 214 } |
| 199 | 215 |
| 200 TEST(DisplayItemListTest, SerializeCompositingItem) { | 216 TEST(DisplayItemListTest, SerializeCompositingItem) { |
| 201 gfx::Size layer_size(10, 10); | 217 gfx::Size layer_size(10, 10); |
| 202 | 218 |
| 203 DisplayItemListSettings settings; | 219 DisplayItemListSettings settings; |
| 204 scoped_refptr<DisplayItemList> list = | 220 scoped_refptr<DisplayItemList> list = |
| 205 DisplayItemList::Create(gfx::Rect(layer_size), settings); | 221 DisplayItemList::Create(gfx::Rect(layer_size), settings); |
| 206 | 222 |
| 207 // Build the DrawingDisplayItem. | 223 // Build the DrawingDisplayItem. |
| 208 AppendFirstSerializationTestPicture(list, layer_size); | 224 AppendFirstSerializationTestPicture(list, layer_size); |
| 209 | 225 |
| 210 // Build the CompositingDisplayItem. | 226 // Build the CompositingDisplayItem. |
| 211 list->CreateAndAppendItem<CompositingDisplayItem>( | 227 list->CreateAndAppendPairedBeginItem<CompositingDisplayItem>( |
| 212 kVisualRect, 150, SkXfermode::Mode::kDst_Mode, nullptr, | 228 150, SkXfermode::Mode::kDst_Mode, nullptr, |
| 213 SkColorMatrixFilter::MakeLightingFilter(SK_ColorRED, SK_ColorGREEN), | 229 SkColorMatrixFilter::MakeLightingFilter(SK_ColorRED, SK_ColorGREEN), |
| 214 false); | 230 false); |
| 215 | 231 |
| 216 // Build the second DrawingDisplayItem. | 232 // Build the second DrawingDisplayItem. |
| 217 AppendSecondSerializationTestPicture(list, layer_size); | 233 AppendSecondSerializationTestPicture(list, layer_size); |
| 218 | 234 |
| 219 // Build the EndCompositingDisplayItem. | 235 // Build the EndCompositingDisplayItem. |
| 220 list->CreateAndAppendItem<EndCompositingDisplayItem>(kVisualRect); | 236 list->CreateAndAppendPairedEndItem<EndCompositingDisplayItem>(); |
| 221 | 237 |
| 222 ValidateDisplayItemListSerialization(layer_size, list); | 238 ValidateDisplayItemListSerialization(layer_size, list); |
| 223 } | 239 } |
| 224 | 240 |
| 225 TEST(DisplayItemListTest, SerializeFloatClipItem) { | 241 TEST(DisplayItemListTest, SerializeFloatClipItem) { |
| 226 gfx::Size layer_size(10, 10); | 242 gfx::Size layer_size(10, 10); |
| 227 | 243 |
| 228 DisplayItemListSettings settings; | 244 DisplayItemListSettings settings; |
| 229 scoped_refptr<DisplayItemList> list = | 245 scoped_refptr<DisplayItemList> list = |
| 230 DisplayItemList::Create(gfx::Rect(layer_size), settings); | 246 DisplayItemList::Create(gfx::Rect(layer_size), settings); |
| 231 | 247 |
| 232 // Build the DrawingDisplayItem. | 248 // Build the DrawingDisplayItem. |
| 233 AppendFirstSerializationTestPicture(list, layer_size); | 249 AppendFirstSerializationTestPicture(list, layer_size); |
| 234 | 250 |
| 235 // Build the FloatClipDisplayItem. | 251 // Build the FloatClipDisplayItem. |
| 236 gfx::RectF clip_rect(6.f, 6.f, 1.f, 1.f); | 252 gfx::RectF clip_rect(6.f, 6.f, 1.f, 1.f); |
| 237 list->CreateAndAppendItem<FloatClipDisplayItem>(kVisualRect, clip_rect); | 253 list->CreateAndAppendPairedBeginItem<FloatClipDisplayItem>(clip_rect); |
| 238 | 254 |
| 239 // Build the second DrawingDisplayItem. | 255 // Build the second DrawingDisplayItem. |
| 240 AppendSecondSerializationTestPicture(list, layer_size); | 256 AppendSecondSerializationTestPicture(list, layer_size); |
| 241 | 257 |
| 242 // Build the EndFloatClipDisplayItem. | 258 // Build the EndFloatClipDisplayItem. |
| 243 list->CreateAndAppendItem<EndFloatClipDisplayItem>(kVisualRect); | 259 list->CreateAndAppendPairedEndItem<EndFloatClipDisplayItem>(); |
| 244 | 260 |
| 245 ValidateDisplayItemListSerialization(layer_size, list); | 261 ValidateDisplayItemListSerialization(layer_size, list); |
| 246 } | 262 } |
| 247 | 263 |
| 248 TEST(DisplayItemListTest, SerializeTransformItem) { | 264 TEST(DisplayItemListTest, SerializeTransformItem) { |
| 249 gfx::Size layer_size(10, 10); | 265 gfx::Size layer_size(10, 10); |
| 250 | 266 |
| 251 DisplayItemListSettings settings; | 267 DisplayItemListSettings settings; |
| 252 scoped_refptr<DisplayItemList> list = | 268 scoped_refptr<DisplayItemList> list = |
| 253 DisplayItemList::Create(gfx::Rect(layer_size), settings); | 269 DisplayItemList::Create(gfx::Rect(layer_size), settings); |
| 254 | 270 |
| 255 // Build the DrawingDisplayItem. | 271 // Build the DrawingDisplayItem. |
| 256 AppendFirstSerializationTestPicture(list, layer_size); | 272 AppendFirstSerializationTestPicture(list, layer_size); |
| 257 | 273 |
| 258 // Build the TransformDisplayItem. | 274 // Build the TransformDisplayItem. |
| 259 gfx::Transform transform; | 275 gfx::Transform transform; |
| 260 transform.Scale(1.25f, 1.25f); | 276 transform.Scale(1.25f, 1.25f); |
| 261 transform.Translate(-1.f, -1.f); | 277 transform.Translate(-1.f, -1.f); |
| 262 list->CreateAndAppendItem<TransformDisplayItem>(kVisualRect, transform); | 278 list->CreateAndAppendPairedBeginItem<TransformDisplayItem>(transform); |
| 263 | 279 |
| 264 // Build the second DrawingDisplayItem. | 280 // Build the second DrawingDisplayItem. |
| 265 AppendSecondSerializationTestPicture(list, layer_size); | 281 AppendSecondSerializationTestPicture(list, layer_size); |
| 266 | 282 |
| 267 // Build the EndTransformDisplayItem. | 283 // Build the EndTransformDisplayItem. |
| 268 list->CreateAndAppendItem<EndTransformDisplayItem>(kVisualRect); | 284 list->CreateAndAppendPairedEndItem<EndTransformDisplayItem>(); |
| 269 | 285 |
| 270 ValidateDisplayItemListSerialization(layer_size, list); | 286 ValidateDisplayItemListSerialization(layer_size, list); |
| 271 } | 287 } |
| 272 | 288 |
| 273 TEST(DisplayItemListTest, SingleDrawingItem) { | 289 TEST(DisplayItemListTest, SingleDrawingItem) { |
| 274 gfx::Rect layer_rect(100, 100); | 290 gfx::Rect layer_rect(100, 100); |
| 275 SkPictureRecorder recorder; | 291 SkPictureRecorder recorder; |
| 276 sk_sp<SkCanvas> canvas; | 292 sk_sp<SkCanvas> canvas; |
| 277 SkPaint blue_paint; | 293 SkPaint blue_paint; |
| 278 blue_paint.setColor(SK_ColorBLUE); | 294 blue_paint.setColor(SK_ColorBLUE); |
| 279 SkPaint red_paint; | 295 SkPaint red_paint; |
| 280 red_paint.setColor(SK_ColorRED); | 296 red_paint.setColor(SK_ColorRED); |
| 281 unsigned char pixels[4 * 100 * 100] = {0}; | 297 unsigned char pixels[4 * 100 * 100] = {0}; |
| 282 DisplayItemListSettings settings; | 298 DisplayItemListSettings settings; |
| 283 scoped_refptr<DisplayItemList> list = | 299 scoped_refptr<DisplayItemList> list = |
| 284 DisplayItemList::Create(layer_rect, settings); | 300 DisplayItemList::Create(layer_rect, settings); |
| 285 | 301 |
| 286 gfx::PointF offset(8.f, 9.f); | 302 gfx::PointF offset(8.f, 9.f); |
| 287 gfx::RectF recording_rect(offset, gfx::SizeF(layer_rect.size())); | 303 gfx::RectF recording_rect(offset, gfx::SizeF(layer_rect.size())); |
| 288 canvas = | 304 canvas = |
| 289 sk_ref_sp(recorder.beginRecording(gfx::RectFToSkRect(recording_rect))); | 305 sk_ref_sp(recorder.beginRecording(gfx::RectFToSkRect(recording_rect))); |
| 290 canvas->translate(offset.x(), offset.y()); | 306 canvas->translate(offset.x(), offset.y()); |
| 291 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); | 307 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); |
| 292 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); | 308 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); |
| 293 list->CreateAndAppendItem<DrawingDisplayItem>( | 309 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 294 kVisualRect, recorder.finishRecordingAsPicture()); | 310 kVisualRect, recorder.finishRecordingAsPicture()); |
| 295 list->Finalize(); | 311 list->Finalize(); |
| 296 DrawDisplayList(pixels, layer_rect, list); | 312 DrawDisplayList(pixels, layer_rect, list); |
| 297 | 313 |
| 298 SkBitmap expected_bitmap; | 314 SkBitmap expected_bitmap; |
| 299 unsigned char expected_pixels[4 * 100 * 100] = {0}; | 315 unsigned char expected_pixels[4 * 100 * 100] = {0}; |
| 300 SkImageInfo info = | 316 SkImageInfo info = |
| 301 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); | 317 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); |
| 302 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes()); | 318 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes()); |
| 303 SkCanvas expected_canvas(expected_bitmap); | 319 SkCanvas expected_canvas(expected_bitmap); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 325 settings.use_cached_picture = true; | 341 settings.use_cached_picture = true; |
| 326 scoped_refptr<DisplayItemList> list = | 342 scoped_refptr<DisplayItemList> list = |
| 327 DisplayItemList::Create(layer_rect, settings); | 343 DisplayItemList::Create(layer_rect, settings); |
| 328 | 344 |
| 329 gfx::PointF first_offset(8.f, 9.f); | 345 gfx::PointF first_offset(8.f, 9.f); |
| 330 gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size())); | 346 gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size())); |
| 331 canvas = sk_ref_sp( | 347 canvas = sk_ref_sp( |
| 332 recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect))); | 348 recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect))); |
| 333 canvas->translate(first_offset.x(), first_offset.y()); | 349 canvas->translate(first_offset.x(), first_offset.y()); |
| 334 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); | 350 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); |
| 335 list->CreateAndAppendItem<DrawingDisplayItem>( | 351 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 336 kVisualRect, recorder.finishRecordingAsPicture()); | 352 kVisualRect, recorder.finishRecordingAsPicture()); |
| 337 | 353 |
| 338 gfx::Rect clip_rect(60, 60, 10, 10); | 354 gfx::Rect clip_rect(60, 60, 10, 10); |
| 339 list->CreateAndAppendItem<ClipDisplayItem>(kVisualRect, clip_rect, | 355 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 340 std::vector<SkRRect>(), true); | 356 clip_rect, std::vector<SkRRect>(), true); |
| 341 | 357 |
| 342 gfx::PointF second_offset(2.f, 3.f); | 358 gfx::PointF second_offset(2.f, 3.f); |
| 343 gfx::RectF second_recording_rect(second_offset, | 359 gfx::RectF second_recording_rect(second_offset, |
| 344 gfx::SizeF(layer_rect.size())); | 360 gfx::SizeF(layer_rect.size())); |
| 345 canvas = sk_ref_sp( | 361 canvas = sk_ref_sp( |
| 346 recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect))); | 362 recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect))); |
| 347 canvas->translate(second_offset.x(), second_offset.y()); | 363 canvas->translate(second_offset.x(), second_offset.y()); |
| 348 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); | 364 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); |
| 349 list->CreateAndAppendItem<DrawingDisplayItem>( | 365 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 350 kVisualRect, recorder.finishRecordingAsPicture()); | 366 kVisualRect, recorder.finishRecordingAsPicture()); |
| 351 | 367 |
| 352 list->CreateAndAppendItem<EndClipDisplayItem>(kVisualRect); | 368 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 353 list->Finalize(); | 369 list->Finalize(); |
| 354 | 370 |
| 355 DrawDisplayList(pixels, layer_rect, list); | 371 DrawDisplayList(pixels, layer_rect, list); |
| 356 | 372 |
| 357 SkBitmap expected_bitmap; | 373 SkBitmap expected_bitmap; |
| 358 unsigned char expected_pixels[4 * 100 * 100] = {0}; | 374 unsigned char expected_pixels[4 * 100 * 100] = {0}; |
| 359 SkImageInfo info = | 375 SkImageInfo info = |
| 360 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); | 376 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); |
| 361 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes()); | 377 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes()); |
| 362 SkCanvas expected_canvas(expected_bitmap); | 378 SkCanvas expected_canvas(expected_bitmap); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 385 settings.use_cached_picture = true; | 401 settings.use_cached_picture = true; |
| 386 scoped_refptr<DisplayItemList> list = | 402 scoped_refptr<DisplayItemList> list = |
| 387 DisplayItemList::Create(layer_rect, settings); | 403 DisplayItemList::Create(layer_rect, settings); |
| 388 | 404 |
| 389 gfx::PointF first_offset(8.f, 9.f); | 405 gfx::PointF first_offset(8.f, 9.f); |
| 390 gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size())); | 406 gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size())); |
| 391 canvas = sk_ref_sp( | 407 canvas = sk_ref_sp( |
| 392 recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect))); | 408 recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect))); |
| 393 canvas->translate(first_offset.x(), first_offset.y()); | 409 canvas->translate(first_offset.x(), first_offset.y()); |
| 394 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); | 410 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); |
| 395 list->CreateAndAppendItem<DrawingDisplayItem>( | 411 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 396 kVisualRect, recorder.finishRecordingAsPicture()); | 412 kVisualRect, recorder.finishRecordingAsPicture()); |
| 397 | 413 |
| 398 gfx::Transform transform; | 414 gfx::Transform transform; |
| 399 transform.Rotate(45.0); | 415 transform.Rotate(45.0); |
| 400 list->CreateAndAppendItem<TransformDisplayItem>(kVisualRect, transform); | 416 list->CreateAndAppendPairedBeginItem<TransformDisplayItem>(transform); |
| 401 | 417 |
| 402 gfx::PointF second_offset(2.f, 3.f); | 418 gfx::PointF second_offset(2.f, 3.f); |
| 403 gfx::RectF second_recording_rect(second_offset, | 419 gfx::RectF second_recording_rect(second_offset, |
| 404 gfx::SizeF(layer_rect.size())); | 420 gfx::SizeF(layer_rect.size())); |
| 405 canvas = sk_ref_sp( | 421 canvas = sk_ref_sp( |
| 406 recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect))); | 422 recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect))); |
| 407 canvas->translate(second_offset.x(), second_offset.y()); | 423 canvas->translate(second_offset.x(), second_offset.y()); |
| 408 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); | 424 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); |
| 409 list->CreateAndAppendItem<DrawingDisplayItem>( | 425 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 410 kVisualRect, recorder.finishRecordingAsPicture()); | 426 kVisualRect, recorder.finishRecordingAsPicture()); |
| 411 | 427 |
| 412 list->CreateAndAppendItem<EndTransformDisplayItem>(kVisualRect); | 428 list->CreateAndAppendPairedEndItem<EndTransformDisplayItem>(); |
| 413 list->Finalize(); | 429 list->Finalize(); |
| 414 | 430 |
| 415 DrawDisplayList(pixels, layer_rect, list); | 431 DrawDisplayList(pixels, layer_rect, list); |
| 416 | 432 |
| 417 SkBitmap expected_bitmap; | 433 SkBitmap expected_bitmap; |
| 418 unsigned char expected_pixels[4 * 100 * 100] = {0}; | 434 unsigned char expected_pixels[4 * 100 * 100] = {0}; |
| 419 SkImageInfo info = | 435 SkImageInfo info = |
| 420 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); | 436 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); |
| 421 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes()); | 437 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes()); |
| 422 SkCanvas expected_canvas(expected_bitmap); | 438 SkCanvas expected_canvas(expected_bitmap); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 // involve |src| at all. Incorrectly assuming such a relationship (e.g. by | 470 // involve |src| at all. Incorrectly assuming such a relationship (e.g. by |
| 455 // translating |dst| after it is computed by computeFastBounds, rather than | 471 // translating |dst| after it is computed by computeFastBounds, rather than |
| 456 // translating |src| before it provided to computedFastBounds) can cause | 472 // translating |src| before it provided to computedFastBounds) can cause |
| 457 // incorrect clipping of filter output. To test for this, we include an | 473 // incorrect clipping of filter output. To test for this, we include an |
| 458 // SkImageSource filter in |filters|. Here, |src| is |filter_bounds|, defined | 474 // SkImageSource filter in |filters|. Here, |src| is |filter_bounds|, defined |
| 459 // below. | 475 // below. |
| 460 sk_sp<SkImageFilter> image_filter = SkImageSource::Make(source_image); | 476 sk_sp<SkImageFilter> image_filter = SkImageSource::Make(source_image); |
| 461 filters.Append(FilterOperation::CreateReferenceFilter(image_filter)); | 477 filters.Append(FilterOperation::CreateReferenceFilter(image_filter)); |
| 462 filters.Append(FilterOperation::CreateBrightnessFilter(0.5f)); | 478 filters.Append(FilterOperation::CreateBrightnessFilter(0.5f)); |
| 463 gfx::RectF filter_bounds(10.f, 10.f, 50.f, 50.f); | 479 gfx::RectF filter_bounds(10.f, 10.f, 50.f, 50.f); |
| 464 list->CreateAndAppendItem<FilterDisplayItem>(kVisualRect, filters, | 480 list->CreateAndAppendPairedBeginItem<FilterDisplayItem>(filters, |
| 465 filter_bounds); | 481 filter_bounds); |
| 466 list->CreateAndAppendItem<EndFilterDisplayItem>(kVisualRect); | 482 list->CreateAndAppendPairedEndItem<EndFilterDisplayItem>(); |
| 467 list->Finalize(); | 483 list->Finalize(); |
| 468 | 484 |
| 469 DrawDisplayList(pixels, layer_rect, list); | 485 DrawDisplayList(pixels, layer_rect, list); |
| 470 | 486 |
| 471 SkBitmap expected_bitmap; | 487 SkBitmap expected_bitmap; |
| 472 unsigned char expected_pixels[4 * 100 * 100] = {0}; | 488 unsigned char expected_pixels[4 * 100 * 100] = {0}; |
| 473 SkPaint paint; | 489 SkPaint paint; |
| 474 paint.setColor(SkColorSetRGB(64, 64, 64)); | 490 paint.setColor(SkColorSetRGB(64, 64, 64)); |
| 475 SkImageInfo info = | 491 SkImageInfo info = |
| 476 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); | 492 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 498 no_caching_settings.use_cached_picture = false; | 514 no_caching_settings.use_cached_picture = false; |
| 499 scoped_refptr<DisplayItemList> list_without_caching = | 515 scoped_refptr<DisplayItemList> list_without_caching = |
| 500 DisplayItemList::Create(layer_rect, no_caching_settings); | 516 DisplayItemList::Create(layer_rect, no_caching_settings); |
| 501 | 517 |
| 502 canvas = | 518 canvas = |
| 503 sk_ref_sp(recorder.beginRecording(gfx::RectFToSkRect(recording_rect))); | 519 sk_ref_sp(recorder.beginRecording(gfx::RectFToSkRect(recording_rect))); |
| 504 canvas->translate(offset.x(), offset.y()); | 520 canvas->translate(offset.x(), offset.y()); |
| 505 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); | 521 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); |
| 506 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); | 522 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); |
| 507 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); | 523 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); |
| 508 list_without_caching->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, | 524 list_without_caching->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 509 picture); | 525 kVisualRect, picture); |
| 510 list_without_caching->Finalize(); | 526 list_without_caching->Finalize(); |
| 511 DrawDisplayList(pixels, layer_rect, list_without_caching); | 527 DrawDisplayList(pixels, layer_rect, list_without_caching); |
| 512 | 528 |
| 513 unsigned char expected_pixels[4 * 100 * 100] = {0}; | 529 unsigned char expected_pixels[4 * 100 * 100] = {0}; |
| 514 DisplayItemListSettings caching_settings; | 530 DisplayItemListSettings caching_settings; |
| 515 caching_settings.use_cached_picture = true; | 531 caching_settings.use_cached_picture = true; |
| 516 scoped_refptr<DisplayItemList> list_with_caching = | 532 scoped_refptr<DisplayItemList> list_with_caching = |
| 517 DisplayItemList::Create(layer_rect, caching_settings); | 533 DisplayItemList::Create(layer_rect, caching_settings); |
| 518 list_with_caching->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, | 534 list_with_caching->CreateAndAppendDrawingItem<DrawingDisplayItem>(kVisualRect, |
| 519 picture); | 535 picture); |
| 520 list_with_caching->Finalize(); | 536 list_with_caching->Finalize(); |
| 521 DrawDisplayList(expected_pixels, layer_rect, list_with_caching); | 537 DrawDisplayList(expected_pixels, layer_rect, list_with_caching); |
| 522 | 538 |
| 523 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100)); | 539 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100)); |
| 524 } | 540 } |
| 525 | 541 |
| 526 TEST(DisplayItemListTest, ApproximateMemoryUsage) { | 542 TEST(DisplayItemListTest, ApproximateMemoryUsage) { |
| 527 const int kNumCommandsInTestSkPicture = 1000; | 543 const int kNumCommandsInTestSkPicture = 1000; |
| 528 scoped_refptr<DisplayItemList> list; | 544 scoped_refptr<DisplayItemList> list; |
| 529 size_t memory_usage; | 545 size_t memory_usage; |
| 530 | 546 |
| 531 // Make an SkPicture whose size is known. | 547 // Make an SkPicture whose size is known. |
| 532 gfx::Rect layer_rect(100, 100); | 548 gfx::Rect layer_rect(100, 100); |
| 533 SkPictureRecorder recorder; | 549 SkPictureRecorder recorder; |
| 534 SkPaint blue_paint; | 550 SkPaint blue_paint; |
| 535 blue_paint.setColor(SK_ColorBLUE); | 551 blue_paint.setColor(SK_ColorBLUE); |
| 536 SkCanvas* canvas = recorder.beginRecording(gfx::RectToSkRect(layer_rect)); | 552 SkCanvas* canvas = recorder.beginRecording(gfx::RectToSkRect(layer_rect)); |
| 537 for (int i = 0; i < kNumCommandsInTestSkPicture; i++) | 553 for (int i = 0; i < kNumCommandsInTestSkPicture; i++) |
| 538 canvas->drawPaint(blue_paint); | 554 canvas->drawPaint(blue_paint); |
| 539 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); | 555 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); |
| 540 size_t picture_size = SkPictureUtils::ApproximateBytesUsed(picture.get()); | 556 size_t picture_size = SkPictureUtils::ApproximateBytesUsed(picture.get()); |
| 541 ASSERT_GE(picture_size, kNumCommandsInTestSkPicture * sizeof(blue_paint)); | 557 ASSERT_GE(picture_size, kNumCommandsInTestSkPicture * sizeof(blue_paint)); |
| 542 | 558 |
| 543 // Using a cached picture, we should get about the right size. | 559 // Using a cached picture, we should get about the right size. |
| 544 DisplayItemListSettings caching_settings; | 560 DisplayItemListSettings caching_settings; |
| 545 caching_settings.use_cached_picture = true; | 561 caching_settings.use_cached_picture = true; |
| 546 list = DisplayItemList::Create(layer_rect, caching_settings); | 562 list = DisplayItemList::Create(layer_rect, caching_settings); |
| 547 list->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, picture); | 563 list->CreateAndAppendDrawingItem<DrawingDisplayItem>(kVisualRect, picture); |
| 548 list->Finalize(); | 564 list->Finalize(); |
| 549 memory_usage = list->ApproximateMemoryUsage(); | 565 memory_usage = list->ApproximateMemoryUsage(); |
| 550 EXPECT_GE(memory_usage, picture_size); | 566 EXPECT_GE(memory_usage, picture_size); |
| 551 EXPECT_LE(memory_usage, 2 * picture_size); | 567 EXPECT_LE(memory_usage, 2 * picture_size); |
| 552 | 568 |
| 553 // Using no cached picture, we should still get the right size. | 569 // Using no cached picture, we should still get the right size. |
| 554 DisplayItemListSettings no_caching_settings; | 570 DisplayItemListSettings no_caching_settings; |
| 555 no_caching_settings.use_cached_picture = false; | 571 no_caching_settings.use_cached_picture = false; |
| 556 list = DisplayItemList::Create(layer_rect, no_caching_settings); | 572 list = DisplayItemList::Create(layer_rect, no_caching_settings); |
| 557 list->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, picture); | 573 list->CreateAndAppendDrawingItem<DrawingDisplayItem>(kVisualRect, picture); |
| 558 list->Finalize(); | 574 list->Finalize(); |
| 559 memory_usage = list->ApproximateMemoryUsage(); | 575 memory_usage = list->ApproximateMemoryUsage(); |
| 560 EXPECT_GE(memory_usage, picture_size); | 576 EXPECT_GE(memory_usage, picture_size); |
| 561 EXPECT_LE(memory_usage, 2 * picture_size); | 577 EXPECT_LE(memory_usage, 2 * picture_size); |
| 562 | 578 |
| 563 // To avoid double counting, we expect zero size to be computed if both the | 579 // To avoid double counting, we expect zero size to be computed if both the |
| 564 // picture and items are retained (currently this only happens due to certain | 580 // picture and items are retained (currently this only happens due to certain |
| 565 // categories being traced). | 581 // categories being traced). |
| 566 list = new DisplayItemList(layer_rect, caching_settings, true); | 582 list = new DisplayItemList(layer_rect, caching_settings, true); |
| 567 list->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, picture); | 583 list->CreateAndAppendDrawingItem<DrawingDisplayItem>(kVisualRect, picture); |
| 568 list->Finalize(); | 584 list->Finalize(); |
| 569 memory_usage = list->ApproximateMemoryUsage(); | 585 memory_usage = list->ApproximateMemoryUsage(); |
| 570 EXPECT_EQ(static_cast<size_t>(0), memory_usage); | 586 EXPECT_EQ(static_cast<size_t>(0), memory_usage); |
| 571 } | 587 } |
| 572 | 588 |
| 573 TEST(DisplayItemListTest, AsValueWithRectAndNoItems) { | 589 TEST(DisplayItemListTest, AsValueWithRectAndNoItems) { |
| 574 scoped_refptr<DisplayItemList> list = | 590 scoped_refptr<DisplayItemList> list = |
| 575 DisplayItemList::Create(gfx::Rect(1, 2, 8, 9), DisplayItemListSettings()); | 591 DisplayItemList::Create(gfx::Rect(1, 2, 8, 9), DisplayItemListSettings()); |
| 576 list->Finalize(); | 592 list->Finalize(); |
| 577 | 593 |
| 578 std::string value = list->AsValue(true)->ToString(); | 594 std::string value = list->AsValue(true)->ToString(); |
| 579 EXPECT_NE(value.find("\"items\":[]"), std::string::npos); | 595 EXPECT_NE(value.find("\"items\":[]"), std::string::npos); |
| 580 EXPECT_NE(value.find("\"layer_rect\":[1,2,8,9]"), std::string::npos); | 596 EXPECT_NE(value.find("\"layer_rect\":[1,2,8,9]"), std::string::npos); |
| 581 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); | 597 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); |
| 582 | 598 |
| 583 value = list->AsValue(false)->ToString(); | 599 value = list->AsValue(false)->ToString(); |
| 584 EXPECT_EQ(value.find("\"items\":"), std::string::npos); | 600 EXPECT_EQ(value.find("\"items\":"), std::string::npos); |
| 585 EXPECT_NE(value.find("\"layer_rect\":[1,2,8,9]"), std::string::npos); | 601 EXPECT_NE(value.find("\"layer_rect\":[1,2,8,9]"), std::string::npos); |
| 586 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); | 602 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); |
| 587 } | 603 } |
| 588 | 604 |
| 589 TEST(DisplayItemListTest, AsValueWithRectAndItems) { | 605 TEST(DisplayItemListTest, AsValueWithRectAndItems) { |
| 590 gfx::Rect layer_rect = gfx::Rect(1, 2, 8, 9); | 606 gfx::Rect layer_rect = gfx::Rect(1, 2, 8, 9); |
| 591 scoped_refptr<DisplayItemList> list = | 607 scoped_refptr<DisplayItemList> list = |
| 592 DisplayItemList::Create(layer_rect, DisplayItemListSettings()); | 608 DisplayItemList::Create(layer_rect, DisplayItemListSettings()); |
| 593 gfx::Transform transform; | 609 gfx::Transform transform; |
| 594 transform.Translate(6.f, 7.f); | 610 transform.Translate(6.f, 7.f); |
| 595 list->CreateAndAppendItem<TransformDisplayItem>(kVisualRect, transform); | 611 list->CreateAndAppendPairedBeginItem<TransformDisplayItem>(transform); |
| 596 AppendFirstSerializationTestPicture(list, layer_rect.size()); | 612 AppendFirstSerializationTestPicture(list, layer_rect.size()); |
| 597 list->CreateAndAppendItem<EndTransformDisplayItem>(kVisualRect); | 613 list->CreateAndAppendPairedEndItem<EndTransformDisplayItem>(); |
| 598 list->Finalize(); | 614 list->Finalize(); |
| 599 | 615 |
| 600 std::string value = list->AsValue(true)->ToString(); | 616 std::string value = list->AsValue(true)->ToString(); |
| 601 EXPECT_NE(value.find("{\"items\":[\"TransformDisplayItem"), | 617 EXPECT_NE(value.find("{\"items\":[\"TransformDisplayItem"), |
| 602 std::string::npos); | 618 std::string::npos); |
| 603 EXPECT_NE(value.find("\"layer_rect\":[1,2,8,9]"), std::string::npos); | 619 EXPECT_NE(value.find("\"layer_rect\":[1,2,8,9]"), std::string::npos); |
| 604 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); | 620 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); |
| 605 | 621 |
| 606 value = list->AsValue(false)->ToString(); | 622 value = list->AsValue(false)->ToString(); |
| 607 EXPECT_EQ(value.find("{\"items\":[\"TransformDisplayItem"), | 623 EXPECT_EQ(value.find("{\"items\":[\"TransformDisplayItem"), |
| 608 std::string::npos); | 624 std::string::npos); |
| 609 EXPECT_NE(value.find("\"layer_rect\":[1,2,8,9]"), std::string::npos); | 625 EXPECT_NE(value.find("\"layer_rect\":[1,2,8,9]"), std::string::npos); |
| 610 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); | 626 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); |
| 611 } | 627 } |
| 612 | 628 |
| 613 TEST(DisplayItemListTest, AsValueWithEmptyRectAndNoItems) { | 629 TEST(DisplayItemListTest, AsValueWithEmptyRectAndNoItems) { |
| 614 scoped_refptr<DisplayItemList> list = | 630 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 615 DisplayItemList::Create(gfx::Rect(), DisplayItemListSettings()); | |
| 616 list->Finalize(); | 631 list->Finalize(); |
| 617 | 632 |
| 618 std::string value = list->AsValue(true)->ToString(); | 633 std::string value = list->AsValue(true)->ToString(); |
| 619 EXPECT_NE(value.find("\"items\":[]"), std::string::npos); | 634 EXPECT_NE(value.find("\"items\":[]"), std::string::npos); |
| 620 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos); | 635 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos); |
| 621 EXPECT_EQ(value.find("\"skp64\":"), std::string::npos); | 636 EXPECT_EQ(value.find("\"skp64\":"), std::string::npos); |
| 622 | 637 |
| 623 value = list->AsValue(false)->ToString(); | 638 value = list->AsValue(false)->ToString(); |
| 624 EXPECT_EQ(value.find("\"items\":"), std::string::npos); | 639 EXPECT_EQ(value.find("\"items\":"), std::string::npos); |
| 625 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos); | 640 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos); |
| 626 EXPECT_EQ(value.find("\"skp64\":"), std::string::npos); | 641 EXPECT_EQ(value.find("\"skp64\":"), std::string::npos); |
| 627 } | 642 } |
| 628 | 643 |
| 629 TEST(DisplayItemListTest, AsValueWithEmptyRectAndItems) { | 644 TEST(DisplayItemListTest, AsValueWithEmptyRectAndItems) { |
| 630 scoped_refptr<DisplayItemList> list = | 645 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 631 DisplayItemList::Create(gfx::Rect(), DisplayItemListSettings()); | |
| 632 gfx::Transform transform; | 646 gfx::Transform transform; |
| 633 transform.Translate(6.f, 7.f); | 647 transform.Translate(6.f, 7.f); |
| 634 list->CreateAndAppendItem<TransformDisplayItem>(kVisualRect, transform); | 648 list->CreateAndAppendPairedBeginItem<TransformDisplayItem>(transform); |
| 635 AppendFirstSerializationTestPicture(list, gfx::Size()); | 649 AppendFirstSerializationTestPicture(list, gfx::Size()); |
| 636 list->CreateAndAppendItem<EndTransformDisplayItem>(kVisualRect); | 650 list->CreateAndAppendPairedEndItem<EndTransformDisplayItem>(); |
| 637 list->Finalize(); | 651 list->Finalize(); |
| 638 | 652 |
| 639 std::string value = list->AsValue(true)->ToString(); | 653 std::string value = list->AsValue(true)->ToString(); |
| 640 EXPECT_NE(value.find("\"items\":[\"TransformDisplayItem"), std::string::npos); | 654 EXPECT_NE(value.find("\"items\":[\"TransformDisplayItem"), std::string::npos); |
| 641 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos); | 655 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos); |
| 642 // There should be one skp64 entry present associated with the test picture | 656 // There should be one skp64 entry present associated with the test picture |
| 643 // item, though the overall list has no skp64 as the layer rect is empty. | 657 // item, though the overall list has no skp64 as the layer rect is empty. |
| 644 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); | 658 EXPECT_NE(value.find("\"skp64\":"), std::string::npos); |
| 645 | 659 |
| 646 value = list->AsValue(false)->ToString(); | 660 value = list->AsValue(false)->ToString(); |
| 647 EXPECT_EQ(value.find("\"items\":"), std::string::npos); | 661 EXPECT_EQ(value.find("\"items\":"), std::string::npos); |
| 648 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos); | 662 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos); |
| 649 // There should be no skp64 entry present as the items aren't included and the | 663 // There should be no skp64 entry present as the items aren't included and the |
| 650 // layer rect is empty. | 664 // layer rect is empty. |
| 651 EXPECT_EQ(value.find("\"skp64\":"), std::string::npos); | 665 EXPECT_EQ(value.find("\"skp64\":"), std::string::npos); |
| 652 } | 666 } |
| 653 | 667 |
| 668 TEST(DisplayItemListTest, SizeEmpty) { |
| 669 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 670 EXPECT_EQ(0u, list->size()); |
| 671 } |
| 672 |
| 673 TEST(DisplayItemListTest, SizeOne) { |
| 674 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 675 gfx::Rect drawing_bounds(5, 6, 1, 1); |
| 676 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 677 drawing_bounds, CreateRectPicture(drawing_bounds)); |
| 678 EXPECT_EQ(1u, list->size()); |
| 679 } |
| 680 |
| 681 TEST(DisplayItemListTest, SizeMultiple) { |
| 682 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 683 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 684 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 685 clip_bounds, std::vector<SkRRect>(), true); |
| 686 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 687 EXPECT_EQ(2u, list->size()); |
| 688 } |
| 689 |
| 690 TEST(DisplayItemListTest, AppendVisualRectSimple) { |
| 691 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 692 |
| 693 // One drawing: D. |
| 694 |
| 695 gfx::Rect drawing_bounds(5, 6, 7, 8); |
| 696 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 697 drawing_bounds, CreateRectPicture(drawing_bounds)); |
| 698 |
| 699 EXPECT_EQ(1u, list->size()); |
| 700 EXPECT_RECT_EQ(drawing_bounds, list->VisualRectForTesting(0)); |
| 701 } |
| 702 |
| 703 TEST(DisplayItemListTest, AppendVisualRectEmptyBlock) { |
| 704 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 705 |
| 706 // One block: B1, E1. |
| 707 |
| 708 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 709 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 710 clip_bounds, std::vector<SkRRect>(), true); |
| 711 |
| 712 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 713 |
| 714 EXPECT_EQ(2u, list->size()); |
| 715 EXPECT_RECT_EQ(gfx::Rect(), list->VisualRectForTesting(0)); |
| 716 EXPECT_RECT_EQ(gfx::Rect(), list->VisualRectForTesting(1)); |
| 717 } |
| 718 |
| 719 TEST(DisplayItemListTest, AppendVisualRectEmptyBlockContainingEmptyBlock) { |
| 720 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 721 |
| 722 // Two nested blocks: B1, B2, E2, E1. |
| 723 |
| 724 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 725 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 726 clip_bounds, std::vector<SkRRect>(), true); |
| 727 list->CreateAndAppendPairedBeginItem<TransformDisplayItem>(gfx::Transform()); |
| 728 list->CreateAndAppendPairedEndItem<EndTransformDisplayItem>(); |
| 729 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 730 |
| 731 EXPECT_EQ(4u, list->size()); |
| 732 EXPECT_RECT_EQ(gfx::Rect(), list->VisualRectForTesting(0)); |
| 733 EXPECT_RECT_EQ(gfx::Rect(), list->VisualRectForTesting(1)); |
| 734 EXPECT_RECT_EQ(gfx::Rect(), list->VisualRectForTesting(2)); |
| 735 EXPECT_RECT_EQ(gfx::Rect(), list->VisualRectForTesting(3)); |
| 736 } |
| 737 |
| 738 TEST(DisplayItemListTest, AppendVisualRectBlockContainingDrawing) { |
| 739 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 740 |
| 741 // One block with one drawing: B1, Da, E1. |
| 742 |
| 743 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 744 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 745 clip_bounds, std::vector<SkRRect>(), true); |
| 746 |
| 747 gfx::Rect drawing_bounds(5, 6, 1, 1); |
| 748 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 749 drawing_bounds, CreateRectPicture(drawing_bounds)); |
| 750 |
| 751 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 752 |
| 753 EXPECT_EQ(3u, list->size()); |
| 754 EXPECT_RECT_EQ(drawing_bounds, list->VisualRectForTesting(0)); |
| 755 EXPECT_RECT_EQ(drawing_bounds, list->VisualRectForTesting(1)); |
| 756 EXPECT_RECT_EQ(drawing_bounds, list->VisualRectForTesting(2)); |
| 757 } |
| 758 |
| 759 TEST(DisplayItemListTest, AppendVisualRectBlockContainingEscapedDrawing) { |
| 760 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 761 |
| 762 // One block with one drawing: B1, Da (escapes), E1. |
| 763 |
| 764 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 765 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 766 clip_bounds, std::vector<SkRRect>(), true); |
| 767 |
| 768 gfx::Rect drawing_bounds(1, 2, 3, 4); |
| 769 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 770 drawing_bounds, CreateRectPicture(drawing_bounds)); |
| 771 |
| 772 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 773 |
| 774 EXPECT_EQ(3u, list->size()); |
| 775 EXPECT_RECT_EQ(drawing_bounds, list->VisualRectForTesting(0)); |
| 776 EXPECT_RECT_EQ(drawing_bounds, list->VisualRectForTesting(1)); |
| 777 EXPECT_RECT_EQ(drawing_bounds, list->VisualRectForTesting(2)); |
| 778 } |
| 779 |
| 780 TEST(DisplayItemListTest, |
| 781 AppendVisualRectDrawingFollowedByBlockContainingEscapedDrawing) { |
| 782 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 783 |
| 784 // One drawing followed by one block with one drawing: Da, B1, Db (escapes), |
| 785 // E1. |
| 786 |
| 787 gfx::Rect drawing_a_bounds(1, 2, 3, 4); |
| 788 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 789 drawing_a_bounds, CreateRectPicture(drawing_a_bounds)); |
| 790 |
| 791 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 792 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 793 clip_bounds, std::vector<SkRRect>(), true); |
| 794 |
| 795 gfx::Rect drawing_b_bounds(13, 14, 1, 1); |
| 796 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 797 drawing_b_bounds, CreateRectPicture(drawing_b_bounds)); |
| 798 |
| 799 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 800 |
| 801 EXPECT_EQ(4u, list->size()); |
| 802 EXPECT_RECT_EQ(drawing_a_bounds, list->VisualRectForTesting(0)); |
| 803 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(1)); |
| 804 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(2)); |
| 805 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(3)); |
| 806 } |
| 807 |
| 808 TEST(DisplayItemListTest, AppendVisualRectTwoBlocksTwoDrawings) { |
| 809 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 810 |
| 811 // Multiple nested blocks with drawings amidst: B1, Da, B2, Db, E2, E1. |
| 812 |
| 813 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 814 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 815 clip_bounds, std::vector<SkRRect>(), true); |
| 816 |
| 817 gfx::Rect drawing_a_bounds(5, 6, 1, 1); |
| 818 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 819 drawing_a_bounds, CreateRectPicture(drawing_a_bounds)); |
| 820 |
| 821 list->CreateAndAppendPairedBeginItem<TransformDisplayItem>(gfx::Transform()); |
| 822 |
| 823 gfx::Rect drawing_b_bounds(7, 8, 1, 1); |
| 824 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 825 drawing_b_bounds, CreateRectPicture(drawing_b_bounds)); |
| 826 |
| 827 list->CreateAndAppendPairedEndItem<EndTransformDisplayItem>(); |
| 828 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 829 |
| 830 EXPECT_EQ(6u, list->size()); |
| 831 gfx::Rect merged_drawing_bounds = gfx::Rect(drawing_a_bounds); |
| 832 merged_drawing_bounds.Union(drawing_b_bounds); |
| 833 EXPECT_RECT_EQ(merged_drawing_bounds, list->VisualRectForTesting(0)); |
| 834 EXPECT_RECT_EQ(drawing_a_bounds, list->VisualRectForTesting(1)); |
| 835 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(2)); |
| 836 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(3)); |
| 837 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(4)); |
| 838 EXPECT_RECT_EQ(merged_drawing_bounds, list->VisualRectForTesting(5)); |
| 839 } |
| 840 |
| 841 TEST(DisplayItemListTest, |
| 842 AppendVisualRectTwoBlocksTwoDrawingsInnerDrawingEscaped) { |
| 843 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 844 |
| 845 // Multiple nested blocks with drawings amidst: B1, Da, B2, Db (escapes), E2, |
| 846 // E1. |
| 847 |
| 848 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 849 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 850 clip_bounds, std::vector<SkRRect>(), true); |
| 851 |
| 852 gfx::Rect drawing_a_bounds(5, 6, 1, 1); |
| 853 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 854 drawing_a_bounds, CreateRectPicture(drawing_a_bounds)); |
| 855 |
| 856 list->CreateAndAppendPairedBeginItem<TransformDisplayItem>(gfx::Transform()); |
| 857 |
| 858 gfx::Rect drawing_b_bounds(1, 2, 3, 4); |
| 859 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 860 drawing_b_bounds, CreateRectPicture(drawing_b_bounds)); |
| 861 |
| 862 list->CreateAndAppendPairedEndItem<EndTransformDisplayItem>(); |
| 863 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 864 |
| 865 EXPECT_EQ(6u, list->size()); |
| 866 gfx::Rect merged_drawing_bounds = gfx::Rect(drawing_a_bounds); |
| 867 merged_drawing_bounds.Union(drawing_b_bounds); |
| 868 EXPECT_RECT_EQ(merged_drawing_bounds, list->VisualRectForTesting(0)); |
| 869 EXPECT_RECT_EQ(drawing_a_bounds, list->VisualRectForTesting(1)); |
| 870 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(2)); |
| 871 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(3)); |
| 872 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(4)); |
| 873 EXPECT_RECT_EQ(merged_drawing_bounds, list->VisualRectForTesting(5)); |
| 874 } |
| 875 |
| 876 TEST(DisplayItemListTest, |
| 877 AppendVisualRectTwoBlocksTwoDrawingsOuterDrawingEscaped) { |
| 878 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 879 |
| 880 // Multiple nested blocks with drawings amidst: B1, Da (escapes), B2, Db, E2, |
| 881 // E1. |
| 882 |
| 883 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 884 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 885 clip_bounds, std::vector<SkRRect>(), true); |
| 886 |
| 887 gfx::Rect drawing_a_bounds(1, 2, 3, 4); |
| 888 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 889 drawing_a_bounds, CreateRectPicture(drawing_a_bounds)); |
| 890 |
| 891 list->CreateAndAppendPairedBeginItem<TransformDisplayItem>(gfx::Transform()); |
| 892 |
| 893 gfx::Rect drawing_b_bounds(7, 8, 1, 1); |
| 894 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 895 drawing_b_bounds, CreateRectPicture(drawing_b_bounds)); |
| 896 |
| 897 list->CreateAndAppendPairedEndItem<EndTransformDisplayItem>(); |
| 898 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 899 |
| 900 EXPECT_EQ(6u, list->size()); |
| 901 gfx::Rect merged_drawing_bounds = gfx::Rect(drawing_a_bounds); |
| 902 merged_drawing_bounds.Union(drawing_b_bounds); |
| 903 EXPECT_RECT_EQ(merged_drawing_bounds, list->VisualRectForTesting(0)); |
| 904 EXPECT_RECT_EQ(drawing_a_bounds, list->VisualRectForTesting(1)); |
| 905 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(2)); |
| 906 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(3)); |
| 907 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(4)); |
| 908 EXPECT_RECT_EQ(merged_drawing_bounds, list->VisualRectForTesting(5)); |
| 909 } |
| 910 |
| 911 TEST(DisplayItemListTest, |
| 912 AppendVisualRectTwoBlocksTwoDrawingsBothDrawingsEscaped) { |
| 913 scoped_refptr<DisplayItemList> list = CreateDefaultList(); |
| 914 |
| 915 // Multiple nested blocks with drawings amidst: |
| 916 // B1, Da (escapes to the right), B2, Db (escapes to the left), E2, E1. |
| 917 |
| 918 gfx::Rect clip_bounds(5, 6, 7, 8); |
| 919 list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 920 clip_bounds, std::vector<SkRRect>(), true); |
| 921 |
| 922 gfx::Rect drawing_a_bounds(13, 14, 1, 1); |
| 923 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 924 drawing_a_bounds, CreateRectPicture(drawing_a_bounds)); |
| 925 |
| 926 list->CreateAndAppendPairedBeginItem<TransformDisplayItem>(gfx::Transform()); |
| 927 |
| 928 gfx::Rect drawing_b_bounds(1, 2, 3, 4); |
| 929 list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 930 drawing_b_bounds, CreateRectPicture(drawing_b_bounds)); |
| 931 |
| 932 list->CreateAndAppendPairedEndItem<EndTransformDisplayItem>(); |
| 933 list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 934 |
| 935 EXPECT_EQ(6u, list->size()); |
| 936 gfx::Rect merged_drawing_bounds = gfx::Rect(drawing_a_bounds); |
| 937 merged_drawing_bounds.Union(drawing_b_bounds); |
| 938 EXPECT_RECT_EQ(merged_drawing_bounds, list->VisualRectForTesting(0)); |
| 939 EXPECT_RECT_EQ(drawing_a_bounds, list->VisualRectForTesting(1)); |
| 940 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(2)); |
| 941 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(3)); |
| 942 EXPECT_RECT_EQ(drawing_b_bounds, list->VisualRectForTesting(4)); |
| 943 EXPECT_RECT_EQ(merged_drawing_bounds, list->VisualRectForTesting(5)); |
| 944 } |
| 945 |
| 654 } // namespace cc | 946 } // namespace cc |
| OLD | NEW |