Unreviewed gardening, eval-blocked-in-about-blank-iframe.html: SLOW -> TIMEOUT
[WebKit-https.git] / Source / WebCore / platform / image-decoders / qt / ImageFrameQt.cpp
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  * Copyright (C) 2008, 2009 Google, Inc.
4  * Copyright (C) 2009 Holger Hans Peter Freyther
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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 #include "config.h"
29 #include "ImageDecoder.h"
30
31 #include "NotImplemented.h"
32
33 namespace WebCore {
34
35 #if USE(QT_IMAGE_DECODER)
36
37 ImageFrame::ImageFrame()
38     : m_hasAlpha(false) 
39     , m_size()
40     , m_status(FrameEmpty)
41     , m_duration(0)
42     , m_disposalMethod(DisposeNotSpecified)
43     , m_premultiplyAlpha(true)
44 {
45 }
46
47 ImageFrame& ImageFrame::operator=(const ImageFrame& other)
48 {
49     if (this == &other)
50         return *this;
51
52     copyBitmapData(other);
53     setOriginalFrameRect(other.originalFrameRect());
54     setStatus(other.status());
55     setDuration(other.duration());
56     setDisposalMethod(other.disposalMethod());
57     setPremultiplyAlpha(other.premultiplyAlpha());
58     return *this;
59 }
60
61 void ImageFrame::clearPixelData()
62 {
63     m_pixmap = QPixmap();
64     m_image = QImage();
65     m_status = FrameEmpty;
66     // NOTE: Do not reset other members here; clearFrameBufferCache()
67     // calls this to free the bitmap data, but other functions like
68     // initFrameBuffer() and frameComplete() may still need to read
69     // other metadata out of this frame later.
70 }
71
72 void ImageFrame::zeroFillPixelData()
73 {
74     if (m_pixmap.isNull() && !m_image.isNull()) {
75         m_pixmap = QPixmap(m_image.width(), m_image.height());
76         m_image = QImage();
77     }
78     m_pixmap.fill(QColor(0, 0, 0, 0));
79 }
80
81 bool ImageFrame::copyBitmapData(const ImageFrame& other)
82 {
83     if (this == &other)
84         return true;
85
86     m_image = other.m_image;
87     m_pixmap = other.m_pixmap;
88     m_size = other.m_size;
89     m_hasAlpha = other.m_hasAlpha;
90     return true;
91 }
92
93 bool ImageFrame::setSize(int newWidth, int newHeight)
94 {
95     // setSize() should only be called once, it leaks memory otherwise.
96     ASSERT(!width() && !height());
97
98     m_size = IntSize(newWidth, newHeight);
99     m_image = QImage();
100     m_pixmap = QPixmap(newWidth, newHeight);
101     if (m_pixmap.isNull())
102         return false;
103
104     zeroFillPixelData();
105     return true;
106 }
107
108 QPixmap* ImageFrame::asNewNativeImage() const
109 {
110     if (m_pixmap.isNull() && !m_image.isNull()) {
111         m_pixmap = QPixmap::fromImage(m_image);
112         m_image = QImage();
113     }
114     return new QPixmap(m_pixmap);
115 }
116
117 bool ImageFrame::hasAlpha() const
118 {
119     return m_hasAlpha;
120 }
121
122 void ImageFrame::setHasAlpha(bool alpha)
123 {
124     m_hasAlpha = alpha;
125 }
126
127 void ImageFrame::setColorProfile(const ColorProfile& colorProfile)
128 {
129     notImplemented();
130 }
131
132 void ImageFrame::setStatus(FrameStatus status)
133 {
134     m_status = status;
135 }
136
137 // The image must not have format 8888 pre multiplied...
138 void ImageFrame::setPixmap(const QPixmap& pixmap)
139 {
140     m_pixmap = pixmap;
141     m_image = QImage();
142     m_size = pixmap.size();
143     m_hasAlpha = pixmap.hasAlphaChannel();
144 }
145
146 int ImageFrame::width() const
147 {
148     return m_size.width();
149 }
150
151 int ImageFrame::height() const
152 {
153     return m_size.height();
154 }
155
156 #else
157
158 QPixmap* ImageFrame::asNewNativeImage() const
159 {
160     QImage::Format fmt;
161     if (m_hasAlpha)
162         fmt = m_premultiplyAlpha ?  QImage::Format_ARGB32_Premultiplied : QImage::Format_ARGB32;
163     else
164         fmt = QImage::Format_RGB32;
165
166     QImage img(reinterpret_cast<uchar*>(m_bytes), m_size.width(), m_size.height(), sizeof(PixelData) * m_size.width(), fmt);
167
168     return new QPixmap(QPixmap::fromImage(img));
169 }
170
171 #endif // USE(QT_IMAGE_DECODER)
172
173 }