Home | History | Annotate | Download | only in filters
      1 /*
      2  * Copyright (C) 2010 University of Szeged
      3  * Copyright (C) 2010 Zoltan Herczeg
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
     18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #ifndef FELighting_h
     28 #define FELighting_h
     29 
     30 #if ENABLE(FILTERS)
     31 #include "Color.h"
     32 #include "Filter.h"
     33 #include "FilterEffect.h"
     34 #include "LightSource.h"
     35 #include <wtf/ByteArray.h>
     36 #include <wtf/Platform.h>
     37 
     38 // Common base class for FEDiffuseLighting and FESpecularLighting
     39 
     40 namespace WebCore {
     41 
     42 class FELighting : public FilterEffect {
     43 public:
     44     virtual void apply();
     45 
     46     virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
     47 
     48 protected:
     49     enum LightingType {
     50         DiffuseLighting,
     51         SpecularLighting
     52     };
     53 
     54     struct LightingData {
     55         // This structure contains only read-only (SMP safe) data
     56         ByteArray* pixels;
     57         float surfaceScale;
     58         int widthMultipliedByPixelSize;
     59         int widthDecreasedByOne;
     60         int heightDecreasedByOne;
     61 
     62         inline void topLeft(int offset, IntPoint& normalVector);
     63         inline void topRow(int offset, IntPoint& normalVector);
     64         inline void topRight(int offset, IntPoint& normalVector);
     65         inline void leftColumn(int offset, IntPoint& normalVector);
     66         inline void interior(int offset, IntPoint& normalVector);
     67         inline void rightColumn(int offset, IntPoint& normalVector);
     68         inline void bottomLeft(int offset, IntPoint& normalVector);
     69         inline void bottomRow(int offset, IntPoint& normalVector);
     70         inline void bottomRight(int offset, IntPoint& normalVector);
     71     };
     72 
     73     FELighting(Filter*, LightingType, const Color&, float, float, float, float, float, float, PassRefPtr<LightSource>);
     74 
     75     bool drawLighting(ByteArray*, int, int);
     76     inline void inlineSetPixel(int offset, LightingData&, LightSource::PaintingData&,
     77                                int lightX, int lightY, float factorX, float factorY, IntPoint& normalVector);
     78 
     79     // Not worth to inline every occurence of setPixel.
     80     void setPixel(int offset, LightingData&, LightSource::PaintingData&,
     81                   int lightX, int lightY, float factorX, float factorY, IntPoint& normalVector);
     82 
     83 #if CPU(ARM_NEON) && COMPILER(GCC)
     84     void drawInteriorPixels(LightingData&, LightSource::PaintingData&);
     85 #endif
     86 
     87     LightingType m_lightingType;
     88     RefPtr<LightSource> m_lightSource;
     89 
     90     Color m_lightingColor;
     91     float m_surfaceScale;
     92     float m_diffuseConstant;
     93     float m_specularConstant;
     94     float m_specularExponent;
     95     float m_kernelUnitLengthX;
     96     float m_kernelUnitLengthY;
     97 };
     98 
     99 } // namespace WebCore
    100 
    101 #endif // ENABLE(FILTERS)
    102 
    103 #endif // FELighting_h
    104