• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  * Copyright (C) 2008, 2009 Google, Inc.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #include "config.h"
28 #include "ImageDecoder.h"
29 #if PLATFORM(ANDROID)
30 #include "SkBitmapRef.h"
31 #endif
32 
33 #include "NotImplemented.h"
34 
35 namespace WebCore {
36 
ImageFrame()37 ImageFrame::ImageFrame()
38     : m_status(FrameEmpty)
39     , m_duration(0)
40     , m_disposalMethod(DisposeNotSpecified)
41     , m_premultiplyAlpha(true)
42 {
43 }
44 
operator =(const ImageFrame & other)45 ImageFrame& ImageFrame::operator=(const ImageFrame& other)
46 {
47     if (this == &other)
48         return *this;
49 
50     m_bitmap = other.m_bitmap;
51     // Keep the pixels locked since we will be writing directly into the
52     // bitmap throughout this object's lifetime.
53     m_bitmap.lockPixels();
54     setOriginalFrameRect(other.originalFrameRect());
55     setStatus(other.status());
56     setDuration(other.duration());
57     setDisposalMethod(other.disposalMethod());
58     setPremultiplyAlpha(other.premultiplyAlpha());
59     return *this;
60 }
61 
clearPixelData()62 void ImageFrame::clearPixelData()
63 {
64     m_bitmap.reset();
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 
zeroFillPixelData()72 void ImageFrame::zeroFillPixelData()
73 {
74     m_bitmap.eraseARGB(0, 0, 0, 0);
75 }
76 
copyBitmapData(const ImageFrame & other)77 bool ImageFrame::copyBitmapData(const ImageFrame& other)
78 {
79     if (this == &other)
80         return true;
81 
82     m_bitmap.reset();
83     const NativeImageSkia& otherBitmap = other.m_bitmap;
84     return otherBitmap.copyTo(&m_bitmap, otherBitmap.config());
85 }
86 
setSize(int newWidth,int newHeight)87 bool ImageFrame::setSize(int newWidth, int newHeight)
88 {
89     // This function should only be called once, it will leak memory
90     // otherwise.
91     ASSERT(width() == 0 && height() == 0);
92     m_bitmap.setConfig(SkBitmap::kARGB_8888_Config, newWidth, newHeight);
93     if (!m_bitmap.allocPixels())
94         return false;
95 
96     zeroFillPixelData();
97 
98     return true;
99 }
100 
asNewNativeImage() const101 NativeImagePtr ImageFrame::asNewNativeImage() const
102 {
103 #if PLATFORM(ANDROID)
104     return new SkBitmapRef(m_bitmap);
105 #else
106     return new NativeImageSkia(m_bitmap);
107 #endif
108 }
109 
hasAlpha() const110 bool ImageFrame::hasAlpha() const
111 {
112     return !m_bitmap.isOpaque();
113 }
114 
setHasAlpha(bool alpha)115 void ImageFrame::setHasAlpha(bool alpha)
116 {
117     m_bitmap.setIsOpaque(!alpha);
118 }
119 
setColorProfile(const ColorProfile & colorProfile)120 void ImageFrame::setColorProfile(const ColorProfile& colorProfile)
121 {
122     notImplemented();
123 }
124 
setStatus(FrameStatus status)125 void ImageFrame::setStatus(FrameStatus status)
126 {
127     m_status = status;
128     if (m_status == FrameComplete)
129         m_bitmap.setDataComplete();  // Tell the bitmap it's done.
130 }
131 
width() const132 int ImageFrame::width() const
133 {
134     return m_bitmap.width();
135 }
136 
height() const137 int ImageFrame::height() const
138 {
139     return m_bitmap.height();
140 }
141 
142 } // namespace WebCore
143