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