1 /* 2 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer. 11 * 2. Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following 13 * disclaimer in the documentation and/or other materials 14 * provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 21 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 25 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 26 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #include "config.h" 31 32 #include "core/platform/graphics/filters/custom/CustomFilterParameterList.h" 33 34 #include "core/platform/graphics/filters/custom/CustomFilterParameter.h" 35 #include "wtf/text/StringHash.h" 36 37 namespace WebCore { 38 39 CustomFilterParameterList::CustomFilterParameterList() 40 { 41 } 42 43 CustomFilterParameterList::CustomFilterParameterList(size_t size) 44 : CustomFilterParameterListBase(size) 45 { 46 } 47 48 bool CustomFilterParameterList::operator==(const CustomFilterParameterList& other) const 49 { 50 if (size() != other.size()) 51 return false; 52 for (size_t i = 0; i < size(); ++i) { 53 if (at(i).get() != other.at(i).get() 54 && *at(i).get() != *other.at(i).get()) 55 return false; 56 } 57 return true; 58 } 59 60 bool CustomFilterParameterList::checkAlphabeticalOrder() const 61 { 62 for (unsigned i = 1; i < size(); ++i) { 63 // Break for equal or not-sorted parameters. 64 if (!codePointCompareLessThan(at(i - 1)->name(), at(i)->name())) 65 return false; 66 } 67 return true; 68 } 69 70 void CustomFilterParameterList::blend(const CustomFilterParameterList& fromList, 71 double progress, CustomFilterParameterList& resultList) const 72 { 73 // This method expects both lists to be sorted by parameter name and the result list is also sorted. 74 ASSERT(checkAlphabeticalOrder()); 75 ASSERT(fromList.checkAlphabeticalOrder()); 76 size_t fromListIndex = 0, toListIndex = 0; 77 while (fromListIndex < fromList.size() && toListIndex < size()) { 78 CustomFilterParameter* paramFrom = fromList.at(fromListIndex).get(); 79 CustomFilterParameter* paramTo = at(toListIndex).get(); 80 if (paramFrom->name() == paramTo->name()) { 81 resultList.append(paramTo->blend(paramFrom, progress)); 82 ++fromListIndex; 83 ++toListIndex; 84 continue; 85 } 86 if (codePointCompareLessThan(paramFrom->name(), paramTo->name())) { 87 resultList.append(paramFrom); 88 ++fromListIndex; 89 continue; 90 } 91 resultList.append(paramTo); 92 ++toListIndex; 93 } 94 for (; fromListIndex < fromList.size(); ++fromListIndex) 95 resultList.append(fromList.at(fromListIndex)); 96 for (; toListIndex < size(); ++toListIndex) 97 resultList.append(at(toListIndex)); 98 ASSERT(resultList.checkAlphabeticalOrder()); 99 } 100 101 } // namespace WebCore 102 103