1 // Copyright 2016 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 #ifndef CC_BASE_SPIRAL_ITERATOR_H_ 6 #define CC_BASE_SPIRAL_ITERATOR_H_ 7 8 #include "base/logging.h" 9 #include "cc/base/base_export.h" 10 #include "cc/base/index_rect.h" 11 12 namespace cc { 13 14 // The spiral iterator which iterates based on directions around the center 15 // rect in the given region. If the center rect is at index (2, 2), spiral 16 // iterator gives following sequence on iterating. 17 // 18 // x 0 1 2 3 4 19 // y ┌───┬───┬───┬───┬───┐ 20 // 0 │ 16│ 15│ 14│ 13│ 12│ 21 // ├───┼───┼───┼───┼───┤ 22 // 1 │ 17│ 4│ 3│ 2│ 11│ 23 // ├───┼───┼───┼───┼───┤ 24 // 2 │ 18│ 5│ *│ 1│ 10│ 25 // ├───┼───┼───┼───┼───┤ 26 // 3 │ 19│ 6│ 7│ 8│ 9│ 27 // ├───┼───┼───┼───┼───┤ 28 // 4 │ 20│ 21│ 22│ 23│ 24│ 29 // └───┴───┴───┴───┴───┘ 30 class CC_BASE_EXPORT SpiralIterator { 31 public: 32 SpiralIterator(); 33 SpiralIterator(const IndexRect& around_index_rect, 34 const IndexRect& consider_index_rect, 35 const IndexRect& ignore_index_rect); 36 37 ~SpiralIterator() = default; 38 39 operator bool() const; 40 SpiralIterator& operator++(); index_x()41 int index_x() const { return index_x_; } index_y()42 int index_y() const { return index_y_; } 43 44 private: current_step_count()45 int current_step_count() const { 46 return (direction_ == UP || direction_ == DOWN) ? vertical_step_count_ 47 : horizontal_step_count_; 48 } 49 50 bool needs_direction_switch() const; 51 void switch_direction(); 52 53 enum Direction { UP, LEFT, DOWN, RIGHT }; 54 55 IndexRect around_index_rect_; 56 IndexRect consider_index_rect_; 57 IndexRect ignore_index_rect_; 58 int index_x_; 59 int index_y_; 60 61 Direction direction_; 62 int delta_x_; 63 int delta_y_; 64 int current_step_; 65 int horizontal_step_count_; 66 int vertical_step_count_; 67 }; 68 69 } // namespace cc 70 71 #endif // CC_BASE_SPIRAL_ITERATOR_H_ 72