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

Unified Diff: third_party/WebKit/Source/platform/image-decoders/ImageFrame.h

Issue 2386453003: WIP: Implement APNG (Closed)
Patch Set: Revisit ImageFrame alpha setting. 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/image-decoders/ImageFrame.h
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageFrame.h b/third_party/WebKit/Source/platform/image-decoders/ImageFrame.h
index 9c5615bfd8ad515126a9c1561ad7764344606de5..b94cd42566073d076472e9854219491a91b9d129 100644
--- a/third_party/WebKit/Source/platform/image-decoders/ImageFrame.h
+++ b/third_party/WebKit/Source/platform/image-decoders/ImageFrame.h
@@ -218,6 +218,47 @@ class PLATFORM_EXPORT ImageFrame final {
*dest = SkPackARGB32NoCheck(a, r, g, b);
}
+ // Blend the RGBA pixel provided by |r|, |g|, |b|, |a| over the pixel in
+ // |dest|, without premultiplication, and overwrite |dest| with the result.
+ static void blendRGBARaw(PixelData* dest,
+ unsigned r,
+ unsigned g,
+ unsigned b,
+ unsigned a);
+
+ // Blend the pixel, without premultiplication, in |src| over |dst| and
+ // overwrite |src| with the result.
+ static void blendSrcOverDstRaw(PixelData* src, PixelData dst);
+
+ // Blend the RGBA pixel provided by |r|, |g|, |b|, |a| over the pixel in
+ // |dest| and overwrite |dest| with the result. Premultiply the pixel values
+ // before blending.
+ static inline void blendRGBAPremultiply(PixelData* dest,
+ unsigned r,
+ unsigned g,
+ unsigned b,
+ unsigned a) {
+ // If the new pixel is completely transparent, no operation is necessary
+ // since |dest| contains the background pixel.
+ if (a == 0x0)
+ return;
+
+ // If the new pixel is opaque, no need for blending - just write the pixel.
+ if (a == 0xFF)
+ return setRGBAPremultiply(dest, r, g, b, a);
+
+ PixelData src;
+ setRGBAPremultiply(&src, r, g, b, a);
+ *dest = SkPMSrcOver(src, *dest);
+ }
+
+ // Blend the pixel in |src| over |dst| and overwrite |src| with the result.
+ // This assumes the pixel values in |src| are already premultiplied.
+ static inline void blendSrcOverDstPremultiplied(PixelData* src,
+ PixelData dst) {
+ *src = SkPMSrcOver(*src, dst);
+ }
+
// Notifies the SkBitmap if any pixels changed and resets the flag.
inline void notifyBitmapIfPixelsChanged() {
if (m_pixelsChanged)

Powered by Google App Engine
This is Rietveld 408576698