5898daa5aa15addcbcb4c9d75c92f8146eb95d8f
[WebKit-https.git] / WebCore / platform / graphics / qt / ImageQt.cpp
1 /*
2  * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
3  * Copyright (C) 2006 Zack Rusin <zack@kde.org>
4  * Copyright (C) 2006 Simon Hausmann <hausmann@kde.org>
5  * Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
6  *
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32 #include "Image.h"
33
34 #include "BitmapImage.h"
35 #include "FloatRect.h"
36 #include "PlatformString.h"
37 #include "GraphicsContext.h"
38 #include "TransformationMatrix.h"
39 #include "NotImplemented.h"
40 #include "StillImageQt.h"
41 #include "qwebsettings.h"
42
43 #include <QPixmap>
44 #include <QPainter>
45 #include <QImage>
46 #include <QImageReader>
47 #if QT_VERSION >= 0x040300
48 #include <QTransform>
49 #endif
50
51 #include <QDebug>
52
53 #include <math.h>
54
55 // This function loads resources into WebKit
56 static QPixmap loadResourcePixmap(const char *name)
57 {
58     QPixmap pixmap;
59     if (qstrcmp(name, "missingImage") == 0)
60         pixmap = QWebSettings::webGraphic(QWebSettings::MissingImageGraphic);
61     else if (qstrcmp(name, "nullPlugin") == 0)
62         pixmap = QWebSettings::webGraphic(QWebSettings::MissingPluginGraphic);
63     else if (qstrcmp(name, "urlIcon") == 0)
64         pixmap = QWebSettings::webGraphic(QWebSettings::DefaultFrameIconGraphic);
65     else if (qstrcmp(name, "textAreaResizeCorner") == 0)
66         pixmap = QWebSettings::webGraphic(QWebSettings::TextAreaSizeGripCornerGraphic);
67
68     return pixmap;
69 }
70
71 namespace WebCore {
72
73 bool FrameData::clear(bool clearMetadata)
74 {
75     if (clearMetadata)
76         m_haveMetadata = false;
77
78     if (m_frame) {
79         m_frame = 0;
80         return true;
81     }
82     return false;
83 }
84
85
86     
87 // ================================================
88 // Image Class
89 // ================================================
90
91 PassRefPtr<Image> Image::loadPlatformResource(const char* name)
92 {
93     return StillImage::create(loadResourcePixmap(name));
94 }
95
96     
97 void Image::drawPattern(GraphicsContext* ctxt, const FloatRect& tileRect, const TransformationMatrix& patternTransform,
98                         const FloatPoint& phase, CompositeOperator op, const FloatRect& destRect)
99 {
100     QPixmap* framePixmap = nativeImageForCurrentFrame();
101     if (!framePixmap) // If it's too early we won't have an image yet.
102         return;
103
104     QPixmap pixmap = *framePixmap;
105     QRect tr = QRectF(tileRect).toRect();
106     if (tr.x() || tr.y() || tr.width() != pixmap.width() || tr.height() != pixmap.height()) {
107         pixmap = pixmap.copy(tr);
108     }
109
110     QBrush b(pixmap);
111     b.setMatrix(patternTransform);
112     ctxt->save();
113     ctxt->setCompositeOperation(op);
114     QPainter* p = ctxt->platformContext();
115     if (!pixmap.hasAlpha() && p->compositionMode() == QPainter::CompositionMode_SourceOver)
116         p->setCompositionMode(QPainter::CompositionMode_Source);
117     p->setBrushOrigin(phase);
118     p->fillRect(destRect, b);
119     ctxt->restore();
120 }
121
122 void BitmapImage::initPlatformData()
123 {
124 }
125
126 void BitmapImage::invalidatePlatformData()
127 {
128 }
129     
130 // Drawing Routines
131 void BitmapImage::draw(GraphicsContext* ctxt, const FloatRect& dst,
132                        const FloatRect& src, CompositeOperator op)
133 {
134     startAnimation();
135
136     QPixmap* image = nativeImageForCurrentFrame();
137     if (!image)
138         return;
139     
140     if (mayFillWithSolidColor()) {
141         fillWithSolidColor(ctxt, dst, solidColor(), op);
142         return;
143     }
144
145     IntSize selfSize = size();
146
147     ctxt->save();
148
149     // Set the compositing operation.
150     ctxt->setCompositeOperation(op);
151
152     QPainter* painter(ctxt->platformContext());
153
154     if (!image->hasAlpha() && painter->compositionMode() == QPainter::CompositionMode_SourceOver)
155         painter->setCompositionMode(QPainter::CompositionMode_Source);
156
157     // Test using example site at
158     // http://www.meyerweb.com/eric/css/edge/complexspiral/demo.html    
159     painter->drawPixmap(dst, *image, src);
160
161     ctxt->restore();
162 }
163
164 void BitmapImage::checkForSolidColor()
165 {
166     m_isSolidColor = false;
167     m_checkedForSolidColor = true;
168
169     if (frameCount() > 1)
170         return;
171
172     QPixmap* framePixmap = frameAtIndex(0);
173     if (!framePixmap || framePixmap->width() != 1 || framePixmap->height() != 1)
174         return;
175
176     m_isSolidColor = true;
177     m_solidColor = QColor(framePixmap->toImage().pixel(0, 0));
178 }
179
180 }
181
182
183 // vim: ts=4 sw=4 et