Reviewed by Hyatt.
[WebKit-https.git] / WebCore / kcanvas / KCanvasFilters.h
1 /*
2     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
3                   2004, 2005 Rob Buis <buis@kde.org>
4                   2005 Eric Seidel <eric.seidel@kdemail.net>
5
6     This file is part of the KDE project
7
8     This library is free software; you can redistribute it and/or
9     modify it under the terms of the GNU Library General Public
10     License as published by the Free Software Foundation; either
11     version 2 of the License, or (at your option) any later version.
12
13     This library is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16     Library General Public License for more details.
17
18     You should have received a copy of the GNU Library General Public License
19     aint with this library; see the file COPYING.LIB.  If not, write to
20     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21     Boston, MA 02111-1307, USA.
22 */
23
24 #ifndef KCanvasFilters_H
25 #define KCanvasFilters_H
26
27 #include "KCanvasResources.h"
28 #include <QSizeF>
29 #include <qcolor.h>
30 #include <qstringlist.h>
31
32 #ifdef __OBJC__
33 @class CIFilter;
34 #else
35 class CIFilter;
36 #endif
37 class KCanvasFilterQuartz;
38
39 // Enumerations
40 typedef enum
41 {
42     FE_DISTANT_LIGHT = 0,
43     FE_POINT_LIGHT = 1,
44     FE_SPOT_LIGHT = 2,
45     FE_BLEND = 3,
46     FE_COLOR_MATRIX = 4,
47     FE_COMPONENT_TRANSFER = 5,
48     FE_COMPOSITE = 6,
49     FE_CONVOLVE_MATRIX = 7,
50     FE_DIFFUSE_LIGHTING = 8,
51     FE_DISPLACEMENT_MAP = 9,
52     FE_FLOOD = 10,
53     FE_GAUSSIAN_BLUR = 11,
54     FE_IMAGE = 12,
55     FE_MERGE = 13,
56     FE_MORPHOLOGY = 14,
57     FE_OFFSET = 15,
58     FE_SPECULAR_LIGHTING = 16,
59     FE_TILE = 17,
60     FE_TURBULENCE = 18
61 } KCFilterEffectType;
62
63 class KCanvasPoint3F {
64 public:
65     KCanvasPoint3F() : m_x(0), m_y(0), m_z(0) { }
66     KCanvasPoint3F(float x, float y, float z) : m_x(x), m_y(y), m_z(z) { }
67     
68     float x() const { return m_x; }
69     void setX(float x) { m_x = x; }
70     
71     float y() const { return m_y; }
72     void setY(float y) { m_y = y; }
73     
74     float z() const { return m_z; }
75     void setZ(float z) { m_z = z; }
76     
77     void normalize();
78     
79 private:
80     float m_x;
81     float m_y;
82     float m_z;
83 };
84
85 class KCanvasFilterEffect;
86 class KRenderingDevice;
87
88 class KCanvasFilter : public KCanvasResource
89 {
90 public:
91     KCanvasFilter() { };
92     virtual ~KCanvasFilter() { };
93     
94     virtual bool isFilter() const { return true; }
95     
96     bool filterBoundingBoxMode() const { return m_filterBBoxMode; }
97     void setFilterBoundingBoxMode(bool bboxMode) { m_filterBBoxMode = bboxMode; }
98     
99     bool effectBoundingBoxMode() const { return m_effectBBoxMode; }
100     void setEffectBoundingBoxMode(bool bboxMode) { m_effectBBoxMode = bboxMode; }    
101
102     QRectF filterRect() const { return m_filterRect; }
103     void setFilterRect(const QRectF &rect) { m_filterRect = rect; }
104
105     void addFilterEffect(KCanvasFilterEffect *effect);
106
107     virtual void prepareFilter(KRenderingDevice *device, const QRectF &bbox) = 0;
108     virtual void applyFilter(KRenderingDevice *device, const QRectF &bbox) = 0;
109
110     QTextStream &externalRepresentation(QTextStream &) const;
111
112 protected:
113     QRectF m_filterRect;
114     Q3ValueList<KCanvasFilterEffect *> m_effects;
115     bool m_filterBBoxMode;
116     bool m_effectBBoxMode;
117 };
118
119 KCanvasFilter *getFilterById(KDOM::DocumentImpl *document, const KDOM::DOMString &id);
120
121 class KCanvasFilterEffect
122 {
123 public:
124     // this default constructor is only needed for gcc 3.3
125     KCanvasFilterEffect() { }
126     virtual ~KCanvasFilterEffect() { };
127
128     virtual KCFilterEffectType effectType() const { return FE_TURBULENCE; }
129
130     QRectF subRegion() const;
131     void setSubRegion(const QRectF &subregion);
132
133     QString in() const;
134     void setIn(const QString &in);
135
136     QString result() const;
137     void setResult(const QString &result);
138
139 #if __APPLE__
140     virtual CIFilter* getCIFilter(KCanvasFilterQuartz*) const = 0;
141 #endif
142
143     virtual QTextStream &externalRepresentation(QTextStream &) const;
144
145 private:
146     QRectF m_subregion;
147     QString m_in;
148     QString m_result;
149 };
150
151 QTextStream &operator<<(QTextStream &, const KCanvasFilterEffect &);
152
153 typedef enum {
154     BM_NORMAL = 0,
155     BM_MULTIPLY = 1,
156     BM_SCREEN = 2,
157     BM_DARKEN = 3,
158     BM_LIGHTEN = 4
159 } KCBlendModeType;
160
161 class KCanvasFEBlend : public KCanvasFilterEffect
162 {
163 public:
164     QString in2() const { return m_in2; }
165     void setIn2(const QString &in2) { m_in2 = in2; }
166     
167     KCBlendModeType blendMode() const { return m_mode; }
168     void setBlendMode(KCBlendModeType mode) { m_mode = mode; }
169
170     QTextStream &externalRepresentation(QTextStream &) const;
171
172 private:
173     KCBlendModeType m_mode;
174     QString m_in2;
175 };
176
177 typedef enum {
178     CMT_MATRIX = 0,
179     CMT_SATURATE = 1,
180     CMT_HUE_ROTATE = 2,
181     CMT_LUMINANCE_TO_ALPHA = 3
182 } KCColorMatrixType;
183
184 class KCanvasFEColorMatrix : public KCanvasFilterEffect
185 {
186 public:
187     KCColorMatrixType type() const { return m_type; }
188     void setType(KCColorMatrixType type) { m_type = type; }
189
190     Q3ValueList<float> values() const { return m_values; }
191     void setValues(const Q3ValueList<float> &values) { m_values = values; };
192
193     QTextStream &externalRepresentation(QTextStream &) const;
194
195 private:
196     KCColorMatrixType m_type;
197     Q3ValueList<float> m_values;
198 };
199
200 typedef enum {
201     CT_IDENTITY = 0,
202     CT_TABLE = 1,
203     CT_DISCRETE = 2,
204     CT_LINEAR = 3,
205     CT_GAMMA = 4
206 } KCComponentTransferType;
207
208 struct KCComponentTransferFunction
209 {
210     KCComponentTransferType type;
211     Q3ValueList<float> tableValues;
212     float slope;
213     float intercept;
214     float amplitude;
215     float exponent;
216     float offset;
217 };
218
219 class KCanvasFEComponentTransfer : public KCanvasFilterEffect
220 {
221 public:    
222     KCComponentTransferFunction redFunction() const { return m_redFunc; }
223     void setRedFunction(const KCComponentTransferFunction& func) { m_redFunc = func; }
224     
225     KCComponentTransferFunction greenFunction() const { return m_greenFunc; }
226     void setGreenFunction(const KCComponentTransferFunction& func) { m_greenFunc = func; }
227     
228     KCComponentTransferFunction blueFunction() const { return m_blueFunc; }
229     void setBlueFunction(const KCComponentTransferFunction& func) { m_blueFunc = func; }
230     
231     KCComponentTransferFunction alphaFunction() const { return m_alphaFunc; }
232     void setAlphaFunction(const KCComponentTransferFunction& func) { m_alphaFunc = func; }
233
234     QTextStream& externalRepresentation(QTextStream&) const;
235
236 private:
237     KCComponentTransferFunction m_redFunc;
238     KCComponentTransferFunction m_greenFunc;
239     KCComponentTransferFunction m_blueFunc;
240     KCComponentTransferFunction m_alphaFunc;
241 };
242
243 typedef enum {
244     CO_OVER = 0,
245     CO_IN = 1,
246     CO_OUT = 2,
247     CO_ATOP = 3,
248     CO_XOR = 4,
249     CO_ARITHMETIC = 5,
250 } KCCompositeOperationType;
251
252 class KCanvasFEComposite : public KCanvasFilterEffect
253 {
254 public:
255     QString in2() const { return m_in2; }
256     void setIn2(const QString &in2) { m_in2 = in2; }
257     
258     KCCompositeOperationType operation() const { return m_operation; }
259     void setOperation(KCCompositeOperationType oper) { m_operation = oper; }
260     
261     float k1() const { return m_k1; }
262     void setK1(float k1) { m_k1 = k1; }
263     float k2() const { return m_k2;}
264     void setK2(float k2) { m_k2 = k2; }
265     float k3() const { return m_k3; }
266     void setK3(float k3) { m_k3 = k3; }
267     float k4() const { return m_k4; }
268     void setK4(float k4) { m_k4 = k4; }
269
270     QTextStream &externalRepresentation(QTextStream &) const;
271
272 private:
273     QString m_in2;
274     KCCompositeOperationType m_operation;
275     float m_k1;
276     float m_k2;
277     float m_k3;
278     float m_k4;
279 };
280
281 typedef enum {
282     EM_DUPLICATE = 0,
283     EM_WRAP = 1,
284     EM_NONE = 2
285 } KCEdgeModeType;
286
287 class KCanvasFEConvolveMatrix : public KCanvasFilterEffect
288 {
289 public:
290     KCanvasFEConvolveMatrix() { };
291
292     QSizeF kernelSize() const { return m_kernelSize; }
293     void setKernelSize(QSizeF kernelSize) { m_kernelSize = kernelSize; }
294     
295     Q3ValueList<float> kernel() const { return m_kernelMatrix; }
296     void setKernel(Q3ValueList<float> kernel) { m_kernelMatrix = kernel; }
297     
298     float divisor() const { return m_divisor; }
299     void setDivisor(float divisor) { m_divisor = divisor; }
300     
301     float bias() const { return m_bias; }
302     void setBias(float bias) { m_bias = bias; }
303     
304     QSizeF targetOffset() const { return m_targetOffset; }
305     void setTargetOffset(QSizeF targetOffset) { m_targetOffset = targetOffset; }
306     
307     KCEdgeModeType edgeMode() const { return m_edgeMode; }
308     void setEdgeMode(KCEdgeModeType edgeMode) { m_edgeMode = edgeMode; }
309     
310     QPointF kernelUnitLength() const {return m_kernelUnitLength; }
311     void setKernelUnitLength(QPointF kernelUnitLength) { m_kernelUnitLength = kernelUnitLength; }
312     
313     bool preserveAlpha() const { return m_preserveAlpha; }
314     void setPreserveAlpha(bool preserveAlpha) { m_preserveAlpha = preserveAlpha; }
315
316     QTextStream &externalRepresentation(QTextStream &) const;
317
318 private:
319     QSizeF m_kernelSize;
320     Q3ValueList<float> m_kernelMatrix; // maybe should be a real matrix?
321     float m_divisor;
322     float m_bias;
323     QSizeF m_targetOffset;
324     KCEdgeModeType m_edgeMode;
325     QPointF m_kernelUnitLength;
326     bool m_preserveAlpha;
327 };
328
329 typedef enum{
330     LS_DISTANT,
331     LS_POINT,
332     LS_SPOT
333 } KCLightType;
334
335 //The light source for Diffuse/SpecularLighting
336 class KCLightSource
337 {
338 public:
339     KCLightSource(KCLightType a_type) : m_type(a_type) { }
340     
341     virtual ~KCLightSource() { }
342     
343     KCLightType type() const { return m_type; }
344     
345     virtual QTextStream &externalRepresentation(QTextStream &) const = 0;
346     
347 private:
348     KCLightType m_type;
349 };
350
351 class KCDistantLightSource : public KCLightSource
352 {
353 public:
354     KCDistantLightSource(float azimuth, float elevation) :
355         KCLightSource(LS_DISTANT), m_azimuth(azimuth), m_elevation(elevation) { }
356     
357     float azimuth() const{ return m_azimuth; }
358     float elevation() const{ return m_elevation; }
359     
360     virtual QTextStream &externalRepresentation(QTextStream &) const;
361     
362 private:
363     float m_azimuth;
364     float m_elevation;
365 };
366
367 class KCPointLightSource : public KCLightSource
368 {
369 public:
370     KCPointLightSource(KCanvasPoint3F& position) : KCLightSource(LS_POINT), m_position(position) { }
371     
372     const KCanvasPoint3F& position() const { return m_position; }
373     
374     virtual QTextStream &externalRepresentation(QTextStream &) const;
375
376 private:
377     KCanvasPoint3F m_position;
378 };
379
380 class KCSpotLightSource : public KCLightSource
381 {
382 public:
383     KCSpotLightSource(KCanvasPoint3F& position, KCanvasPoint3F& direction, 
384         float specularExponent, float limitingConeAngle) : KCLightSource(LS_SPOT), 
385         m_position(position), m_direction(direction), m_specularExponent(specularExponent), m_limitingConeAngle(limitingConeAngle) { }
386     
387     const KCanvasPoint3F& position() const { return m_position; }
388     const KCanvasPoint3F& direction() const { return m_direction; }
389     float specularExponent() const { return m_specularExponent; }
390     float limitingConeAngle() const { return m_limitingConeAngle; }
391     
392     virtual QTextStream &externalRepresentation(QTextStream &) const;
393 private:
394     KCanvasPoint3F m_position;
395     KCanvasPoint3F m_direction;
396     float          m_specularExponent;
397     float          m_limitingConeAngle;
398 };
399
400 class KCanvasFEDiffuseLighting : public KCanvasFilterEffect
401 {
402 public:
403     KCanvasFEDiffuseLighting() : m_lightSource(0) { }
404     ~KCanvasFEDiffuseLighting() { delete m_lightSource; }
405
406     QColor lightingColor() const { return m_lightingColor; }
407     void setLightingColor(const QColor &lightingColor) { m_lightingColor = lightingColor; }
408
409     float surfaceScale() const { return m_surfaceScale; }
410     void setSurfaceScale(float surfaceScale) { m_surfaceScale = surfaceScale; }
411     
412     float diffuseConstant() const { return m_diffuseConstant; }
413     void setDiffuseConstant(float diffuseConstant) { m_diffuseConstant = diffuseConstant; }
414     
415     float kernelUnitLengthX() const { return m_kernelUnitLengthX; }
416     void setKernelUnitLengthX(float kernelUnitLengthX) { m_kernelUnitLengthX = kernelUnitLengthX; }
417     
418     float kernelUnitLengthY() const { return m_kernelUnitLengthY; }
419     void setKernelUnitLengthY(float kernelUnitLengthY) { m_kernelUnitLengthY = kernelUnitLengthY; }
420
421     const KCLightSource *lightSource() const { return m_lightSource; }
422     void setLightSource(KCLightSource *lightSource);
423     
424     QTextStream &externalRepresentation(QTextStream &) const;
425
426 private:
427     QColor m_lightingColor;
428     float m_surfaceScale;
429     float m_diffuseConstant;
430     float m_kernelUnitLengthX;
431     float m_kernelUnitLengthY;
432     KCLightSource *m_lightSource;
433 };
434
435 typedef enum {
436     CS_RED = 0,
437     CS_GREEN = 1,
438     CS_BLUE = 2,
439     CS_ALPHA = 3
440 } KCChannelSelectorType;
441
442 class KCanvasFEDisplacementMap : public KCanvasFilterEffect
443 {
444 public:
445     QString in2() const { return m_in2; }
446     void setIn2(const QString &in2) { m_in2 = in2; }
447
448     QTextStream &externalRepresentation(QTextStream &) const;
449     
450 private:
451     float m_scale;
452     KCChannelSelectorType m_XChannelSelector;
453     KCChannelSelectorType m_YChannelSelector;
454     QString m_in2;
455 };
456
457 class KCanvasFEFlood : public KCanvasFilterEffect
458 {
459 public:
460     QColor floodColor() const { return m_floodColor; }
461     void setFloodColor(const QColor &color) { m_floodColor = color; }
462
463     float floodOpacity() const { return m_floodOpacity; }
464     void setFloodOpacity(float floodOpacity) { m_floodOpacity = floodOpacity; }
465
466     QTextStream &externalRepresentation(QTextStream &) const;
467
468 private:
469     QColor m_floodColor;
470     float m_floodOpacity;
471 };
472
473 class KCanvasFEGaussianBlur : public KCanvasFilterEffect
474 {
475 public:
476     float stdDeviationX() const;
477     void setStdDeviationX(float x);
478
479     float stdDeviationY() const;
480     void setStdDeviationY(float y);
481
482     QTextStream &externalRepresentation(QTextStream &) const;
483
484 private:
485     float m_x;
486     float m_y;
487 };
488
489 class KCanvasFEImage : public KCanvasFilterEffect
490 {
491 public:
492     KCanvasFEImage() { }
493     virtual ~KCanvasFEImage() { };
494     
495     // FIXME: Eventually we need to support <svg> (RenderObject *) as well as pixmap data.
496     
497     QPixmap pixmap() const { return m_pixmap; }
498     void setPixmap(const QPixmap& pixmap) { m_pixmap = pixmap; }
499
500     QTextStream &externalRepresentation(QTextStream &) const;
501     
502 private:
503     khtml::RenderObject *m_renderObject;
504     QPixmap m_pixmap;
505 };
506
507 class KCanvasFEMerge : public KCanvasFilterEffect
508 {
509 public:
510     QStringList mergeInputs() const { return m_mergeInputs; }
511     void setMergeInputs(const QStringList &mergeInputs) { m_mergeInputs = mergeInputs; }
512
513     QTextStream &externalRepresentation(QTextStream &) const;
514     
515 private:
516     QStringList m_mergeInputs;
517 };
518
519 typedef enum {
520     MO_ERODE = 0,
521     MO_DIALATE = 1
522 } KCMorphologyOperatorType;
523
524 class KCanvasFEMorphology : public KCanvasFilterEffect
525 {
526 public:
527     KCMorphologyOperatorType morphologyOperator() const { return m_operator; }
528     void setMorphologyOperator(KCMorphologyOperatorType _operator) { m_operator = _operator; }
529
530     float radiusX() const { return m_radiusX; }
531     void setRadiusX(float radiusX) { m_radiusX = radiusX; }
532
533     float radiusY() const { return m_radiusY; }
534     void setRadiusY(float radiusY) { m_radiusY = radiusY; }
535     
536     QTextStream &externalRepresentation(QTextStream &) const;
537     
538 private:
539     KCMorphologyOperatorType m_operator;
540     float m_radiusX;
541     float m_radiusY;
542 };
543
544 class KCanvasFEOffset : public KCanvasFilterEffect
545 {
546 public:
547     float dx() const { return m_dx; }
548     void setDx(float dx) { m_dx = dx; }
549
550     float dy() const { return m_dy; }
551     void setDy(float dy) { m_dy = dy; }
552     
553     QTextStream &externalRepresentation(QTextStream &) const;
554     
555 private:
556     float m_dx;
557     float m_dy;
558 };
559
560 class KCanvasFESpecularLighting : public KCanvasFilterEffect
561 {
562 public:
563     KCanvasFESpecularLighting() : m_lightSource(0) { }
564     ~KCanvasFESpecularLighting() { delete m_lightSource; }
565
566     QColor lightingColor() const { return m_lightingColor; }
567     void setLightingColor(const QColor &lightingColor) { m_lightingColor = lightingColor; }
568
569     float surfaceScale() const { return m_surfaceScale; }
570     void setSurfaceScale(float surfaceScale) { m_surfaceScale = surfaceScale; }
571     
572     float specularConstant() const { return m_specularConstant; }
573     void setSpecularConstant(float specularConstant) { m_specularConstant = specularConstant; }
574     
575     float specularExponent() const { return m_specularExponent; }
576     void setSpecularExponent(float specularExponent) { m_specularExponent = specularExponent; }
577     
578     float kernelUnitLengthX() const { return m_kernelUnitLengthX; }
579     void setKernelUnitLengthX(float kernelUnitLengthX) { m_kernelUnitLengthX = kernelUnitLengthX; }
580     
581     float kernelUnitLengthY() const { return m_kernelUnitLengthY; }
582     void setKernelUnitLengthY(float kernelUnitLengthY) { m_kernelUnitLengthY = kernelUnitLengthY; }
583     
584     const KCLightSource *lightSource() const { return m_lightSource; }
585     void setLightSource(KCLightSource *lightSource);
586     
587     QTextStream &externalRepresentation(QTextStream &) const;
588     
589 private:
590     QColor m_lightingColor;
591     float m_surfaceScale;
592     float m_specularConstant;
593     float m_specularExponent;
594     float m_kernelUnitLengthX;
595     float m_kernelUnitLengthY;
596     KCLightSource *m_lightSource;
597 };
598
599 class KCanvasFETile : public KCanvasFilterEffect { };
600
601 typedef enum {
602     TT_TURBULANCE = 0,
603     TT_NOISE = 1
604 } KCTurbulanceType;
605
606 class KCanvasFETurbulence : public KCanvasFilterEffect
607 {
608 public:
609     KCTurbulanceType type() const { return m_type; }
610     void setType(KCTurbulanceType type) { m_type = type; }
611
612     float baseFrequencyY() const { return m_baseFrequencyY; }
613     void setBaseFrequencyY(float baseFrequencyY) { m_baseFrequencyY = baseFrequencyY; }
614
615     float baseFrequencyX() const { return m_baseFrequencyX; }
616     void setBaseFrequencyX(float baseFrequencyX) { m_baseFrequencyX = baseFrequencyX; }
617
618     float seed() const { return m_seed; }
619     void setSeed(float seed) { m_seed = seed; }
620
621     int numOctaves() const { return m_numOctaves; }
622     void setNumOctaves(bool numOctaves) { m_numOctaves = numOctaves; }
623
624     bool stitchTiles() const { return m_stitchTiles; }
625     void setStitchTiles(bool stitch) { m_stitchTiles = stitch; }
626
627     QTextStream &externalRepresentation(QTextStream &) const;
628     
629 private:
630     float m_baseFrequencyX;
631     float m_baseFrequencyY;
632     int m_numOctaves;
633     float m_seed;
634     bool m_stitchTiles;
635     KCTurbulanceType m_type;
636 };
637
638 #endif