Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / platform / graphics / filters / FELighting.h
1 /*
2  * Copyright (C) 2010 University of Szeged
3  * Copyright (C) 2010 Zoltan Herczeg
4  * Copyright (C) 2013 Google Inc. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #ifndef FELighting_h
29 #define FELighting_h
30
31 #include "platform/graphics/Color.h"
32 #include "platform/graphics/filters/Filter.h"
33 #include "platform/graphics/filters/FilterEffect.h"
34 #include "platform/graphics/filters/LightSource.h"
35 #include "platform/graphics/filters/PointLightSource.h"
36 #include "platform/graphics/filters/SpotLightSource.h"
37 #include "wtf/Uint8ClampedArray.h"
38
39 // Common base class for FEDiffuseLighting and FESpecularLighting
40
41 namespace blink {
42
43 class PLATFORM_EXPORT FELighting : public FilterEffect {
44 public:
45     virtual PassRefPtr<SkImageFilter> createImageFilter(SkiaImageFilterBuilder*) OVERRIDE;
46
47 protected:
48     static const int s_minimalRectDimension = 100 * 100; // Empirical data limit for parallel jobs
49
50     enum LightingType {
51         DiffuseLighting,
52         SpecularLighting
53     };
54
55     struct LightingData {
56         // This structure contains only read-only (SMP safe) data
57         Uint8ClampedArray* pixels;
58         float surfaceScale;
59         int widthMultipliedByPixelSize;
60         int widthDecreasedByOne;
61         int heightDecreasedByOne;
62         const LightSource* lightSource;
63
64         inline void topLeft(int offset, IntPoint& normalVector);
65         inline void topRow(int offset, IntPoint& normalVector);
66         inline void topRight(int offset, IntPoint& normalVector);
67         inline void leftColumn(int offset, IntPoint& normalVector);
68         inline void interior(int offset, IntPoint& normalVector);
69         inline void rightColumn(int offset, IntPoint& normalVector);
70         inline void bottomLeft(int offset, IntPoint& normalVector);
71         inline void bottomRow(int offset, IntPoint& normalVector);
72         inline void bottomRight(int offset, IntPoint& normalVector);
73     };
74
75     template<typename Type>
76     friend class ParallelJobs;
77
78     struct PlatformApplyGenericParameters {
79         FELighting* filter;
80         LightingData data;
81         LightSource::PaintingData paintingData;
82         int yStart;
83         int yEnd;
84     };
85
86     virtual FloatRect mapPaintRect(const FloatRect&, bool forward = true) OVERRIDE FINAL;
87     virtual bool affectsTransparentPixels() OVERRIDE { return true; }
88
89     static void platformApplyGenericWorker(PlatformApplyGenericParameters*);
90
91     FELighting(Filter*, LightingType, const Color&, float, float, float, float, float, float, PassRefPtr<LightSource>);
92
93     bool drawLighting(Uint8ClampedArray*, int, int);
94     inline void inlineSetPixel(int offset, LightingData&, LightSource::PaintingData&,
95                                int lightX, int lightY, float factorX, float factorY, IntPoint& normalVector);
96
97     // Not worth to inline every occurence of setPixel.
98     void setPixel(int offset, LightingData&, LightSource::PaintingData&,
99                   int lightX, int lightY, float factorX, float factorY, IntPoint& normalVector);
100
101     inline void platformApply(LightingData&, LightSource::PaintingData&);
102
103     inline void platformApplyGenericPaint(LightingData&, LightSource::PaintingData&, int startX, int startY);
104     inline void platformApplyGeneric(LightingData&, LightSource::PaintingData&);
105
106     LightingType m_lightingType;
107     RefPtr<LightSource> m_lightSource;
108
109     Color m_lightingColor;
110     float m_surfaceScale;
111     float m_diffuseConstant;
112     float m_specularConstant;
113     float m_specularExponent;
114     float m_kernelUnitLengthX;
115     float m_kernelUnitLengthY;
116
117 private:
118     virtual void applySoftware() OVERRIDE;
119
120     void getTransform(FloatPoint3D* scale, FloatSize* offset) const;
121 };
122
123 } // namespace blink
124
125 #endif // FELighting_h