Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(261)

Side by Side Diff: third_party/WebKit/Source/platform/image-decoders/gif/GIFImageDecoder.cpp

Issue 2516593003: Pull up clearCacheExceptFrame to ImageDecoder. (Closed)
Patch Set: Add todo for changing MockImageDecoder Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 ImageFrame::DisposeOverwriteBgcolor) && 222 ImageFrame::DisposeOverwriteBgcolor) &&
223 !prevBuffer->hasAlpha() && 223 !prevBuffer->hasAlpha() &&
224 buffer.originalFrameRect().contains(prevBuffer->originalFrameRect())) 224 buffer.originalFrameRect().contains(prevBuffer->originalFrameRect()))
225 buffer.setHasAlpha(false); 225 buffer.setHasAlpha(false);
226 } 226 }
227 } 227 }
228 228
229 return true; 229 return true;
230 } 230 }
231 231
232 size_t GIFImageDecoder::clearCacheExceptFrame(size_t clearExceptFrame) {
233 // We expect that after this call, we'll be asked to decode frames after
234 // this one. So we want to avoid clearing frames such that those requests
235 // would force re-decoding from the beginning of the image.
236 //
237 // When |clearExceptFrame| is e.g. DisposeKeep, simply not clearing that
238 // frame is sufficient, as the next frame will be based on it, and in
239 // general future frames can't be based on anything previous.
240 //
241 // However, if this frame is DisposeOverwritePrevious, then subsequent
242 // frames will depend on this frame's required previous frame. In this
243 // case, we need to preserve both this frame and that one.
244 size_t clearExceptFrame2 = kNotFound;
245 if (clearExceptFrame < m_frameBufferCache.size()) {
246 const ImageFrame& frame = m_frameBufferCache[clearExceptFrame];
247 if ((frame.getStatus() != ImageFrame::FrameEmpty) &&
248 (frame.getDisposalMethod() == ImageFrame::DisposeOverwritePrevious)) {
249 clearExceptFrame2 = clearExceptFrame;
250 clearExceptFrame = frame.requiredPreviousFrameIndex();
251 }
252 }
253
254 // Now |clearExceptFrame| indicates the frame that future frames will
255 // depend on. But if decoding is skipping forward past intermediate frames,
256 // this frame may be FrameEmpty. So we need to keep traversing back through
257 // the required previous frames until we find the nearest non-empty
258 // ancestor. Preserving that will minimize the amount of future decoding
259 // needed.
260 while ((clearExceptFrame < m_frameBufferCache.size()) &&
261 (m_frameBufferCache[clearExceptFrame].getStatus() ==
262 ImageFrame::FrameEmpty))
263 clearExceptFrame =
264 m_frameBufferCache[clearExceptFrame].requiredPreviousFrameIndex();
265 return clearCacheExceptTwoFrames(clearExceptFrame, clearExceptFrame2);
266 }
267
268 void GIFImageDecoder::clearFrameBuffer(size_t frameIndex) { 232 void GIFImageDecoder::clearFrameBuffer(size_t frameIndex) {
269 if (m_reader && 233 if (m_reader &&
270 m_frameBufferCache[frameIndex].getStatus() == ImageFrame::FramePartial) { 234 m_frameBufferCache[frameIndex].getStatus() == ImageFrame::FramePartial) {
271 // Reset the state of the partial frame in the reader so that the frame 235 // Reset the state of the partial frame in the reader so that the frame
272 // can be decoded again when requested. 236 // can be decoded again when requested.
273 m_reader->clearDecodeState(frameIndex); 237 m_reader->clearDecodeState(frameIndex);
274 } 238 }
275 ImageDecoder::clearFrameBuffer(frameIndex); 239 ImageDecoder::clearFrameBuffer(frameIndex);
276 } 240 }
277 241
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 m_currentBufferSawAlpha = false; 303 m_currentBufferSawAlpha = false;
340 } 304 }
341 305
342 bool GIFImageDecoder::canReusePreviousFrameBuffer(size_t frameIndex) const { 306 bool GIFImageDecoder::canReusePreviousFrameBuffer(size_t frameIndex) const {
343 DCHECK(frameIndex < m_frameBufferCache.size()); 307 DCHECK(frameIndex < m_frameBufferCache.size());
344 return m_frameBufferCache[frameIndex].getDisposalMethod() != 308 return m_frameBufferCache[frameIndex].getDisposalMethod() !=
345 ImageFrame::DisposeOverwritePrevious; 309 ImageFrame::DisposeOverwritePrevious;
346 } 310 }
347 311
348 } // namespace blink 312 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698