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

#ifndef SkColorSpaceXform_DEFINED
#define SkColorSpaceXform_DEFINED

#include "SkImageInfo.h"

class SkColorSpace;

class SK_API SkColorSpaceXform : SkNoncopyable {
public:

    /**
     *  Create an object to handle color space conversions.
     *
     *  @param srcSpace The encoded color space.
     *  @param dstSpace The destination color space.
     *
     */
    static std::unique_ptr<SkColorSpaceXform> New(SkColorSpace* srcSpace, SkColorSpace* dstSpace);

    enum ColorFormat {
        kRGBA_8888_ColorFormat,
        kBGRA_8888_ColorFormat,

        // Unsigned, big-endian, 16-bit integer
        kRGB_U16_BE_ColorFormat,   // Src only
        kRGBA_U16_BE_ColorFormat,  // Src only

        kRGBA_F16_ColorFormat,
        kRGBA_F32_ColorFormat,

        kBGR_565_ColorFormat,      // Dst only, kOpaque only
    };

    /**
     *  Apply the color conversion to a |src| buffer, storing the output in the |dst| buffer.
     *
     *  F16 and F32 are only supported when the color space is linear. This function will return
     *  false in unsupported cases.
     *
     *  @param dst            Stored in the format described by |dstColorFormat|
     *  @param src            Stored in the format described by |srcColorFormat|
     *  @param len            Number of pixels in the buffers
     *  @param dstColorFormat Describes color format of |dst|
     *  @param srcColorFormat Describes color format of |src|
     *  @param alphaType      Describes alpha properties of the |dst| (and |src|)
     *                        kUnpremul preserves input alpha values
     *                        kPremul   performs a premultiplication and also preserves alpha values
     *                        kOpaque   optimization hint, |dst| alphas set to 1
     *
     */
    virtual bool apply(ColorFormat dstFormat, void* dst, ColorFormat srcFormat, const void* src,
                       int count, SkAlphaType alphaType) const = 0;

    virtual ~SkColorSpaceXform() {}

    enum AlphaOp {
        kPreserve_AlphaOp,      // just transfer src-alpha to dst-alpha
        kPremul_AlphaOp,        // like kPreserve, but multiplies RGB by it
        kSrcIsOpaque_AlphaOp,   // src alphas are all 1, this is a perf hint
    };
    static bool Apply(SkColorSpace* dstCS, ColorFormat dstFormat, void* dst,
                      SkColorSpace* srcCS, ColorFormat srcFormat, const void* src,
                      int count, AlphaOp);

protected:
    SkColorSpaceXform() {}
};

#endif
