content: /*
   * Copyright (C) 2018 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package android.graphics;
  
  import android.annotation.NonNull;
  import android.annotation.Nullable;
  
  public enum BlendMode {
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *  <img src="{@docRoot}reference/android/images/graphics/blendmode_CLEAR.png" />
       *  <figcaption>Destination pixels covered by the source are cleared to 0.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = 0\)</p>
       * <p>\(C_{out} = 0\)</p>
       */
      CLEAR(0),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_SRC.png" />
       *     <figcaption>The source pixels replace the destination pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src}\)</p>
       * <p>\(C_{out} = C_{src}\)</p>
       */
      SRC(1),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_DST.png" />
       *     <figcaption>The source pixels are discarded, leaving the destination intact.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{dst}\)</p>
       * <p>\(C_{out} = C_{dst}\)</p>
       */
      DST(2),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_SRC_OVER.png" />
       *     <figcaption>The source pixels are drawn over the destination pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src} + (1 - \alpha_{src}) * \alpha_{dst}\)</p>
       * <p>\(C_{out} = C_{src} + (1 - \alpha_{src}) * C_{dst}\)</p>
       */
      SRC_OVER(3),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_DST_OVER.png" />
       *     <figcaption>The source pixels are drawn behind the destination pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{dst} + (1 - \alpha_{dst}) * \alpha_{src}\)</p>
       * <p>\(C_{out} = C_{dst} + (1 - \alpha_{dst}) * C_{src}\)</p>
       */
      DST_OVER(4),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_SRC_IN.png" />
       *     <figcaption>Keeps the source pixels that cover the destination pixels,
       *     discards the remaining source and destination pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)</p>
       * <p>\(C_{out} = C_{src} * \alpha_{dst}\)</p>
       */
      SRC_IN(5),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_DST_IN.png" />
       *     <figcaption>Keeps the destination pixels that cover source pixels,
       *     discards the remaining source and destination pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)</p>
       * <p>\(C_{out} = C_{dst} * \alpha_{src}\)</p>
       */
      DST_IN(6),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_SRC_OUT.png" />
       *     <figcaption>Keeps the source pixels that do not cover destination pixels.
       *     Discards source pixels that cover destination pixels. Discards all
       *     destination pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = (1 - \alpha_{dst}) * \alpha_{src}\)</p>
       * <p>\(C_{out} = (1 - \alpha_{dst}) * C_{src}\)</p>
       */
      SRC_OUT(7),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_DST_OUT.png" />
       *     <figcaption>Keeps the destination pixels that are not covered by source pixels.
       *     Discards destination pixels that are covered by source pixels. Discards all
       *     source pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = (1 - \alpha_{src}) * \alpha_{dst}\)</p>
       * <p>\(C_{out} = (1 - \alpha_{src}) * C_{dst}\)</p>
       */
      DST_OUT(8),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_SRC_ATOP.png" />
       *     <figcaption>Discards the source pixels that do not cover destination pixels.
       *     Draws remaining source pixels over destination pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{dst}\)</p>
       * <p>\(C_{out} = \alpha_{dst} * C_{src} + (1 - \alpha_{src}) * C_{dst}\)</p>
       */
      SRC_ATOP(9),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_DST_ATOP.png" />
       *     <figcaption>Discards the destination pixels that are not covered by source pixels.
       *     Draws remaining destination pixels over source pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src}\)</p>
       * <p>\(C_{out} = \alpha_{src} * C_{dst} + (1 - \alpha_{dst}) * C_{src}\)</p>
       */
      DST_ATOP(10),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_XOR.png" />
       *     <figcaption>Discards the source and destination pixels where source pixels
       *     cover destination pixels. Draws remaining source pixels.</figcaption>
       * </p>
       * <p>
       *     \(\alpha_{out} = (1 - \alpha_{dst}) * \alpha_{src} + (1 - \alpha_{src}) * \alpha_{dst}\)
       * </p>
       * <p>\(C_{out} = (1 - \alpha_{dst}) * C_{src} + (1 - \alpha_{src}) * C_{dst}\)</p>
       */
      XOR(11),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_PLUS.png" />
       *     <figcaption>Adds the source pixels to the destination pixels and saturates
       *     the result.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = max(0, min(\alpha_{src} + \alpha_{dst}, 1))\)</p>
       * <p>\(C_{out} = max(0, min(C_{src} + C_{dst}, 1))\)</p>
       */
      PLUS(12),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_MODULATE.png" />
       *     <figcaption>Multiplies the source and destination pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)</p>
       * <p>\(C_{out} = C_{src} * C_{dst}\)</p>
       *
       */
      MODULATE(13),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_SCREEN.png" />
       *     <figcaption>
       *         Adds the source and destination pixels, then subtracts the
       *         source pixels multiplied by the destination.
       *     </figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)</p>
       * <p>\(C_{out} = C_{src} + C_{dst} - C_{src} * C_{dst}\)</p>
       */
      SCREEN(14),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_OVERLAY.png" />
       *     <figcaption>
       *         Multiplies or screens the source and destination depending on the
       *         destination color.
       *     </figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)</p>
       * <p>\(\begin{equation}
       * C_{out} = \begin{cases} 2 * C_{src} * C_{dst} & 2 * C_{dst} \lt \alpha_{dst} \\
       * \alpha_{src} * \alpha_{dst} - 2 (\alpha_{dst} - C_{src}) (\alpha_{src} - C_{dst}) &
       * otherwise \end{cases}
       * \end{equation}\)</p>
       */
      OVERLAY(15),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_DARKEN.png" />
       *     <figcaption>
       *         Retains the smallest component of the source and
       *         destination pixels.
       *     </figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)</p>
       * <p>
       *     \(C_{out} =
       *     (1 - \alpha_{dst}) * C_{src} + (1 - \alpha_{src}) * C_{dst} + min(C_{src}, C_{dst})\)
       * </p>
       */
      DARKEN(16),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_LIGHTEN.png" />
       *     <figcaption>Retains the largest component of the source and
       *     destination pixel.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)</p>
       * <p>
       *     \(C_{out} =
       *      (1 - \alpha_{dst}) * C_{src} + (1 - \alpha_{src}) * C_{dst} + max(C_{src}, C_{dst})\)
       * </p>
       */
      LIGHTEN(17),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_COLOR_DODGE.png" />
       *     <figcaption>Makes destination brighter to reflect source.</figcaption>
       * </p>
       * <p>
       *     \(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)
       * </p>
       * <p>
       *      \begin{equation}
       *      C_{out} =
       *      \begin{cases}
       *          C_{src} * (1 - \alpha_{dst}) & C_{dst} = 0 \\
       *          C_{src} + \alpha_{dst}*(1 - \alpha_{src}) & C_{src} = \alpha_{src} \\
       *          \alpha_{src} * min(\alpha_{dst}, C_{dst} * \alpha_{src}/(\alpha_{src} - C_{src}))
       *              + C_{src} *(1 - \alpha_{dst} + \alpha_{dst}*(1 - \alpha_{src}) & otherwise
       *      \end{cases}
       *      \end{equation}
       * </p>
       */
      COLOR_DODGE(18),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_COLOR_BURN.png" />
       *     <figcaption>Makes destination darker to reflect source.</figcaption>
       * </p>
       * <p>
       *     \(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)
       * </p>
       * <p>
       *     \begin{equation}
       *     C_{out} =
       *     \begin{cases}
       *         C_{dst} + C_{src}*(1 - \alpha_{dst}) & C_{dst} = \alpha_{dst} \\
       *         \alpha_{dst}*(1 - \alpha_{src}) & C_{src} = 0 \\
       *         \alpha_{src}*(\alpha_{dst} - min(\alpha_{dst}, (\alpha_{dst}
       *         - C_{dst})*\alpha_{src}/C_{src}))
       *         + C_{src} * (1 - \alpha_{dst}) + \alpha_{dst}*(1-\alpha_{src}) & otherwise
       *     \end{cases}
       *     \end{equation}
       * </p>
       */
      COLOR_BURN(19),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_HARD_LIGHT.png" />
       *     <figcaption>Makes destination lighter or darker, depending on source.</figcaption>
       * </p>
       * <p>
       *     \(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)
       * </p>
       * <p>
       *     \begin{equation}
       *      C_{out} =
       *      \begin{cases}
       *           2*C_{src}*C_{dst} & C_{src}*(1-\alpha_{dst}) + C_{dst}*(1-\alpha_{src}) + 2*C_{src}
       *              \leq \alpha_{src} \\
       *           \alpha_{src}*\alpha_{dst}- 2*(\alpha_{dst} - C_{dst})*(\alpha_{src} - C_{src})
       *              & otherwise
       *      \end{cases}
       *      \end{equation}
       * </p>
       */
      HARD_LIGHT(20),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_SOFT_LIGHT.png" />
       *     <figcaption>Makes destination lighter or darker, depending on source.</figcaption>
       * </p>
       * <p>
       *     Where
       *       \begin{equation}
       *       m =
       *          \begin{cases}
       *              C_{dst} / \alpha_{dst} & \alpha_{dst} \gt 0 \\
       *              0 & otherwise
       *          \end{cases}
       *       \end{equation}
       * </p>
       * <p>
       *       \begin{equation}
       *       g =
       *          \begin{cases}
       *              (16 * m * m + 4 * m) * (m - 1) + 7 * m & 4 * C_{dst} \leq \alpha_{dst} \\
       *              \sqrt m - m & otherwise
       *          \end{cases}
       *       \end{equation}
       * </p>
       * <p>
       *       \begin{equation}
       *       f =
       *          \begin{cases}
       *              C_{dst} * (\alpha_{src} + (2 * C_{src} - \alpha_{src}) * (1 - m))
       *                  & 2 * C_{src} \leq \alpha_{src} \\
       *              C_{dst} * \alpha_{src} + \alpha_{dst} * (2 * C_{src} - \alpha_{src}) * g
       *                  & otherwise
       *          \end{cases}
       *       \end{equation}
       * </p>
       * <p>
       *       \begin{equation}
       *          \alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}
       *       \end{equation}
       *       \begin{equation}
       *          C_{out} = C_{src} / \alpha_{dst} + C_{dst} / \alpha_{src} + f
       *       \end{equation}
       * </p>
       */
      SOFT_LIGHT(21),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_DIFFERENCE.png" />
       *     <figcaption>Subtracts darker from lighter with higher contrast.</figcaption>
       * </p>
       * <p>
       *     \begin{equation}
       *          \alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}
       *     \end{equation}
       * </p>
       * <p>
       *     \begin{equation}
       *           C_{out} = C_{src} + C_{dst} - 2 * min(C_{src}
       *                       * \alpha_{dst}, C_{dst} * \alpha_{src})
       *     \end{equation}
       * </p>
       */
      DIFFERENCE(22),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_DIFFERENCE.png" />
       *     <figcaption>Subtracts darker from lighter with lower contrast.</figcaption>
       * </p>
       * <p>
       *     \begin{equation}
       *          \alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}
       *     \end{equation}
       * </p>
       * <p>
       *     \begin{equation}
       *          C_{out} = C_{src} + C_{dst} - 2 * C_{src} * C_{dst}
       *     \end{equation}
       * </p>
       */
      EXCLUSION(23),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_MODULATE.png" />
       *     <figcaption>Multiplies the source and destination pixels.</figcaption>
       * </p>
       * <p>\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)</p>
       * <p>\(C_{out} =
       *      C_{src} * (1 - \alpha_{dst}) + C_{dst} * (1 - \alpha_{src}) + (C_{src} * C_{dst})\)
       * </p>
       */
      MULTIPLY(24),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_HUE.png" />
       *     <figcaption>
       *         Replaces hue of destination with hue of source, leaving saturation
       *         and luminosity unchanged.
       *     </figcaption>
       * </p>
       */
      HUE(25),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_SATURATION.png" />
       *     <figcaption>
       *          Replaces saturation of destination saturation hue of source, leaving hue and
       *          luminosity unchanged.
       *     </figcaption>
       * </p>
       */
      SATURATION(26),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_COLOR.png" />
       *     <figcaption>
       *          Replaces hue and saturation of destination with hue and saturation of source,
       *          leaving luminosity unchanged.
       *     </figcaption>
       * </p>
       */
      COLOR(27),
  
      /**
       * {@usesMathJax}
       *
       * <p>
       *     <img src="{@docRoot}reference/android/images/graphics/blendmode_LUMINOSITY.png" />
       *     <figcaption>
       *          Replaces luminosity of destination with luminosity of source, leaving hue and
       *          saturation unchanged.
       *     </figcaption>
       * </p>
       */
      LUMINOSITY(28);
  
      private static final BlendMode[] BLEND_MODES = values();
  
      /**
       * @hide
       */
      public static @Nullable BlendMode fromValue(int value) {
          for (BlendMode mode : BLEND_MODES) {
              if (mode.mXfermode.porterDuffMode == value) {
                  return mode;
              }
          }
          return null;
      }
  
      /**
       * @hide
       */
      public static int toValue(BlendMode mode) {
          return mode.getXfermode().porterDuffMode;
      }
  
      /**
       * @hide
       */
      public static @Nullable PorterDuff.Mode blendModeToPorterDuffMode(@Nullable BlendMode mode) {
          if (mode != null) {
              switch (mode) {
                  case CLEAR:
                      return PorterDuff.Mode.CLEAR;
                  case SRC:
                      return PorterDuff.Mode.SRC;
                  case DST:
                      return PorterDuff.Mode.DST;
                  case SRC_OVER:
                      return PorterDuff.Mode.SRC_OVER;
                  case DST_OVER:
                      return PorterDuff.Mode.DST_OVER;
                  case SRC_IN:
                      return PorterDuff.Mode.SRC_IN;
                  case DST_IN:
                      return PorterDuff.Mode.DST_IN;
                  case SRC_OUT:
                      return PorterDuff.Mode.SRC_OUT;
                  case DST_OUT:
                      return PorterDuff.Mode.DST_OUT;
                  case SRC_ATOP:
                      return PorterDuff.Mode.SRC_ATOP;
                  case DST_ATOP:
                      return PorterDuff.Mode.DST_ATOP;
                  case XOR:
                      return PorterDuff.Mode.XOR;
                  case DARKEN:
                      return PorterDuff.Mode.DARKEN;
                  case LIGHTEN:
                      return PorterDuff.Mode.LIGHTEN;
                  // b/73224934 PorterDuff Multiply maps to Skia Modulate
                  case MODULATE:
                      return PorterDuff.Mode.MULTIPLY;
                  case SCREEN:
                      return PorterDuff.Mode.SCREEN;
                  case PLUS:
                      return PorterDuff.Mode.ADD;
                  case OVERLAY:
                      return PorterDuff.Mode.OVERLAY;
                  default:
                      return null;
              }
          } else {
              return null;
          }
      }
  
      @NonNull
      private final Xfermode mXfermode;
  
      BlendMode(int mode) {
          mXfermode = new Xfermode();
          mXfermode.porterDuffMode = mode;
      }
  
      /**
       * @hide
       */
      @NonNull
      public Xfermode getXfermode() {
          return mXfermode;
      }
  }
  