gfx/skia/trunk/src/core/SkPaintPriv.cpp

Thu, 15 Jan 2015 21:03:48 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 21:03:48 +0100
branch
TOR_BUG_9701
changeset 11
deefc01c0e14
permissions
-rw-r--r--

Integrate friendly tips from Tor colleagues to make (or not) 4.5 alpha 3;
This includes removal of overloaded (but unused) methods, and addition of
a overlooked call to DataStruct::SetData(nsISupports, uint32_t, bool.)

     1 /*
     2  * Copyright 2013 Google Inc.
     3  *
     4  * Use of this source code is governed by a BSD-style license that can be
     5  * found in the LICENSE file.
     6  */
     8 #include "SkPaintPriv.h"
    10 #include "SkBitmap.h"
    11 #include "SkColorFilter.h"
    12 #include "SkPaint.h"
    13 #include "SkShader.h"
    15 bool isPaintOpaque(const SkPaint* paint,
    16                    const SkBitmap* bmpReplacesShader) {
    17     // TODO: SkXfermode should have a virtual isOpaque method, which would
    18     // make it possible to test modes that do not have a Coeff representation.
    20     if (!paint) {
    21         return bmpReplacesShader ? bmpReplacesShader->isOpaque() : true;
    22     }
    24     SkXfermode::Coeff srcCoeff, dstCoeff;
    25     if (SkXfermode::AsCoeff(paint->getXfermode(), &srcCoeff, &dstCoeff)){
    26         if (SkXfermode::kDA_Coeff == srcCoeff || SkXfermode::kDC_Coeff == srcCoeff ||
    27             SkXfermode::kIDA_Coeff == srcCoeff || SkXfermode::kIDC_Coeff == srcCoeff) {
    28             return false;
    29         }
    30         switch (dstCoeff) {
    31         case SkXfermode::kZero_Coeff:
    32             return true;
    33         case SkXfermode::kISA_Coeff:
    34             if (paint->getAlpha() != 255) {
    35                 break;
    36             }
    37             if (bmpReplacesShader) {
    38                 if (!bmpReplacesShader->isOpaque()) {
    39                     break;
    40                 }
    41             } else if (paint->getShader() && !paint->getShader()->isOpaque()) {
    42                 break;
    43             }
    44             if (paint->getColorFilter() &&
    45                 ((paint->getColorFilter()->getFlags() &
    46                 SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
    47                 break;
    48             }
    49             return true;
    50         case SkXfermode::kSA_Coeff:
    51             if (paint->getAlpha() != 0) {
    52                 break;
    53             }
    54             if (paint->getColorFilter() &&
    55                 ((paint->getColorFilter()->getFlags() &
    56                 SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
    57                 break;
    58             }
    59             return true;
    60         case SkXfermode::kSC_Coeff:
    61             if (paint->getColor() != 0) { // all components must be 0
    62                 break;
    63             }
    64             if (bmpReplacesShader || paint->getShader()) {
    65                 break;
    66             }
    67             if (paint->getColorFilter() && (
    68                 (paint->getColorFilter()->getFlags() &
    69                 SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
    70                 break;
    71             }
    72             return true;
    73         default:
    74             break;
    75         }
    76     }
    77     return false;
    78 }

mercurial