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

#ifndef SkImageEncoder_DEFINED
#define SkImageEncoder_DEFINED

#include "include/core/SkBitmap.h"
#include "include/core/SkData.h"
#include "include/core/SkEncodedImageFormat.h"
#include "include/core/SkStream.h"

/**
 * Encode SkPixmap in the given binary image format.
 *
 * @param  dst     results are written to this stream.
 * @param  src     source pixels.
 * @param  format  image format, not all formats are supported.
 * @param  quality range from 0-100, this is supported by jpeg and webp.
 *                 higher values correspond to improved visual quality, but less compression.
 *
 * @return false iff input is bad or format is unsupported.
 *
 * Will always return false if Skia is compiled without image
 * encoders.
 *
 * For SkEncodedImageFormat::kWEBP, if quality is 100, it will use lossless compression. Otherwise
 * it will use lossy.
 *
 * For examples of encoding an image to a file or to a block of memory,
 * see tools/ToolUtils.h.
 */
SK_API bool SkEncodeImage(SkWStream* dst, const SkPixmap& src,
                          SkEncodedImageFormat format, int quality);

/**
 * The following helper function wraps SkEncodeImage().
 */
inline bool SkEncodeImage(SkWStream* dst, const SkBitmap& src, SkEncodedImageFormat f, int q) {
    SkPixmap pixmap;
    return src.peekPixels(&pixmap) && SkEncodeImage(dst, pixmap, f, q);
}

/**
 * Encode SkPixmap in the given binary image format.
 *
 * @param  src     source pixels.
 * @param  format  image format, not all formats are supported.
 * @param  quality range from 0-100, this is supported by jpeg and webp.
 *                 higher values correspond to improved visual quality, but less compression.
 *
 * @return encoded data or nullptr if input is bad or format is unsupported.
 *
 * Will always return nullptr if Skia is compiled without image
 * encoders.
 *
 * For SkEncodedImageFormat::kWEBP, if quality is 100, it will use lossless compression. Otherwise
 * it will use lossy.
 */
SK_API sk_sp<SkData> SkEncodePixmap(const SkPixmap& src, SkEncodedImageFormat format, int quality);

/**
 *  Helper that extracts the pixmap from the bitmap, and then calls SkEncodePixmap()
 */
SK_API sk_sp<SkData> SkEncodeBitmap(const SkBitmap& src, SkEncodedImageFormat format, int quality);

#endif  // SkImageEncoder_DEFINED
