/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrBlendFragmentProcessor_DEFINED
#define GrBlendFragmentProcessor_DEFINED

#include "include/core/SkBlendMode.h"
#include "include/core/SkRefCnt.h"

#include <memory>

class GrFragmentProcessor;

namespace GrBlendFragmentProcessor {

/**
 * Blends src and dst inputs according to the blend mode. If either input is null, fInputColor is
 * used instead.
 * - When `shareBlendLogic` is false, the blend function logic is written directly into the code.
 * - When `shareBlendLogic` is true, most Porter-Duff blends share the same code, and a uniform
 *   is used to pick the blend type. This can reduce our overall shader count.
 */
std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> src,
                                          std::unique_ptr<GrFragmentProcessor> dst,
                                          SkBlendMode mode,
                                          bool shareBlendLogic = true);
/**
 * Blends src and dst inputs according to the blend mode. If either input is null, fInputColor is
 * used instead. Hard-wires a single blend mode into the code (slightly reducing complexity).
 */
template <SkBlendMode mode>
std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> src,
                                          std::unique_ptr<GrFragmentProcessor> dst) {
    return Make(std::move(src), std::move(dst), mode, /*shareBlendLogic=*/false);
}


}  // namespace GrBlendFragmentProcessor

#endif
