Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. | 2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. |
| 3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. | 3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 enum AlphaBlendSource { | 59 enum AlphaBlendSource { |
| 60 // Blend non-opaque pixels atop the corresponding pixels in the | 60 // Blend non-opaque pixels atop the corresponding pixels in the |
| 61 // initial buffer state (i.e. any previous frame buffer after having | 61 // initial buffer state (i.e. any previous frame buffer after having |
| 62 // been properly disposed). | 62 // been properly disposed). |
| 63 BlendAtopPreviousFrame, | 63 BlendAtopPreviousFrame, |
| 64 | 64 |
| 65 // Blend non-opaque pixels against fully transparent (i.e. simply | 65 // Blend non-opaque pixels against fully transparent (i.e. simply |
| 66 // overwrite the corresponding pixels). | 66 // overwrite the corresponding pixels). |
| 67 BlendAtopBgcolor, | 67 BlendAtopBgcolor, |
| 68 }; | 68 }; |
| 69 | |
| 70 enum ColorType { | |
| 71 RGBA8888 = kRGBA_8888_SkColorType, | |
| 72 RGB565 = kRGB_565_SkColorType | |
| 73 }; | |
| 74 | |
| 69 typedef uint32_t PixelData; | 75 typedef uint32_t PixelData; |
| 76 typedef uint16_t PixelData16; | |
| 70 | 77 |
| 71 ImageFrame(); | 78 ImageFrame(); |
| 72 | 79 |
| 73 // The assignment operator reads m_hasAlpha (inside setStatus()) before it | 80 // The assignment operator reads m_hasAlpha (inside setStatus()) before it |
| 74 // sets it (in setHasAlpha()). This doesn't cause any problems, since the | 81 // sets it (in setHasAlpha()). This doesn't cause any problems, since the |
| 75 // setHasAlpha() call ensures all state is set correctly, but it means we | 82 // setHasAlpha() call ensures all state is set correctly, but it means we |
| 76 // need to initialize m_hasAlpha to some value before calling the operator | 83 // need to initialize m_hasAlpha to some value before calling the operator |
| 77 // lest any tools complain about using an uninitialized value. | 84 // lest any tools complain about using an uninitialized value. |
| 78 ImageFrame(const ImageFrame& other) : m_hasAlpha(false) { operator=(other); } | 85 ImageFrame(const ImageFrame& other) : m_hasAlpha(false) { operator=(other); } |
| 79 | 86 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 102 ASSERT(endY <= height()); | 109 ASSERT(endY <= height()); |
| 103 const int rowBytes = (endX - startX) * sizeof(PixelData); | 110 const int rowBytes = (endX - startX) * sizeof(PixelData); |
| 104 const PixelData* const startAddr = getAddr(startX, startY); | 111 const PixelData* const startAddr = getAddr(startX, startY); |
| 105 for (int destY = startY + 1; destY < endY; ++destY) | 112 for (int destY = startY + 1; destY < endY; ++destY) |
| 106 memcpy(getAddr(startX, destY), startAddr, rowBytes); | 113 memcpy(getAddr(startX, destY), startAddr, rowBytes); |
| 107 } | 114 } |
| 108 | 115 |
| 109 // Allocates space for the pixel data. Must be called before any pixels | 116 // Allocates space for the pixel data. Must be called before any pixels |
| 110 // are written. Must only be called once. Returns whether allocation | 117 // are written. Must only be called once. Returns whether allocation |
| 111 // succeeded. | 118 // succeeded. |
| 112 bool setSize(int newWidth, int newHeight); | 119 // called from decoder before start writing pixel data |
|
scroggo_chromium
2015/10/19 20:41:36
I don't see how this says anything different from
aleksandar.stojiljkovic
2015/10/20 09:51:12
Updating it, "Must only be called once" is not nee
| |
| 120 bool setSize(int newWidth, int newHeight, ColorType bitmapType = RGBA8888); | |
| 113 | 121 |
| 114 // Returns a caller-owned pointer to the underlying native image data. | 122 // Returns a caller-owned pointer to the underlying native image data. |
| 115 // (Actual use: This pointer will be owned by BitmapImage and freed in | 123 // (Actual use: This pointer will be owned by BitmapImage and freed in |
| 116 // FrameData::clear()). | 124 // FrameData::clear()). |
| 117 const SkBitmap& bitmap() const; | 125 const SkBitmap& bitmap() const; |
| 118 | 126 |
| 119 bool hasAlpha() const; | 127 bool hasAlpha() const; |
| 120 const IntRect& originalFrameRect() const { return m_originalFrameRect; } | 128 const IntRect& originalFrameRect() const { return m_originalFrameRect; } |
| 121 Status status() const { return m_status; } | 129 Status status() const { return m_status; } |
| 122 unsigned duration() const { return m_duration; } | 130 unsigned duration() const { return m_duration; } |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 139 // The pixelsChanged flag needs to be set when the raw pixel data was direct ly modified | 147 // The pixelsChanged flag needs to be set when the raw pixel data was direct ly modified |
| 140 // (e.g. through a pointer or setRGBA). The flag is usually set after a batc h of changes was made. | 148 // (e.g. through a pointer or setRGBA). The flag is usually set after a batc h of changes was made. |
| 141 void setPixelsChanged(bool pixelsChanged) { m_pixelsChanged = pixelsChanged; } | 149 void setPixelsChanged(bool pixelsChanged) { m_pixelsChanged = pixelsChanged; } |
| 142 void setRequiredPreviousFrameIndex(size_t previousFrameIndex) { m_requiredPr eviousFrameIndex = previousFrameIndex; } | 150 void setRequiredPreviousFrameIndex(size_t previousFrameIndex) { m_requiredPr eviousFrameIndex = previousFrameIndex; } |
| 143 | 151 |
| 144 inline PixelData* getAddr(int x, int y) | 152 inline PixelData* getAddr(int x, int y) |
| 145 { | 153 { |
| 146 return m_bitmap.getAddr32(x, y); | 154 return m_bitmap.getAddr32(x, y); |
| 147 } | 155 } |
| 148 | 156 |
| 157 template<class T> | |
| 158 inline T* getAddrT(int x, int y) | |
| 159 { | |
| 160 ASSERT_NOT_REACHED(); | |
| 161 } | |
| 162 | |
| 149 inline void setRGBA(int x, int y, unsigned r, unsigned g, unsigned b, unsign ed a) | 163 inline void setRGBA(int x, int y, unsigned r, unsigned g, unsigned b, unsign ed a) |
| 150 { | 164 { |
| 151 setRGBA(getAddr(x, y), r, g, b, a); | 165 setRGBA(getAddr(x, y), r, g, b, a); |
| 152 } | 166 } |
| 153 | 167 |
| 154 inline void setRGBA(PixelData* dest, unsigned r, unsigned g, unsigned b, uns igned a) | 168 inline void setRGBA(PixelData* dest, unsigned r, unsigned g, unsigned b, uns igned a) |
| 155 { | 169 { |
| 156 if (m_premultiplyAlpha) | 170 if (m_premultiplyAlpha) |
| 157 setRGBAPremultiply(dest, r, g, b, a); | 171 setRGBAPremultiply(dest, r, g, b, a); |
| 158 else | 172 else |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 171 } | 185 } |
| 172 | 186 |
| 173 *dest = SkPackARGB32NoCheck(a, r, g, b); | 187 *dest = SkPackARGB32NoCheck(a, r, g, b); |
| 174 } | 188 } |
| 175 | 189 |
| 176 static inline void setRGBARaw(PixelData* dest, unsigned r, unsigned g, unsig ned b, unsigned a) | 190 static inline void setRGBARaw(PixelData* dest, unsigned r, unsigned g, unsig ned b, unsigned a) |
| 177 { | 191 { |
| 178 *dest = SkPackARGB32NoCheck(a, r, g, b); | 192 *dest = SkPackARGB32NoCheck(a, r, g, b); |
| 179 } | 193 } |
| 180 | 194 |
| 195 static inline void setRGB565(PixelData16* dest, unsigned r, unsigned g, unsi gned b) | |
| 196 { | |
| 197 *dest = SkDitherPack888ToRGB16(r, g, b); | |
|
aleksandar.stojiljkovic
2015/10/19 18:17:09
Dither: Don't know if it makes sense to use ordere
| |
| 198 } | |
| 199 | |
| 181 // Notifies the SkBitmap if any pixels changed and resets the flag. | 200 // Notifies the SkBitmap if any pixels changed and resets the flag. |
| 182 inline void notifyBitmapIfPixelsChanged() | 201 inline void notifyBitmapIfPixelsChanged() |
| 183 { | 202 { |
| 184 if (m_pixelsChanged) | 203 if (m_pixelsChanged) |
| 185 m_bitmap.notifyPixelsChanged(); | 204 m_bitmap.notifyPixelsChanged(); |
| 186 m_pixelsChanged = false; | 205 m_pixelsChanged = false; |
| 187 } | 206 } |
| 188 | 207 |
| 189 private: | 208 private: |
| 190 int width() const | 209 int width() const |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 211 // True if the pixels changed, but the bitmap has not yet been notified. | 230 // True if the pixels changed, but the bitmap has not yet been notified. |
| 212 bool m_pixelsChanged; | 231 bool m_pixelsChanged; |
| 213 | 232 |
| 214 // The frame that must be decoded before this frame can be decoded. | 233 // The frame that must be decoded before this frame can be decoded. |
| 215 // WTF::kNotFound if this frame doesn't require any previous frame. | 234 // WTF::kNotFound if this frame doesn't require any previous frame. |
| 216 // This is used by ImageDecoder::clearCacheExceptFrame(), and will never | 235 // This is used by ImageDecoder::clearCacheExceptFrame(), and will never |
| 217 // be read for image formats that do not have multiple frames. | 236 // be read for image formats that do not have multiple frames. |
| 218 size_t m_requiredPreviousFrameIndex; | 237 size_t m_requiredPreviousFrameIndex; |
| 219 }; | 238 }; |
| 220 | 239 |
| 240 template<> | |
| 241 inline ImageFrame::PixelData* ImageFrame::getAddrT<ImageFrame::PixelData>(int x, int y) | |
| 242 { | |
| 243 return m_bitmap.getAddr32(x, y); | |
| 244 } | |
| 245 | |
| 246 template<> | |
| 247 inline ImageFrame::PixelData16* ImageFrame::getAddrT<ImageFrame::PixelData16>(in t x, int y) | |
| 248 { | |
| 249 return m_bitmap.getAddr16(x, y); | |
| 250 } | |
| 251 | |
| 221 } // namespace blink | 252 } // namespace blink |
| 222 | 253 |
| 223 #endif | 254 #endif |
| OLD | NEW |