chromium/services/data_decoder/public/cpp/decode_image.h

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

#ifndef SERVICES_DATA_DECODER_PUBLIC_CPP_DECODE_IMAGE_H_
#define SERVICES_DATA_DECODER_PUBLIC_CPP_DECODE_IMAGE_H_

#include <stdint.h>

#include "base/containers/span.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/data_decoder/public/mojom/data_decoder_service.mojom.h"
#include "services/data_decoder/public/mojom/image_decoder.mojom.h"

namespace gfx {
class Size;
}

namespace data_decoder {

class DataDecoder;

const uint64_t kDefaultMaxSizeInBytes =;

// DecodeImageIsolated and DecodeImage functions communicate their results over
// DecodeImageCallback.  The SkBitmap will be null on failure and non-null on
// success.
DecodeImageCallback;

// Helper function to decode an image via the data_decoder service. For images
// with multiple frames (e.g. ico files), a frame with a size as close as
// possible to |desired_image_frame_size| is chosen (tries to take one in larger
// size if there's no precise match). Passing gfx::Size() as
// |desired_image_frame_size| is also supported and will result in chosing the
// smallest available size.
//
// Upon completion, |callback| is invoked on the calling thread TaskRunner with
// an SkBitmap argument. The SkBitmap will be null on failure and non-null on
// success.
//
// This always uses an isolated instance of the Data Decoder service. To use a
// shared instance, call the signature below which takes a DataDecoder.
void DecodeImageIsolated(base::span<const uint8_t> encoded_bytes,
                         mojom::ImageCodec codec,
                         bool shrink_to_fit,
                         uint64_t max_size_in_bytes,
                         const gfx::Size& desired_image_frame_size,
                         DecodeImageCallback callback);

// Same as above but uses |data_decoder| to potentially share a service instance
// with other operations. |callback| will only be invoked if |data_decoder| is
// still alive by the time the decode operation is complete.
void DecodeImage(DataDecoder* data_decoder,
                 base::span<const uint8_t> encoded_bytes,
                 mojom::ImageCodec codec,
                 bool shrink_to_fit,
                 uint64_t max_size_in_bytes,
                 const gfx::Size& desired_image_frame_size,
                 DecodeImageCallback callback);

// Helper function to decode an animation via the data_decoder service. Any
// image with multiple frames is considered an animation, so long as the frames
// are all the same size.
//
// This always uses an isolated instance of the Data Decoder service. To use a
// shared instance, call the signature below which takes a DataDecoder.
void DecodeAnimationIsolated(
    base::span<const uint8_t> encoded_bytes,
    bool shrink_to_fit,
    uint64_t max_size_in_bytes,
    mojom::ImageDecoder::DecodeAnimationCallback callback);

// Same as above but uses |data_decoder| to potentially share a service instance
// with other operations. |callback| will only be invoked if |data_decoder| is
// still alive by the time the decode operation is complete.
void DecodeAnimation(DataDecoder* data_decoder,
                     base::span<const uint8_t> encoded_bytes,
                     bool shrink_to_fit,
                     uint64_t max_size_in_bytes,
                     mojom::ImageDecoder::DecodeAnimationCallback callback);

}  // namespace data_decoder

#endif  // SERVICES_DATA_DECODER_PUBLIC_CPP_DECODE_IMAGE_H_