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 #include "platform/graphics/filters/custom/CustomFilterParameterList.h" 32 33 #include "wtf/text/StringHash.h" 34 35 namespace WebCore { 36 37 CustomFilterParameterList::CustomFilterParameterList() 38 { 39 } 40 41 CustomFilterParameterList::CustomFilterParameterList(size_t size) 42 : m_parameters(size) 43 { 44 } 45 46 bool CustomFilterParameterList::operator==(const CustomFilterParameterList& other) const 47 { 48 if (size() != other.size()) 49 return false; 50 for (size_t i = 0; i < size(); ++i) { 51 if (at(i).get() != other.at(i).get() 52 && *at(i).get() != *other.at(i).get()) 53 return false; 54 } 55 return true; 56 } 57 58 #ifndef NDEBUG 59 bool CustomFilterParameterList::checkAlphabeticalOrder() const 60 { 61 for (unsigned i = 1; i < size(); ++i) { 62 // Break for equal or not-sorted parameters. 63 if (!codePointCompareLessThan(at(i - 1)->name(), at(i)->name())) 64 return false; 65 } 66 return true; 67 } 68 #endif 69 70 void CustomFilterParameterList::blend(const CustomFilterParameterList& fromList, 71 double progress, CustomFilterParameterList& resultList) const 72 { 73 #ifndef NDEBUG 74 // This method expects both lists to be sorted by parameter name and the result list is also sorted. 75 ASSERT(checkAlphabeticalOrder()); 76 ASSERT(fromList.checkAlphabeticalOrder()); 77 #endif 78 size_t fromListIndex = 0, toListIndex = 0; 79 while (fromListIndex < fromList.size() && toListIndex < size()) { 80 CustomFilterParameter* paramFrom = fromList.at(fromListIndex).get(); 81 CustomFilterParameter* paramTo = at(toListIndex).get(); 82 if (paramFrom->name() == paramTo->name()) { 83 resultList.append(paramTo->blend(paramFrom, progress)); 84 ++fromListIndex; 85 ++toListIndex; 86 continue; 87 } 88 if (codePointCompareLessThan(paramFrom->name(), paramTo->name())) { 89 resultList.append(paramFrom); 90 ++fromListIndex; 91 continue; 92 } 93 resultList.append(paramTo); 94 ++toListIndex; 95 } 96 for (; fromListIndex < fromList.size(); ++fromListIndex) 97 resultList.append(fromList.at(fromListIndex)); 98 for (; toListIndex < size(); ++toListIndex) 99 resultList.append(at(toListIndex)); 100 #ifndef NDEBUG 101 ASSERT(resultList.checkAlphabeticalOrder()); 102 #endif 103 } 104 105 static bool sortParametersByNameComparator(const RefPtr<CustomFilterParameter>& a, const RefPtr<CustomFilterParameter>& b) 106 { 107 return codePointCompareLessThan(a->name(), b->name()); 108 } 109 110 void CustomFilterParameterList::sortParametersByName() 111 { 112 std::sort(m_parameters.begin(), m_parameters.end(), sortParametersByNameComparator); 113 } 114 115 } // namespace WebCore 116 117