Home | History | Annotate | Download | only in filters
      1 /*
      2  * Copyright (C) 2008 Alex Mathews <possessedpenguinbob (at) gmail.com>
      3  * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann (at) kde.org>
      4  * Copyright (C) 2004, 2005 Rob Buis <buis (at) kde.org>
      5  * Copyright (C) 2005 Eric Seidel <eric (at) webkit.org>
      6  *
      7  * This library is free software; you can redistribute it and/or
      8  * modify it under the terms of the GNU Library General Public
      9  * License as published by the Free Software Foundation; either
     10  * version 2 of the License, or (at your option) any later version.
     11  *
     12  * This library is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15  * Library General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU Library General Public License
     18  * along with this library; see the file COPYING.LIB.  If not, write to
     19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     20  * Boston, MA 02110-1301, USA.
     21  */
     22 
     23 #ifndef SpotLightSource_h
     24 #define SpotLightSource_h
     25 
     26 #include "platform/graphics/filters/LightSource.h"
     27 
     28 namespace blink {
     29 
     30 class PLATFORM_EXPORT SpotLightSource : public LightSource {
     31 public:
     32     static PassRefPtr<SpotLightSource> create(const FloatPoint3D& position,
     33         const FloatPoint3D& direction, float specularExponent, float limitingConeAngle)
     34     {
     35         return adoptRef(new SpotLightSource(position, direction, specularExponent, limitingConeAngle));
     36     }
     37 
     38     virtual PassRefPtr<LightSource> create(const FloatPoint3D& scale, const FloatSize& offset) const OVERRIDE
     39     {
     40         FloatPoint3D position(m_position.x() * scale.x() - offset.width(), m_position.y() * scale.y() - offset.height(), m_position.z() * scale.z());
     41         FloatPoint3D direction(m_direction.x() * scale.x() - offset.width(), m_direction.y() * scale.y() - offset.height(), m_direction.z() * scale.z());
     42         return adoptRef(new SpotLightSource(position, direction, m_specularExponent, m_limitingConeAngle));
     43     }
     44 
     45     const FloatPoint3D& position() const { return m_position; }
     46     const FloatPoint3D& direction() const { return m_direction; }
     47     float specularExponent() const { return m_specularExponent; }
     48     float limitingConeAngle() const { return m_limitingConeAngle; }
     49 
     50     virtual bool setPosition(const FloatPoint3D&) OVERRIDE;
     51     virtual bool setPointsAt(const FloatPoint3D&) OVERRIDE;
     52 
     53     virtual bool setSpecularExponent(float) OVERRIDE;
     54     virtual bool setLimitingConeAngle(float) OVERRIDE;
     55 
     56     virtual void initPaintingData(PaintingData&) const OVERRIDE;
     57     virtual void updatePaintingData(PaintingData&, int x, int y, float z) const OVERRIDE;
     58 
     59     virtual TextStream& externalRepresentation(TextStream&) const OVERRIDE;
     60 
     61 private:
     62     SpotLightSource(const FloatPoint3D& position, const FloatPoint3D& direction,
     63         float specularExponent, float limitingConeAngle)
     64         : LightSource(LS_SPOT)
     65         , m_position(position)
     66         , m_direction(direction)
     67         , m_specularExponent(std::min(std::max(specularExponent, 1.0f), 128.0f))
     68         , m_limitingConeAngle(limitingConeAngle)
     69     {
     70     }
     71 
     72     FloatPoint3D m_position;
     73     FloatPoint3D m_direction;
     74 
     75     float m_specularExponent;
     76     float m_limitingConeAngle;
     77 };
     78 
     79 } // namespace blink
     80 
     81 #endif // SpotLightSource_h
     82