Index: cc/output/filter_operations.cc |
diff --git a/cc/output/filter_operations.cc b/cc/output/filter_operations.cc |
index 92ddd684777ef9e71fab6cbd1a3805a0f0db3dd9..21d222e94bfca12b5396679e01334338e22dabe8 100644 |
--- a/cc/output/filter_operations.cc |
+++ b/cc/output/filter_operations.cc |
@@ -154,34 +154,43 @@ bool FilterOperations::HasReferenceFilter() const { |
FilterOperations FilterOperations::Blend(const FilterOperations& from, |
double progress) const { |
- FilterOperations blended_filters; |
- if (from.size() == 0) { |
- for (size_t i = 0; i < size(); i++) |
- blended_filters.Append(FilterOperation::Blend(NULL, &at(i), progress)); |
- return blended_filters; |
- } |
+ if (HasReferenceFilter() || from.HasReferenceFilter()) |
+ return *this; |
- if (size() == 0) { |
- for (size_t i = 0; i < from.size(); i++) { |
- blended_filters.Append( |
- FilterOperation::Blend(&from.at(i), NULL, progress)); |
- } |
- return blended_filters; |
+ bool from_is_longer = from.size() > size(); |
+ |
+ size_t shorter_size, longer_size; |
+ if (size() == from.size()) { |
+ shorter_size = longer_size = size(); |
+ } else if (from_is_longer) { |
+ longer_size = from.size(); |
+ shorter_size = size(); |
+ } else { |
+ longer_size = size(); |
+ shorter_size = from.size(); |
} |
- if (from.size() != size()) |
- return *this; |
- |
- for (size_t i = 0; i < size(); i++) { |
+ for (size_t i = 0; i < shorter_size; i++) { |
if (from.at(i).type() != at(i).type()) |
return *this; |
} |
- for (size_t i = 0; i < size(); i++) { |
+ FilterOperations blended_filters; |
+ for (size_t i = 0; i < shorter_size; i++) { |
blended_filters.Append( |
FilterOperation::Blend(&from.at(i), &at(i), progress)); |
} |
+ if (from_is_longer) { |
+ for (size_t i = shorter_size; i < longer_size; i++) { |
+ blended_filters.Append( |
+ FilterOperation::Blend(&from.at(i), NULL, progress)); |
+ } |
+ } else { |
+ for (size_t i = shorter_size; i < longer_size; i++) |
+ blended_filters.Append(FilterOperation::Blend(NULL, &at(i), progress)); |
+ } |
+ |
return blended_filters; |
} |