1// Copyright 2013 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_OUTPUT_FILTER_OPERATIONS_H_
6#define CC_OUTPUT_FILTER_OPERATIONS_H_
7
8#include <vector>
9
10#include "base/logging.h"
11#include "base/memory/scoped_ptr.h"
12#include "cc/output/filter_operation.h"
13
14namespace base {
15namespace debug {
16class TracedValue;
17}
18class Value;
19}
20
21namespace cc {
22
23// An ordered list of filter operations.
24class CC_EXPORT FilterOperations {
25 public:
26  FilterOperations();
27
28  FilterOperations(const FilterOperations& other);
29
30  ~FilterOperations();
31
32  FilterOperations& operator=(const FilterOperations& other);
33
34  bool operator==(const FilterOperations& other) const;
35
36  bool operator!=(const FilterOperations& other) const {
37    return !(*this == other);
38  }
39
40  void Append(const FilterOperation& filter);
41
42  // Removes all filter operations.
43  void Clear();
44
45  bool IsEmpty() const;
46
47  void GetOutsets(int* top, int* right, int* bottom, int* left) const;
48  bool HasFilterThatMovesPixels() const;
49  bool HasFilterThatAffectsOpacity() const;
50  bool HasReferenceFilter() const;
51
52  size_t size() const {
53    return operations_.size();
54  }
55
56  const FilterOperation& at(size_t index) const {
57    DCHECK_LT(index, size());
58    return operations_[index];
59  }
60
61  // If |from| is of the same size as this, where in each position, the filter
62  // in |from| is of the same type as the filter in this, and if this doesn't
63  // contain any reference filters, returns a FilterOperations formed by
64  // linearly interpolating at each position a |progress| fraction of the way
65  // from the filter in |from| to the filter in this. If |from| and this are of
66  // different lengths, they are treated as having the same length by padding
67  // the shorter sequence with no-op filters of the same type as the filters in
68  // the corresponding positions in the longer sequence. If either sequence has
69  // a reference filter or if there is a type mismatch at some position, returns
70  // a copy of this.
71  FilterOperations Blend(const FilterOperations& from, double progress) const;
72
73  void AsValueInto(base::debug::TracedValue* value) const;
74
75 private:
76  std::vector<FilterOperation> operations_;
77};
78
79}  // namespace cc
80
81#endif  // CC_OUTPUT_FILTER_OPERATIONS_H_
82