15f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian/* 2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 35f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or 5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public 6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either 7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version. 85f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful, 10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of 11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details. 135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License 15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB. If not, write to 16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA. 185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian */ 195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "config.h" 215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(SVG) && ENABLE(FILTERS) 235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SVGFilterBuilder.h" 245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "FilterEffect.h" 265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "PlatformString.h" 275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SourceAlpha.h" 285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SourceGraphic.h" 295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/PassRefPtr.h> 315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qiannamespace WebCore { 335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangSVGFilterBuilder::SVGFilterBuilder(Filter* filter) 35bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen : m_lastEffect(0) 365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_builtinEffects.add(SourceGraphic::effectName(), SourceGraphic::create(filter)); 384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_builtinEffects.add(SourceAlpha::effectName(), SourceAlpha::create(filter)); 39bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen addBuiltinEffects(); 405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid SVGFilterBuilder::add(const AtomicString& id, RefPtr<FilterEffect> effect) 435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (id.isEmpty()) { 45d0825bca7fe65beaee391d30da42e937db621564Steve Block m_lastEffect = effect; 465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_builtinEffects.contains(id)) 505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 52d0825bca7fe65beaee391d30da42e937db621564Steve Block m_lastEffect = effect; 535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_namedEffects.set(id, m_lastEffect); 545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 565f1ab04193ad0130ca8204aadaceae083aca9881Feng QianFilterEffect* SVGFilterBuilder::getEffectById(const AtomicString& id) const 575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (id.isEmpty()) { 595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_lastEffect) 605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return m_lastEffect.get(); 615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return m_builtinEffects.get(SourceGraphic::effectName()).get(); 635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_builtinEffects.contains(id)) 665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return m_builtinEffects.get(id).get(); 675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return m_namedEffects.get(id).get(); 695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 712fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid SVGFilterBuilder::appendEffectToEffectReferences(RefPtr<FilterEffect> effectReference, RenderObject* object) 72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // The effect must be a newly created filter effect. 74bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(!m_effectReferences.contains(effectReference)); 752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(object && !m_effectRenderer.contains(object)); 76bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_effectReferences.add(effectReference, FilterEffectSet()); 77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 78bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen FilterEffect* effect = effectReference.get(); 79bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen unsigned numberOfInputEffects = effect->inputEffects().size(); 80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 81bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // It is not possible to add the same value to a set twice. 82bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen for (unsigned i = 0; i < numberOfInputEffects; ++i) 832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block effectReferences(effect->inputEffect(i)).add(effect); 842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_effectRenderer.add(object, effectReference.get()); 85bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid SVGFilterBuilder::clearEffects() 885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_lastEffect = 0; 905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_namedEffects.clear(); 91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_effectReferences.clear(); 922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_effectRenderer.clear(); 93bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen addBuiltinEffects(); 945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 962fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid SVGFilterBuilder::clearResultsRecursive(FilterEffect* effect) 972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!effect->hasResult()) 992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block effect->clearResult(); 1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block HashSet<FilterEffect*>& effectReferences = this->effectReferences(effect); 1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block HashSet<FilterEffect*>::iterator end = effectReferences.end(); 1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block for (HashSet<FilterEffect*>::iterator it = effectReferences.begin(); it != end; ++it) 1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block clearResultsRecursive(*it); 1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} // namespace WebCore 1105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif // ENABLE(SVG) && ENABLE(FILTERS) 112