| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 <deque> | 5 #include <deque> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/gtest_prod_util.h" | 9 #include "base/gtest_prod_util.h" |
| 10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
| 11 #include "cc/scheduler/begin_frame_source.h" | 11 #include "cc/scheduler/begin_frame_source.h" |
| 12 #include "cc/test/begin_frame_args_test.h" | 12 #include "cc/test/begin_frame_args_test.h" |
| 13 #include "cc/test/scheduler_test_common.h" | 13 #include "cc/test/scheduler_test_common.h" |
| 14 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 16 |
| 17 // Macros to help set up expected calls on the MockBeginFrameObserver. | 17 // Macros to help set up expected calls on the MockBeginFrameObserver. |
| 18 #define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \ | 18 #define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \ |
| 19 { \ | 19 { \ |
| 20 ::testing::Expectation exp = \ | 20 ::testing::Expectation exp = \ |
| 21 EXPECT_CALL((obs), \ | 21 EXPECT_CALL((obs), OnBeginFrame(CreateBeginFrameArgsForTesting( \ |
| 22 OnBeginFrame(CreateBeginFrameArgsForTesting( \ | 22 BEGINFRAME_FROM_HERE, frame_time, deadline, \ |
| 23 frame_time, deadline, interval))) \ | 23 interval))).InSequence((obs).sequence); \ |
| 24 .InSequence((obs).sequence); \ | |
| 25 } | 24 } |
| 26 | 25 |
| 27 #define EXPECT_BEGIN_FRAME_USED(obs, frame_time, deadline, interval) \ | 26 #define EXPECT_BEGIN_FRAME_USED(obs, frame_time, deadline, interval) \ |
| 28 { \ | 27 { \ |
| 29 BeginFrameArgs args = \ | 28 BeginFrameArgs args = CreateBeginFrameArgsForTesting( \ |
| 30 CreateBeginFrameArgsForTesting(frame_time, deadline, interval); \ | 29 BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \ |
| 31 ::testing::Expectation exp = \ | 30 ::testing::Expectation exp = \ |
| 32 EXPECT_CALL((obs), OnBeginFrame(args)).InSequence((obs).sequence); \ | 31 EXPECT_CALL((obs), OnBeginFrame(args)).InSequence((obs).sequence); \ |
| 33 EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \ | 32 EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \ |
| 34 .Times(::testing::AnyNumber()) \ | 33 .Times(::testing::AnyNumber()) \ |
| 35 .After(exp) \ | 34 .After(exp) \ |
| 36 .WillRepeatedly(::testing::Return(args)); \ | 35 .WillRepeatedly(::testing::Return(args)); \ |
| 37 } | 36 } |
| 38 | 37 |
| 39 // Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting | 38 // Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting |
| 40 // observer behaviour). | 39 // observer behaviour). |
| 41 #define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \ | 40 #define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \ |
| 42 interval) \ | 41 interval) \ |
| 43 { \ | 42 { \ |
| 44 BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \ | 43 BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \ |
| 45 BeginFrameArgs new_args = \ | 44 BeginFrameArgs new_args = CreateBeginFrameArgsForTesting( \ |
| 46 CreateBeginFrameArgsForTesting(frame_time, deadline, interval); \ | 45 BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \ |
| 47 ASSERT_FALSE(old_args == new_args); \ | 46 ASSERT_FALSE(old_args == new_args); \ |
| 48 (source).TestOnBeginFrame(new_args); \ | 47 (source).TestOnBeginFrame(new_args); \ |
| 49 EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \ | 48 EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \ |
| 50 } | 49 } |
| 51 | 50 |
| 52 // When dropping LastUsedBeginFrameArgs **shouldn't** change. | 51 // When dropping LastUsedBeginFrameArgs **shouldn't** change. |
| 53 #define SEND_BEGIN_FRAME_DROP(source, frame_time, deadline, interval) \ | 52 #define SEND_BEGIN_FRAME_DROP(source, frame_time, deadline, interval) \ |
| 54 SEND_BEGIN_FRAME(old_args, source, frame_time, deadline, interval); | 53 SEND_BEGIN_FRAME(old_args, source, frame_time, deadline, interval); |
| 55 | 54 |
| 56 // When used LastUsedBeginFrameArgs **should** be updated. | 55 // When used LastUsedBeginFrameArgs **should** be updated. |
| 57 #define SEND_BEGIN_FRAME_USED(source, frame_time, deadline, interval) \ | 56 #define SEND_BEGIN_FRAME_USED(source, frame_time, deadline, interval) \ |
| 58 SEND_BEGIN_FRAME(new_args, source, frame_time, deadline, interval); | 57 SEND_BEGIN_FRAME(new_args, source, frame_time, deadline, interval); |
| 59 | 58 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrame) { | 91 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrame) { |
| 93 ::testing::NiceMock<MockBeginFrameObserver> obs; | 92 ::testing::NiceMock<MockBeginFrameObserver> obs; |
| 94 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | 93 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
| 95 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); | 94 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); |
| 96 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | 95 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
| 97 | 96 |
| 98 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 97 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), |
| 99 MockBeginFrameObserver::kDefaultBeginFrameArgs); | 98 MockBeginFrameObserver::kDefaultBeginFrameArgs); |
| 100 | 99 |
| 101 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | 100 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 102 100, 200, 300)); // One call to LastUsedBeginFrameArgs | 101 BEGINFRAME_FROM_HERE, 100, 200, |
| 103 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 102 300)); // One call to LastUsedBeginFrameArgs |
| 104 CreateBeginFrameArgsForTesting(100, 200, 300)); | 103 EXPECT_EQ( |
| 104 obs.LastUsedBeginFrameArgs(), |
| 105 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 105 | 106 |
| 106 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | 107 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 107 400, 600, 300)); // Multiple calls to LastUsedBeginFrameArgs | 108 BEGINFRAME_FROM_HERE, 400, 600, |
| 108 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 109 300)); // Multiple calls to LastUsedBeginFrameArgs |
| 109 CreateBeginFrameArgsForTesting(400, 600, 300)); | 110 EXPECT_EQ( |
| 110 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 111 obs.LastUsedBeginFrameArgs(), |
| 111 CreateBeginFrameArgsForTesting(400, 600, 300)); | 112 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
| 113 EXPECT_EQ( |
| 114 obs.LastUsedBeginFrameArgs(), |
| 115 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
| 112 | 116 |
| 113 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | 117 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 114 700, 900, 300)); // No calls to LastUsedBeginFrameArgs | 118 BEGINFRAME_FROM_HERE, 700, 900, |
| 119 300)); // No calls to LastUsedBeginFrameArgs |
| 115 } | 120 } |
| 116 | 121 |
| 117 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) { | 122 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) { |
| 118 ::testing::NiceMock<MockBeginFrameObserver> obs; | 123 ::testing::NiceMock<MockBeginFrameObserver> obs; |
| 119 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | 124 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
| 120 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300); | 125 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300); |
| 121 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300); | 126 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300); |
| 122 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | 127 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
| 123 | 128 |
| 124 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 129 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), |
| 125 MockBeginFrameObserver::kDefaultBeginFrameArgs); | 130 MockBeginFrameObserver::kDefaultBeginFrameArgs); |
| 126 | 131 |
| 127 // Used | 132 // Used |
| 128 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(100, 200, 300)); | 133 obs.OnBeginFrame( |
| 129 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 134 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 130 CreateBeginFrameArgsForTesting(100, 200, 300)); | 135 EXPECT_EQ( |
| 136 obs.LastUsedBeginFrameArgs(), |
| 137 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 131 | 138 |
| 132 // Dropped | 139 // Dropped |
| 133 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(400, 600, 300)); | 140 obs.OnBeginFrame( |
| 134 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 141 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
| 135 CreateBeginFrameArgsForTesting(100, 200, 300)); | 142 EXPECT_EQ( |
| 143 obs.LastUsedBeginFrameArgs(), |
| 144 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 136 | 145 |
| 137 // Dropped | 146 // Dropped |
| 138 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(450, 650, 300)); | 147 obs.OnBeginFrame( |
| 139 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 148 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 450, 650, 300)); |
| 140 CreateBeginFrameArgsForTesting(100, 200, 300)); | 149 EXPECT_EQ( |
| 150 obs.LastUsedBeginFrameArgs(), |
| 151 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 141 | 152 |
| 142 // Used | 153 // Used |
| 143 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(700, 900, 300)); | 154 obs.OnBeginFrame( |
| 144 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 155 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300)); |
| 145 CreateBeginFrameArgsForTesting(700, 900, 300)); | 156 EXPECT_EQ( |
| 157 obs.LastUsedBeginFrameArgs(), |
| 158 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300)); |
| 146 } | 159 } |
| 147 | 160 |
| 148 const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs = | 161 const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs = |
| 149 CreateBeginFrameArgsForTesting(-1, -1, -1); | 162 CreateBeginFrameArgsForTesting( |
| 163 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 164 "MockBeginFrameObserver::kDefaultBeginFrameArgs"), |
| 165 -1, |
| 166 -1, |
| 167 -1); |
| 150 | 168 |
| 151 // BeginFrameObserverMixIn testing --------------------------------------- | 169 // BeginFrameObserverMixIn testing --------------------------------------- |
| 152 class MockMinimalBeginFrameObserverMixIn : public BeginFrameObserverMixIn { | 170 class MockMinimalBeginFrameObserverMixIn : public BeginFrameObserverMixIn { |
| 153 public: | 171 public: |
| 154 MOCK_METHOD1(OnBeginFrameMixInDelegate, bool(const BeginFrameArgs&)); | 172 MOCK_METHOD1(OnBeginFrameMixInDelegate, bool(const BeginFrameArgs&)); |
| 155 int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; } | 173 int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; } |
| 156 }; | 174 }; |
| 157 | 175 |
| 158 TEST(BeginFrameObserverMixInTest, OnBeginFrameImplementation) { | 176 TEST(BeginFrameObserverMixInTest, OnBeginFrameImplementation) { |
| 159 using ::testing::Return; | 177 using ::testing::Return; |
| 160 MockMinimalBeginFrameObserverMixIn obs; | 178 MockMinimalBeginFrameObserverMixIn obs; |
| 161 ::testing::InSequence ordered; // These calls should be ordered | 179 ::testing::InSequence ordered; // These calls should be ordered |
| 162 | 180 |
| 163 // Initial conditions | 181 // Initial conditions |
| 164 EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs()); | 182 EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs()); |
| 165 EXPECT_EQ(0, obs.dropped_begin_frame_args()); | 183 EXPECT_EQ(0, obs.dropped_begin_frame_args()); |
| 166 | 184 |
| 167 #ifndef NDEBUG | 185 #ifndef NDEBUG |
| 168 EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, ""); | 186 EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, ""); |
| 169 #endif | 187 #endif |
| 170 | 188 |
| 171 BeginFrameArgs args1 = CreateBeginFrameArgsForTesting(100, 200, 300); | 189 BeginFrameArgs args1 = |
| 190 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300); |
| 172 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args1)).WillOnce(Return(true)); | 191 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args1)).WillOnce(Return(true)); |
| 173 obs.OnBeginFrame(args1); | 192 obs.OnBeginFrame(args1); |
| 174 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); | 193 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); |
| 175 EXPECT_EQ(0, obs.dropped_begin_frame_args()); | 194 EXPECT_EQ(0, obs.dropped_begin_frame_args()); |
| 176 | 195 |
| 177 #ifndef NDEBUG | 196 #ifndef NDEBUG |
| 178 EXPECT_DEATH( | 197 EXPECT_DEATH({ |
| 179 { obs.OnBeginFrame(CreateBeginFrameArgsForTesting(50, 200, 300)); }, ""); | 198 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 199 BEGINFRAME_FROM_HERE, 50, 200, 300)); |
| 200 }, |
| 201 ""); |
| 180 #endif | 202 #endif |
| 181 | 203 |
| 182 // Returning false shouldn't update the LastUsedBeginFrameArgs value. | 204 // Returning false shouldn't update the LastUsedBeginFrameArgs value. |
| 183 BeginFrameArgs args2 = CreateBeginFrameArgsForTesting(200, 300, 400); | 205 BeginFrameArgs args2 = |
| 206 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 200, 300, 400); |
| 184 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args2)).WillOnce(Return(false)); | 207 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args2)).WillOnce(Return(false)); |
| 185 obs.OnBeginFrame(args2); | 208 obs.OnBeginFrame(args2); |
| 186 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); | 209 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); |
| 187 EXPECT_EQ(1, obs.dropped_begin_frame_args()); | 210 EXPECT_EQ(1, obs.dropped_begin_frame_args()); |
| 188 | 211 |
| 189 BeginFrameArgs args3 = CreateBeginFrameArgsForTesting(150, 300, 400); | 212 BeginFrameArgs args3 = |
| 213 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 150, 300, 400); |
| 190 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args3)).WillOnce(Return(true)); | 214 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args3)).WillOnce(Return(true)); |
| 191 obs.OnBeginFrame(args3); | 215 obs.OnBeginFrame(args3); |
| 192 EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs()); | 216 EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs()); |
| 193 EXPECT_EQ(1, obs.dropped_begin_frame_args()); | 217 EXPECT_EQ(1, obs.dropped_begin_frame_args()); |
| 194 } | 218 } |
| 195 | 219 |
| 196 // BeginFrameSource testing ---------------------------------------------- | 220 // BeginFrameSource testing ---------------------------------------------- |
| 197 TEST(BeginFrameSourceMixInTest, ObserverManipulation) { | 221 TEST(BeginFrameSourceMixInTest, ObserverManipulation) { |
| 198 MockBeginFrameObserver obs; | 222 MockBeginFrameObserver obs; |
| 199 MockBeginFrameObserver otherObs; | 223 MockBeginFrameObserver otherObs; |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 source_->AddObserver(obs_.get()); | 512 source_->AddObserver(obs_.get()); |
| 489 } | 513 } |
| 490 | 514 |
| 491 void TearDown() override { obs_.reset(); } | 515 void TearDown() override { obs_.reset(); } |
| 492 }; | 516 }; |
| 493 | 517 |
| 494 TEST_F(SyntheticBeginFrameSourceTest, | 518 TEST_F(SyntheticBeginFrameSourceTest, |
| 495 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) { | 519 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) { |
| 496 now_src_->SetNowMicroseconds(10010); | 520 now_src_->SetNowMicroseconds(10010); |
| 497 EXPECT_CALL((*obs_), OnBeginFrame(CreateBeginFrameArgsForTesting( | 521 EXPECT_CALL((*obs_), OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 498 10000, 20000, 10000, BeginFrameArgs::MISSED))); | 522 BEGINFRAME_FROM_HERE, 10000, 20000, 10000, |
| 523 BeginFrameArgs::MISSED))); |
| 499 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent | 524 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent |
| 500 // No tasks should need to be run for this to occur. | 525 // No tasks should need to be run for this to occur. |
| 501 } | 526 } |
| 502 | 527 |
| 503 TEST_F(SyntheticBeginFrameSourceTest, | 528 TEST_F(SyntheticBeginFrameSourceTest, |
| 504 SetNeedsBeginFramesCallsCausesOnBeginFrame) { | 529 SetNeedsBeginFramesCallsCausesOnBeginFrame) { |
| 505 source_->SetNeedsBeginFrames(true); | 530 source_->SetNeedsBeginFrames(true); |
| 506 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); | 531 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); |
| 507 | 532 |
| 508 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 533 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 mux_->SetActiveSource(source2_); | 762 mux_->SetActiveSource(source2_); |
| 738 SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300); | 763 SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300); |
| 739 SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300); | 764 SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300); |
| 740 | 765 |
| 741 mux_->SetActiveSource(source1_); | 766 mux_->SetActiveSource(source1_); |
| 742 SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300); | 767 SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300); |
| 743 } | 768 } |
| 744 | 769 |
| 745 } // namespace | 770 } // namespace |
| 746 } // namespace cc | 771 } // namespace cc |
| OLD | NEW |