2 Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
4 This file is part of the KDE project
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
16 You should have received a copy of the GNU Library General Public License
17 aint with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.
24 #if ENABLE(SVG) && ENABLE(SVG_FILTERS)
25 #include "SVGFEHelpersCg.h"
28 #include "SVGDistantLightSource.h"
29 #include "SVGLightSource.h"
30 #include "SVGPointLightSource.h"
31 #include "SVGSpotLightSource.h"
33 #import "WKDistantLightFilter.h"
34 #import "WKNormalMapFilter.h"
35 #import "WKPointLightFilter.h"
36 #import "WKSpotLightFilter.h"
38 #include <wtf/MathExtras.h>
42 CIVector* getVectorForChannel(SVGChannelSelectorType channel)
45 case SVG_CHANNEL_UNKNOWN:
48 return [CIVector vectorWithX:1.0f Y:0.0f Z:0.0f W:0.0f];
50 return [CIVector vectorWithX:0.0f Y:1.0f Z:0.0f W:0.0f];
52 return [CIVector vectorWithX:0.0f Y:0.0f Z:1.0f W:0.0f];
54 return [CIVector vectorWithX:0.0f Y:0.0f Z:0.0f W:1.0f];
56 return [CIVector vectorWithX:0.0f Y:0.0f Z:0.0f W:0.0f];
60 CIColor* ciColor(const Color& c)
62 CGColorRef colorCG = cgColor(c);
63 CIColor* colorCI = [CIColor colorWithCGColor:colorCG];
64 CGColorRelease(colorCG);
69 CIFilter* getPointLightVectors(CIFilter* normals, CIVector* lightPosition, float surfaceScale)
72 BEGIN_BLOCK_OBJC_EXCEPTIONS;
73 filter = [CIFilter filterWithName:@"WKPointLight"];
77 [filter setValue:[normals valueForKey:@"outputImage"] forKey:@"inputNormalMap"];
78 [filter setValue:lightPosition forKey:@"inputLightPosition"];
79 [filter setValue:[NSNumber numberWithFloat:surfaceScale] forKey:@"inputSurfaceScale"];
81 END_BLOCK_OBJC_EXCEPTIONS;
85 CIFilter* getLightVectors(CIFilter* normals, const SVGLightSource* light, float surfaceScale)
87 [WKDistantLightFilter class];
88 [WKPointLightFilter class];
89 [WKSpotLightFilter class];
91 CIFilter* filter = nil;
92 BEGIN_BLOCK_OBJC_EXCEPTIONS;
94 switch (light->type()) {
97 const SVGDistantLightSource* dlight = static_cast<const SVGDistantLightSource*>(light);
99 filter = [CIFilter filterWithName:@"WKDistantLight"];
102 [filter setDefaults];
104 float azimuth = dlight->azimuth();
105 float elevation = dlight->elevation();
106 azimuth = deg2rad(azimuth);
107 elevation = deg2rad(elevation);
108 float Lx = cosf(azimuth)*cosf(elevation);
109 float Ly = sinf(azimuth)*cosf(elevation);
110 float Lz = sinf(elevation);
112 [filter setValue:[normals valueForKey:@"outputImage"] forKey:@"inputNormalMap"];
113 [filter setValue:[CIVector vectorWithX:Lx Y:Ly Z:Lz] forKey:@"inputLightDirection"];
118 const SVGPointLightSource* plight = static_cast<const SVGPointLightSource*>(light);
119 return getPointLightVectors(normals, [CIVector vectorWithX:plight->position().x() Y:plight->position().y() Z:plight->position().z()], surfaceScale);
123 const SVGSpotLightSource* slight = static_cast<const SVGSpotLightSource*>(light);
124 filter = [CIFilter filterWithName:@"WKSpotLight"];
128 CIFilter* pointLightFilter = getPointLightVectors(normals, [CIVector vectorWithX:slight->position().x() Y:slight->position().y() Z:slight->position().z()], surfaceScale);
129 if (!pointLightFilter)
131 [filter setDefaults];
133 [filter setValue:[pointLightFilter valueForKey:@"outputImage"] forKey:@"inputLightVectors"];
134 [filter setValue:[CIVector vectorWithX:slight->direction().x() Y:slight->direction().y() Z:slight->direction().z()] forKey:@"inputLightDirection"];
135 [filter setValue:[NSNumber numberWithFloat:slight->specularExponent()] forKey:@"inputSpecularExponent"];
136 [filter setValue:[NSNumber numberWithFloat:deg2rad(slight->limitingConeAngle())] forKey:@"inputLimitingConeAngle"];
141 END_BLOCK_OBJC_EXCEPTIONS;
145 CIFilter* getNormalMap(CIImage* bumpMap, float scale)
147 [WKNormalMapFilter class];
149 BEGIN_BLOCK_OBJC_EXCEPTIONS;
150 filter = [CIFilter filterWithName:@"WKNormalMap"];
151 [filter setDefaults];
153 [filter setValue:bumpMap forKey:@"inputImage"];
154 [filter setValue:[NSNumber numberWithFloat:scale] forKey:@"inputSurfaceScale"];
156 END_BLOCK_OBJC_EXCEPTIONS;
162 #endif // ENABLE(SVG) && ENABLE(SVG_FILTERS)