blob: 82d93be53e87063a29d356b59e5b765e6588a029 [file] [log] [blame]
// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Module Overview: Starboard Image Decoding Module
//
// API for hardware accelerated image decoding. This module allows for the
// client to feed in raw, encoded data to be decoded directly into an
// SbDecodeTarget. It also provides an interface for the client to query what
// combinations of encoded image formats and SbDecodeTargetFormats are
// supported or not.
//
// All functions in this module are safe to call from any thread at any point
// in time.
//
// #### SbImageIsDecodeSupported and SbImageDecode Example
//
// Let's assume that we're on a Blitter platform.
//
// SbDecodeTargetProvider* provider = GetProviderFromSomewhere();
// void* data = GetCompressedJPEGFromSomewhere();
// int data_size = GetCompressedJPEGSizeFromSomewhere();
// const char* mime_type = "image/jpeg";
// SbDecodeTargetFormat format = kSbDecodeTargetFormat1PlaneRGBA;
//
// if (!SbImageIsDecodeSupported(mime_type, format)) {
// return;
// }
//
// SbDecodeTarget result_target = SbDecodeImage(provider, data, data_size,
// mime_type, format);
// SbBlitterSurface surface =
// SbDecodeTargetGetPlane(target, kSbDecodeTargetPlaneRGBA);
// // Do stuff with surface...
//
#ifndef STARBOARD_IMAGE_H_
#define STARBOARD_IMAGE_H_
#include "starboard/configuration.h"
#include "starboard/decode_target.h"
#include "starboard/export.h"
#include "starboard/types.h"
#if SB_VERSION(3)
#ifdef __cplusplus
extern "C" {
#endif
// Whether the current platform supports hardware accelerated decoding an
// image of mime type |mime_type| into SbDecodeTargetFormat |format|. The
// result of this function must not change over the course of the program,
// which means that the results of this function may be cached indefinitely.
SB_EXPORT bool SbImageIsDecodeSupported(const char* mime_type,
SbDecodeTargetFormat format);
// Attempt to decode encoded |mime_type| image data |data| of size |data_size|
// into an SbDecodeTarget of SbDecodeFormatType |format|, possibly using
// SbDecodeTargetProvider |provider|, if it is non-null. Thus, four following
// scenarios regarding the provider may happen:
//
// 1. The provider is required by the |SbImageDecode| implementation and no
// provider is given. The implementation should gracefully fail by
// immediately returning kSbDecodeTargetInvalid.
// 2. The provider is required and is passed in. The implementation will
// proceed forward, using the SbDecodeTarget from the provider.
// 3. The provider is not required and is passed in. The provider will NOT be
// called, and the implementation will proceed to decoding however it
// desires.
// 4. The provider is not required and is not passed in. The implementation
// will proceed forward.
//
// Thus, it is NOT safe for clients of this API to assume that the |provider|
// it passes in will be called. Finally, if the decode succeeds, a new
// SbDecodeTarget will be allocated. If |mime_type| image decoding for the
// requested format is not supported or the decode fails,
// kSbDecodeTargetInvalid will be returned, with any intermediate allocations
// being cleaned up in the implementation.
SB_EXPORT SbDecodeTarget SbImageDecode(
#if SB_API_VERSION >= 4
SbDecodeTargetGraphicsContextProvider* context_provider,
#else
SbDecodeTargetProvider* provider,
#endif
void* data,
int data_size,
const char* mime_type,
SbDecodeTargetFormat format);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // SB_VERSION(3)
#endif // STARBOARD_IMAGE_H_