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

Side by Side Diff: src/codec/SkGifCodec.cpp

Issue 2436183002: Write transparent pixels more often (SkGifCodec) (Closed)
Patch Set: Rebase Created 4 years, 1 month 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
« no previous file with comments | « no previous file | third_party/gif/SkGifImageReader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 /* 8 /*
9 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 9 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
10 * 10 *
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 if (firstAttempt) { 286 if (firstAttempt) {
287 // rowsDecoded reports how many rows have been initialized, so a layer a bove 287 // rowsDecoded reports how many rows have been initialized, so a layer a bove
288 // can fill the rest. In some cases, we fill the background before decod ing 288 // can fill the rest. In some cases, we fill the background before decod ing
289 // (or it is already filled for us), so we report rowsDecoded to be the full 289 // (or it is already filled for us), so we report rowsDecoded to be the full
290 // height. 290 // height.
291 bool filledBackground = false; 291 bool filledBackground = false;
292 if (frameContext->getRequiredFrame() == kNone) { 292 if (frameContext->getRequiredFrame() == kNone) {
293 // We may need to clear to transparent for one of the following reas ons: 293 // We may need to clear to transparent for one of the following reas ons:
294 // - The frameRect does not cover the full bounds. haveDecodedRow wi ll 294 // - The frameRect does not cover the full bounds. haveDecodedRow wi ll
295 // only draw inside the frameRect, so we need to clear the rest. 295 // only draw inside the frameRect, so we need to clear the rest.
296 // - There is a valid transparent pixel value. (FIXME: I'm assuming
297 // writeTransparentPixels will be false in this case, based on
298 // Chromium's assumption that it would already be zeroed. If we
299 // change that behavior, could we skip Filling here?)
300 // - The frame is interlaced. There is no obvious way to fill 296 // - The frame is interlaced. There is no obvious way to fill
301 // afterwards for an incomplete image. (FIXME: Does the first pass 297 // afterwards for an incomplete image. (FIXME: Does the first pass
302 // cover all rows? If so, we do not have to fill here.) 298 // cover all rows? If so, we do not have to fill here.)
303 // - There is no color table for this frame. In that case will not 299 // - There is no color table for this frame. In that case will not
304 // draw anything, so we need to fill. 300 // draw anything, so we need to fill.
305 if (frameContext->frameRect() != this->getInfo().bounds() 301 if (frameContext->frameRect() != this->getInfo().bounds()
306 || frameContext->transparentPixel() < SK_MAX_COLORS
307 || frameContext->interlaced() || !fCurrColorTableIsReal) { 302 || frameContext->interlaced() || !fCurrColorTableIsReal) {
308 // fill ignores the width (replaces it with the actual, scaled w idth). 303 // fill ignores the width (replaces it with the actual, scaled w idth).
309 // But we need to scale in Y. 304 // But we need to scale in Y.
310 const int scaledHeight = get_scaled_dimension(dstInfo.height(), 305 const int scaledHeight = get_scaled_dimension(dstInfo.height(),
311 fSwizzler->sampleY ()); 306 fSwizzler->sampleY ());
312 auto fillInfo = dstInfo.makeWH(0, scaledHeight); 307 auto fillInfo = dstInfo.makeWH(0, scaledHeight);
313 fSwizzler->fill(fillInfo, fDst, fDstRowBytes, this->getFillValue (dstInfo), 308 fSwizzler->fill(fillInfo, fDst, fDstRowBytes, this->getFillValue (dstInfo),
314 opts.fZeroInitialized); 309 opts.fZeroInitialized);
315 filledBackground = true; 310 filledBackground = true;
316 } 311 }
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 if (!fCurrColorTableIsReal) { 477 if (!fCurrColorTableIsReal) {
483 // No color table, so nothing to draw this frame. 478 // No color table, so nothing to draw this frame.
484 // FIXME: We can abort even earlier - no need to decode this frame. 479 // FIXME: We can abort even earlier - no need to decode this frame.
485 return true; 480 return true;
486 } 481 }
487 482
488 // The swizzler takes care of offsetting into the dst width-wise. 483 // The swizzler takes care of offsetting into the dst width-wise.
489 void* dstLine = SkTAddOffset<void>(fDst, dstRow * fDstRowBytes); 484 void* dstLine = SkTAddOffset<void>(fDst, dstRow * fDstRowBytes);
490 485
491 // We may or may not need to write transparent pixels to the buffer. 486 // We may or may not need to write transparent pixels to the buffer.
492 // If we're compositing against a previous image, it's wrong, and if 487 // If we're compositing against a previous image, it's wrong, but if
493 // we're writing atop a cleared, fully transparent buffer, it's 488 // we're decoding an interlaced gif and displaying it "Haeberli"-style,
494 // unnecessary; but if we're decoding an interlaced gif and 489 // we must write these for passes beyond the first, or the initial passes
495 // displaying it "Haeberli"-style, we must write these for passes 490 // will "show through" the later ones.
496 // beyond the first, or the initial passes will "show through" the
497 // later ones.
498 const auto dstInfo = this->dstInfo(); 491 const auto dstInfo = this->dstInfo();
499 if (writeTransparentPixels || dstInfo.colorType() == kRGB_565_SkColorType) { 492 if (writeTransparentPixels || dstInfo.colorType() == kRGB_565_SkColorType) {
500 fSwizzler->swizzle(dstLine, rowBegin); 493 fSwizzler->swizzle(dstLine, rowBegin);
501 } else { 494 } else {
502 // We cannot swizzle directly into the dst, since that will write the tr ansparent pixels. 495 // We cannot swizzle directly into the dst, since that will write the tr ansparent pixels.
503 // Instead, swizzle into a temporary buffer, and copy that into the dst. 496 // Instead, swizzle into a temporary buffer, and copy that into the dst.
504 { 497 {
505 void* const memsetDst = fTmpBuffer.get(); 498 void* const memsetDst = fTmpBuffer.get();
506 // Although onGetFillValue returns a uint64_t, we only use the low e ight bits. The 499 // Although onGetFillValue returns a uint64_t, we only use the low e ight bits. The
507 // return value is either an 8 bit index (for index8) or SK_ColorTRA NSPARENT, which is 500 // return value is either an 8 bit index (for index8) or SK_ColorTRA NSPARENT, which is
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 void* copiedLine = SkTAddOffset<void>(dstLine, fSwizzler->swizzleOffsetB ytes()); 555 void* copiedLine = SkTAddOffset<void>(dstLine, fSwizzler->swizzleOffsetB ytes());
563 void* dst = copiedLine; 556 void* dst = copiedLine;
564 for (unsigned i = 1; i < repeatCount; i++) { 557 for (unsigned i = 1; i < repeatCount; i++) {
565 dst = SkTAddOffset<void>(dst, fDstRowBytes); 558 dst = SkTAddOffset<void>(dst, fDstRowBytes);
566 memcpy(dst, copiedLine, bytesToCopy); 559 memcpy(dst, copiedLine, bytesToCopy);
567 } 560 }
568 } 561 }
569 562
570 return true; 563 return true;
571 } 564 }
OLDNEW
« no previous file with comments | « no previous file | third_party/gif/SkGifImageReader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698