text: /*
   * Copyright 2017 Google Inc.
   *
   * Use of this source code is governed by a BSD-style license that can be
   * found in the LICENSE file.
   */
  #ifndef SkAutoBlitterChoose_DEFINED
  #  define SkAutoBlitterChoose_DEFINED
  #  include "include/private/SkMacros.h"
  #  include "src/core/SkArenaAlloc.h"
  #  include "src/core/SkBlitter.h"
  #  include "src/core/SkDraw.h"
  class SkMatrix;
  class SkPaint;
  class SkPixmap;
  class SkAutoBlitterChoose :  SkNoncopyable
  {
  public:
    SkAutoBlitterChoose()
    {
    }
    SkAutoBlitterChoose(const SkDraw& draw, const SkMatrix* matrix, const SkPaint& paint, bool drawCoverage = false)
    {
      this->choose(draw, matrix, paint, drawCoverage);
    }
    SkBlitter* operator->()
    {
      return fBlitter;
    }
    SkBlitter* get() const
    {
      return fBlitter;
    }
    SkBlitter* choose(const SkDraw& draw, const SkMatrix* matrix, const SkPaint& paint, bool drawCoverage = false)
    {
      SkASSERT(!fBlitter);
      if (!matrix)
      {
        matrix = draw.fMatrix;
      }
      fBlitter = SkBlitter::Choose(draw.fDst, *matrix, paint, &fAlloc, drawCoverage);
      if (draw.fCoverage)
      {
              // hmm, why can't choose ignore the paint if drawCoverage is true?
        SkBlitter* coverageBlitter = SkBlitter::Choose(*draw.fCoverage, *matrix, SkPaint(), &fAlloc, true);
        fBlitter = fAlloc.make<SkPairBlitter>(fBlitter, coverageBlitter);
      }
      return fBlitter;
    }
  private:
      // Owned by fAlloc, which will handle the delete.
    SkBlitter* fBlitter = nullptr;
    SkSTArenaAlloc<kSkBlitterContextSize> fAlloc;
  };
  #  define SkAutoBlitterChoose(...) SK_REQUIRE_LOCAL_VAR(SkAutoBlitterChoose)
  #endif
  