// 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.

// Starboard Blitter API.  The Blitter API provides support for issuing simple
// blit-style draw commands to either an offscreen surface or to a Starboard
// SbWindow object.  This API is designed to allow implementations make use
// of GPU hardware acceleration, if it is available.  Draw commands exist for
// solid-color rectangles and rasterization/blitting of rectangular images onto
// rectangular target patches.

// Threading Concerns:
// Note that in general the Blitter API is not thread safe, except for all
// SbBlitterDevice-related functions.  All functions that are not required to
// internally ensure any thread safety guarantees are prefaced with a comment
// indicating that they are not thread safe.
// Functions which claim to not be thread safe can still be used from multiple
// threads, but manual synchronization must be performed in order to ensure
// their parameters are not referenced at the same time on another thread by
// another function.
//   Examples:
//   - Multiple threads should not issue commands to the same SbBlitterContext
//     object unless they are manually synchronized.
//   - Multiple threads should not issue draw calls to the same render target,
//     even if the draw calls are made within separate contexts.  In this case,
//     be sure to manually synchronize through the use of syncrhonization
//     primitives and use of the SbBlitterFlushContext() command.
//   - Multiple threads can operate on the swap chain, but they must perform
//     manual synchronization.

#ifndef STARBOARD_BLITTER_H_
#define STARBOARD_BLITTER_H_

#include "starboard/configuration.h"
#include "starboard/export.h"
#include "starboard/types.h"
#include "starboard/window.h"

#if SB_HAS(BLITTER)

#ifdef __cplusplus
extern "C" {
#endif

// A SbBlitterDevice object represents a process' connection to a blitter
// device, such as a GPU.  It is through this device that all subsequent Blitter
// API functionality can be accessed.
typedef struct SbBlitterDevicePrivate SbBlitterDevicePrivate;
typedef SbBlitterDevicePrivate* SbBlitterDevice;
#define kSbBlitterInvalidDevice ((SbBlitterDevice)NULL)

// A SbBlitterSwapChain represents the (potentially back buffered) output
// display device.  A SbBlitterRenderTarget can be retrieved from a
// SbBlitterSwapChain, providing a target for draw commands.  The
// SbBlitterSwapChain object also exposes the ability to flip back buffers.
typedef struct SbBlitterSwapChainPrivate SbBlitterSwapChainPrivate;
typedef SbBlitterSwapChainPrivate* SbBlitterSwapChain;
#define kSbBlitterInvalidSwapChain ((SbBlitterSwapChain)NULL)

// A SbBlitterRenderTarget may be obtained from either a SbBlitterSwapChain
// if it represents a primary display output, or through a SbBlitterSurface
// if it represents an offscreen rendering target.  A SbBlitterRenderTarget
// must be specified within a SbBlitterContext before making a draw call.
typedef struct SbBlitterRenderTargetPrivate SbBlitterRenderTargetPrivate;
typedef SbBlitterRenderTargetPrivate* SbBlitterRenderTarget;
#define kSbBlitterInvalidRenderTarget ((SbBlitterRenderTarget)NULL)

// A SbBlitterPixelData object represents a buffer of pixels stored in
// CPU-accessible memory.  In order to upload pixel data from the CPU to the
// GPU, clients should first create a SbBlitterPixelData object, fill in
// the pixel data, and then re-submit the filled in SbBlitterPixelData
// object to the Blitter API in order to obtain a SbBlitterSurface object that
// can be referenced by draw calls.
typedef struct SbBlitterPixelDataPrivate SbBlitterPixelDataPrivate;
typedef SbBlitterPixelDataPrivate* SbBlitterPixelData;
#define kSbBlitterInvalidPixelData ((SbBlitterPixelData)NULL)

// A SbBlitterSurface object represents a device-side surface of pixel data that
// can be used as either the source or the target of device draw calls.
// Note that depending on how the surface is created, it may not be able to
// offer the ability to obtain a SbBlitterRenderTarget. SbBlitterSurface objects
// may be populated by data either by the CPU via SbBlitterPixelData objects, or
// via the device by using this SbBlitterSurface's SbBlitterRenderTarget object
// as the target of draw calls.
typedef struct SbBlitterSurfacePrivate SbBlitterSurfacePrivate;
typedef SbBlitterSurfacePrivate* SbBlitterSurface;
#define kSbBlitterInvalidSurface ((SbBlitterSurface)NULL)

// SbBlitterContext objects represent a stateful communications channel with
// a device.  All state changes and draw calls will be made through a specific
// SbBlitterContext object.  Every draw call made on a SbBlitterContext will
// be submitted to the device with the SbBlitterContext's current state applied
// to it.  Draw calls may be submitted to the device as they are made on the
// SbBlitterContext, however they are not guaranteed to be submitted until
// the SbBlitterContext object is flushed.
typedef struct SbBlitterContextPrivate SbBlitterContextPrivate;
typedef SbBlitterContextPrivate* SbBlitterContext;
#define kSbBlitterInvalidContext ((SbBlitterContext)NULL)

// A simple 32-bit color representation that is a parameter to many Blitter
// functions.
typedef uint32_t SbBlitterColor;

// Defines the set of pixel formats that can be used with the Blitter API
// SbBlitterPixelData objects.  Note that not all of these formats are
// guaranteed to be supported by a particular device, so before using these
// formats in pixel data creation commands, it should be checked that they are
// supported first (e.g. via SbBlitterIsPixelFormatSupportedByPixelData()).
// SbBlitterPixelDataFormat specifies specific orderings of the color channels,
// and when doing so, byte-order is used, e.g. "RGBA" implies that a value for
// red is stored in the byte with the lowest memory address.  All pixel values
// are assumed to be in premultiplied alpha format.
typedef enum SbBlitterPixelDataFormat {
  // 32-bit pixels with 8-bits per channel, the alpha component in the byte
  // with the lowest address and blue in the byte with the highest address.
  kSbBlitterPixelDataFormatARGB8,
  // 32-bit pixels with 8-bits per channel, the blue component in the byte
  // with the lowest address and alpha in the byte with the highest address.
  kSbBlitterPixelDataFormatBGRA8,
  // 32-bit pixels with 8-bits per channel, the red component in the byte
  // with the lowest address and alpha in the byte with the highest address.
  kSbBlitterPixelDataFormatRGBA8,
  // 8-bit pixels that contain only a single alpha channel.  When rendered,
  // surfaces in this format will have (R, G, B) values of (255, 255, 255).
  kSbBlitterPixelDataFormatA8,

  // Constant that indicates how many unique pixel formats Starboard supports.
  kSbBlitterNumPixelDataFormats,
  kSbBlitterInvalidPixelDataFormat = kSbBlitterNumPixelDataFormats,
} SbBlitterPixelDataFormat;

// Enumeration that describes the color format of surfaces.  Note that
// SbBlitterSurfaceFormat does not differentiate between permutations of the
// color channel ordering (e.g. RGBA vs ARGB) since client code will never be
// able to access surface pixels directly.  This is the main difference between
// SbBlitterPixelDataFormat, which does explicitly dictate an ordering.
typedef enum SbBlitterSurfaceFormat {
  // 32-bit RGBA color, with 8 bits per channel.
  kSbBlitterSurfaceFormatRGBA8,

  // 8-bit alpha-only color.
  kSbBlitterSurfaceFormatA8,

  // Constant that indicates how many unique surface formats Starboard supports.
  kSbBlitterNumSurfaceFormats,
  kSbBlitterInvalidSurfaceFormat = kSbBlitterNumSurfaceFormats,
} SbBlitterSurfaceFormat;

// Defines a rectangle via a point (x, y) and a size, (width, height).
// This structure is used as a parameter type in various blit calls.
typedef struct SbBlitterRect {
  int x;
  int y;
  int width;
  int height;
} SbBlitterRect;

// SbBlitterSurfaceInfo collects information about surfaces that can be queried
// from them at any time.
typedef struct SbBlitterSurfaceInfo {
  int width;
  int height;
  SbBlitterSurfaceFormat format;
} SbBlitterSurfaceInfo;

// A convenience function to create a SbBlitterColor object from separate
// 8-bit RGBA components.
static SB_C_FORCE_INLINE SbBlitterColor SbBlitterColorFromRGBA(uint8_t r,
                                                               uint8_t g,
                                                               uint8_t b,
                                                               uint8_t a) {
  return (r << 24) | (g << 16) | (b << 8) | a;
}

// The following helper functions can be used to extract specific color
// components from a SbBlitterColor object.
static SB_C_FORCE_INLINE uint8_t SbBlitterRFromColor(SbBlitterColor color) {
  return (color & 0xFF000000) >> 24;
}

static SB_C_FORCE_INLINE uint8_t SbBlitterGFromColor(SbBlitterColor color) {
  return (color & 0x00FF0000) >> 16;
}

static SB_C_FORCE_INLINE uint8_t SbBlitterBFromColor(SbBlitterColor color) {
  return (color & 0x0000FF00) >> 8;
}

static SB_C_FORCE_INLINE uint8_t SbBlitterAFromColor(SbBlitterColor color) {
  return (color & 0x000000FF) >> 0;
}

// A convenience function to return the number of bytes per pixel for a given
// pixel format.
static SB_C_FORCE_INLINE int SbBlitterBytesPerPixelForFormat(
    SbBlitterPixelDataFormat format) {
  switch (format) {
    case kSbBlitterPixelDataFormatARGB8:
      return 4;
    case kSbBlitterPixelDataFormatBGRA8:
      return 4;
    case kSbBlitterPixelDataFormatRGBA8:
      return 4;
    case kSbBlitterPixelDataFormatA8:
      return 1;
    default:
      return 0;
  }
}

// This function maps SbBlitterPixelDataFormat values to their corresponding
// SbBlitterSurfaceFormat value.  Note that many SbBlitterPixelDataFormats
// correspond to the same SbBlitterSurfaceFormat, so this function is not
// invertible.  When creating a SbBlitterSurface object from a
// SbBlitterPixelData object, the SbBlitterSurface's format will be computed
// from the SbBlitterPixelData object by using this function.
static SB_C_FORCE_INLINE SbBlitterSurfaceFormat
SbBlitterPixelDataFormatToSurfaceFormat(SbBlitterPixelDataFormat pixel_format) {
  switch (pixel_format) {
    case kSbBlitterPixelDataFormatARGB8:
      return kSbBlitterSurfaceFormatRGBA8;
    case kSbBlitterPixelDataFormatBGRA8:
      return kSbBlitterSurfaceFormatRGBA8;
    case kSbBlitterPixelDataFormatRGBA8:
      return kSbBlitterSurfaceFormatRGBA8;
    case kSbBlitterPixelDataFormatA8:
      return kSbBlitterSurfaceFormatA8;
    default:
      return kSbBlitterInvalidSurfaceFormat;
  }
}

// Convenience function to setup a rectangle with the specified parameters.
static SB_C_FORCE_INLINE SbBlitterRect SbBlitterMakeRect(int x,
                                                         int y,
                                                         int width,
                                                         int height) {
  SbBlitterRect rect;
  rect.x = x;
  rect.y = y;
  rect.width = width;
  rect.height = height;
  return rect;
}

// Helper functions to check whether or not a blitter object is invalid.
static SB_C_FORCE_INLINE bool SbBlitterIsDeviceValid(SbBlitterDevice device) {
  return device != kSbBlitterInvalidDevice;
}

static SB_C_FORCE_INLINE bool SbBlitterIsSwapChainValid(
    SbBlitterSwapChain swap_chain) {
  return swap_chain != kSbBlitterInvalidSwapChain;
}

static SB_C_FORCE_INLINE bool SbBlitterIsRenderTargetValid(
    SbBlitterRenderTarget render_target) {
  return render_target != kSbBlitterInvalidRenderTarget;
}

static SB_C_FORCE_INLINE bool SbBlitterIsPixelDataValid(
    SbBlitterPixelData pixel_data) {
  return pixel_data != kSbBlitterInvalidPixelData;
}

static SB_C_FORCE_INLINE bool SbBlitterIsSurfaceValid(
    SbBlitterSurface surface) {
  return surface != kSbBlitterInvalidSurface;
}

static SB_C_FORCE_INLINE bool SbBlitterIsContextValid(
    SbBlitterContext context) {
  return context != kSbBlitterInvalidContext;
}

// Creates and returns a SbBlitterDevice object based on the Blitter API
// implementation's decision of which device should be default.  The
// SbBlitterDevice object represents a connection to a device (like a GPU).  On
// many platforms there is always one single obvious choice for a device to use,
// and that is the one that this function will return.  For example, if this is
// called on a platform that has a single GPU, a device representing that GPU
// should be returned by this call.  On a platform that has no GPU, a device
// representing a software CPU implementation may be returned.  Only one
// default device can exist within a process at a time.
// This function is thread safe.
// Returns kSbBlitterInvalidDevice on failure.
SB_EXPORT SbBlitterDevice SbBlitterCreateDefaultDevice();

// Destroys |device|, cleaning up all resources associated with it.
// Returns whether the destruction succeeded.
// This function is thread safe, though of course it should not be called if
// |device| is still being accessed elsewhere.
SB_EXPORT bool SbBlitterDestroyDevice(SbBlitterDevice device);

// Creates and returns a SbBlitterSwapChain object that can be used to send
// graphics to the display.  By calling this function, |device| will be linked
// to |window|'s output and drawing to the returned swap chain will result in
// |device| being used to render to |window|.  kSbBlitterInvalidSwapChain is
// returned on failure.
// This function must be called from the thread that called SbWindowCreate()
// to create |window|.
SB_EXPORT SbBlitterSwapChain
SbBlitterCreateSwapChainFromWindow(SbBlitterDevice device, SbWindow window);

// Destroys |swap_chain|, cleaning up all resources associated with it.
// This function must be called on the same thread that called
// SbBlitterCreateSwapChainFromWindow().
// This function is not thread safe.
// Returns the destruction succeeded.
SB_EXPORT bool SbBlitterDestroySwapChain(SbBlitterSwapChain swap_chain);

// Returns the |SbBlitterRenderTarget| object that is owned by |swap_chain|.
// The returned object can be used to provide a target to blitter draw calls
// wishing to draw directly to the display buffer.
// This function is not thread safe.
// kSbBlitterInvalidRenderTarget is returned on failure.
SB_EXPORT SbBlitterRenderTarget
SbBlitterGetRenderTargetFromSwapChain(SbBlitterSwapChain swap_chain);

// Returns whether |device| supports calls to SbBlitterCreatePixelData()
// with |pixel_format|.
// This function is thread safe.
SB_EXPORT bool SbBlitterIsPixelFormatSupportedByPixelData(
    SbBlitterDevice device,
    SbBlitterPixelDataFormat pixel_format);

// Allocates a SbBlitterPixelData object through |device| with |width|, |height|
// and |pixel_format|.  |pixel_format| must be supported by |device| (see
// SbBlitterIsPixelFormatSupportedByPixelData()).  Calling this function will
// result in the allocation of CPU-accessible (though perhaps
// blitter-device-resident) memory to store pixel data of the requested
// size/format. A SbBlitterPixelData object should either eventually be passed
// into a call to SbBlitterCreateSurfaceFromPixelData(), or passed into a call
// to SbBlitterDestroyPixelData().
// This function is thread safe.
// Returns kSbBlitterInvalidPixelData upon failure.
SB_EXPORT SbBlitterPixelData
SbBlitterCreatePixelData(SbBlitterDevice device,
                         int width,
                         int height,
                         SbBlitterPixelDataFormat pixel_format);

// Destroys the |pixel_data| object.  Note that
// if SbBlitterCreateSurfaceFromPixelData() has been called on |pixel_data|
// before, this function does not need to be and should not be called.
// This function is thread safe.
// Returns whether the destruction succeeded.
SB_EXPORT bool SbBlitterDestroyPixelData(SbBlitterPixelData pixel_data);

// Getter method to return the pitch (in bytes) for |pixel_data|.  This
// indicates the number of bytes per row of pixel data in the image.  -1 is
// returned in case of an error.
// This function is not thread safe.
SB_EXPORT int SbBlitterGetPixelDataPitchInBytes(SbBlitterPixelData pixel_data);

// Getter method to return a CPU-accessible pointer to the pixel data
// represented by |pixel_data|.  This pixel data can be modified by the CPU
// in order to initialize it on the CPU before calling
// SbBlitterCreateSurfaceFromPixelData().  Note that the pointe returned here
// is valid as long as |pixel_data| is valid, i.e. until either
// SbBlitterCreateSurfaceFromPixelData() or SbBlitterDestroyPixelData() is
// called.
// This function is not thread safe.
// If there is an error, NULL is returned.
SB_EXPORT void* SbBlitterGetPixelDataPointer(SbBlitterPixelData pixel_data);

// Creates a SbBlitterSurface object on |device| (which must match the device
// used to create the input SbBlitterPixelData object, |pixel_format|).
// This function will destroy the input |pixel_data| object and so
// |pixel_data| should not be accessed again after this function is called.
// The returned surface cannot be used as a render target (e.g. calling
// SbBlitterGetRenderTargetFromSurface() on it will return
// SbBlitterInvalidRenderTarget).
// This function is thread safe with respect to |device|, however
// |pixel_data| should not be modified on another thread while this function
// is called.
// kSbBlitterInvalidSurface is returned if there was an error.
SB_EXPORT SbBlitterSurface
SbBlitterCreateSurfaceFromPixelData(SbBlitterDevice device,
                                    SbBlitterPixelData pixel_data);

// Returns whether the |device| supports calls to
// SbBlitterCreateRenderTargetSurface() with |pixel_format|.
// This function is thread safe.
SB_EXPORT bool SbBlitterIsSurfaceFormatSupportedByRenderTargetSurface(
    SbBlitterDevice device,
    SbBlitterSurfaceFormat surface_format);

// Creates a new surface with undefined pixel data on |device| with the
// specified |width|, |height| and |pixel_format|.  One can set the pixel data
// on the resulting surface by getting its associated SbBlitterRenderTarget
// object by calling SbBlitterGetRenderTargetFromSurface().
// This function is thread safe.
// Returns kSbBlitterInvalidSurface upon failure.
SB_EXPORT SbBlitterSurface
SbBlitterCreateRenderTargetSurface(SbBlitterDevice device,
                                   int width,
                                   int height,
                                   SbBlitterSurfaceFormat surface_format);

// Destroys |surface|, cleaning up all resources associated with it.
// This function is not thread safe.
// Returns whether the destruction succeeded.
SB_EXPORT bool SbBlitterDestroySurface(SbBlitterSurface surface);

// Returns the SbBlitterRenderTarget object owned by |surface|.  The returned
// object can be used as a target for draw calls.
// This function is not thread safe.
// Returns kSbBlitterInvalidRenderTarget if |surface| is not able to provide a
// render target, or on any other error.
SB_EXPORT SbBlitterRenderTarget
SbBlitterGetRenderTargetFromSurface(SbBlitterSurface surface);

// Returns a SbBlitterSurfaceInfo structure describing immutable parameters of
// |surface|, such as width, height and pixel format.  The results will be
// set on the output parameter |surface_info| which cannot be NULL.
// This function is not thread safe.
// Returns whether the information was retrieved successfully.
SB_EXPORT bool SbBlitterGetSurfaceInfo(SbBlitterSurface surface,
                                       SbBlitterSurfaceInfo* surface_info);

// Returns whether the combination of parameters (|surface|, |pixel_format|) are
// valid for calls to SbBlitterDownloadSurfacePixels().
// This function is not thread safe.
SB_EXPORT bool SbBlitterIsPixelFormatSupportedByDownloadSurfacePixels(
    SbBlitterSurface surface,
    SbBlitterPixelDataFormat pixel_format);

// Downloads |surface| pixel data into CPU memory pointed to by
// |out_pixel_data|, formatted according to the requested |pixel_format| and
// the requested |pitch_in_bytes|.  Thus, |out_pixel_data| must point to a
// region of memory with a size of surface_height * |pitch_in_bytes| *
// SbBlitterBytesPerPixelForFormat(pixel_format) bytes.  The function
// SbBlitterIsPixelFormatSupportedByDownloadSurfacePixels() can be called first
// to check that your requested |pixel_format| is valid for |surface|.  When
// this function is called, it will first wait for all previously flushed
// graphics commands to be executed by the device before downloading the data.
// Since this function waits for the pipeline to empty, it should be used
// sparingly, such as within in debug or test environments.  The returned
// alpha format will be premultiplied.
// This function is not thread safe.
// Returns whether the pixel data was downloaded successfully or not.
SB_EXPORT bool SbBlitterDownloadSurfacePixels(
    SbBlitterSurface surface,
    SbBlitterPixelDataFormat pixel_format,
    int pitch_in_bytes,
    void* out_pixel_data);

// Flips |swap_chain|, making the buffer that was previously accessible to
// draw commands via SbBlitterGetRenderTargetFromSwapChain() now visible on the
// display, while another buffer in an initially undefined state is setup as the
// draw command target.  Note that you do not need to call
// SbBlitterGetRenderTargetFromSwapChain() again after flipping, the swap
// chain's render target will always refer to its current back buffer.  This
// function will stall the calling thread until the next vertical refresh.
// Note that to ensure consistency with the Starboard Player API when rendering
// punch-out video, calls to SbPlayerSetBounds() will not take effect until
// this method is called.
// This function is not thread safe.
// Returns whether the flip succeeded.
SB_EXPORT bool SbBlitterFlipSwapChain(SbBlitterSwapChain swap_chain);

// Returns the maximum number of contexts that |device| can support in parallel.
// In many cases, devices support only a single context.  If
// SbBlitterCreateContext() has been used to create the maximum number of
// contexts, all subsequent calls to SbBlitterCreateContext() will fail.
// This function is thread safe.
// This function returns -1 upon failure.
SB_EXPORT int SbBlitterGetMaxContexts(SbBlitterDevice device);

// Creates a SbBlitterContext object on the specified |device|.  The returned
// context can be used to setup draw state and issue draw calls.  Note that
// there is a limit on the number of contexts that can exist at the same time
// (in many cases this is 1), and this can be queried by calling
// SbBlitterGetMaxContexts().  SbBlitterContext objects keep track of draw
// state between a series of draw calls.  Please refer to the documentation
// around the definition of SbBlitterContext for more information about
// contexts.
// This function is thread safe.
// This function returns kSbBlitterInvalidContext upon failure.
SB_EXPORT SbBlitterContext SbBlitterCreateContext(SbBlitterDevice device);

// Destroys the specified |context| created by |device|, freeing all its
// resources.
// This function is not thread safe.
// Returns whether the destruction succeeded.
SB_EXPORT bool SbBlitterDestroyContext(SbBlitterContext context);

// Flushes all draw calls previously issued to |context|.  After this call,
// all subsequent draw calls (on any context) are guaranteed to be processed
// by the device after all previous draw calls issued on this |context|.
// In many cases you will want to call this before calling
// SbBlitterFlipSwapChain(), to ensure that all draw calls are submitted before
// the flip occurs.
// This function is not thread safe.
// Returns whether the flush succeeded.
SB_EXPORT bool SbBlitterFlushContext(SbBlitterContext context);

// Sets up |render_target| as the render target that all subsequent draw calls
// made on |context| will draw to.
// This function is not thread safe.
// Returns whether the render target was successfully set.
SB_EXPORT bool SbBlitterSetRenderTarget(SbBlitterContext context,
                                        SbBlitterRenderTarget render_target);

// Sets blending state on the specified |context|.  If |blending| is true, the
// source alpha of subsequent draw calls will be used to blend with the
// destination color.  In particular, Fc = Sc * Sa + Dc * (1 - Sa), where
// Fc is the final color, Sc is the source color, Sa is the source alpha, and
// Dc is the destination color.  If |blending| is false, the source color and
// alpha will overwrite the destination color and alpha.  By default blending
// is disabled on a SbBlitterContext.
// This function is not thread safe.
// Returns whether the blending state was succcessfully set.
SB_EXPORT bool SbBlitterSetBlending(SbBlitterContext context, bool blending);

// Sets the context's current color.  The current color's default value is
// SbBlitterColorFromRGBA(255, 255, 255 255).  The current color affects the
// fill rectangle's color in calls to SbBlitterFillRect(), and if
// SbBlitterSetModulateBlitsWithColor() has been called to enable blit color
// modulation, the source blit surface pixel color will also be modulated by
// the color before being output.  The color is specified in unpremultiplied
// alpha format.
// This function is not thread safe.
// Returns whether the color was successfully set.
SB_EXPORT bool SbBlitterSetColor(SbBlitterContext context,
                                 SbBlitterColor color);

// Sets whether or not blit calls should have their source pixels modulated by
// the current color (set via a call to SbBlitterSetColor()) before being
// output.  This can be used to apply opacity to blit calls, as well as for
// coloring alpha-only surfaces, and other effects.
// This function is not thread safe.
// Returns whether the state was successfully set.
SB_EXPORT bool SbBlitterSetModulateBlitsWithColor(
    SbBlitterContext context,
    bool modulate_blits_with_color);

// Sets the scissor rectangle.  The scissor rectangle dictates a rectangle of
// visibility that affects all draw calls.  Only pixels within the scissor
// rectangle will be rendered, all drawing outside of the scissor rectangle will
// be clipped.  When SbBlitterSetRenderTarget() is called, the scissor rectangle
// is automatically set to the extents of the specified render target.  If a
// scissor rectangle is specified outside of the extents of the current render
// target bounds, it will be intersected with the render target boudns.  It is
// an error to call this function before a render target has been specified for
// the context.
// This function is not thread safe.
// Returns whether the scissor was successfully set.
SB_EXPORT bool SbBlitterSetScissor(SbBlitterContext context,
                                   SbBlitterRect rect);

// Issues a draw call on |context| that fills a rectangle |rect|.  The color
// of the rectangle is specified by the last call to SbBlitterSetColor().
// This function is not thread safe.
// Returns whether the draw call succeeded.
SB_EXPORT bool SbBlitterFillRect(SbBlitterContext context, SbBlitterRect rect);

// Issues a draw call on |context| that blits an area of |source_surface|
// specified by a |src_rect| to |context|'s current render target at |dst_rect|.
// The source rectangle must lie within the dimensions of |source_surface|.  The
// |source_surface|'s alpha will be modulated by |opacity| before being drawn.
// For |opacity|, a value of 0 implies complete invisibility and a value of
// 255 implies complete opaqueness.
// This function is not thread safe.
// Returns whether the draw call succeeded.
SB_EXPORT bool SbBlitterBlitRectToRect(SbBlitterContext context,
                                       SbBlitterSurface source_surface,
                                       SbBlitterRect src_rect,
                                       SbBlitterRect dst_rect);

// This function does the exact same as SbBlitterBlitRectToRect(), except
// it permits values of |src_rect| outside of the dimensions of
// |source_surface| and in these regions the pixel data from |source_surface|
// will be wrapped.  Negative values for |src_rect.x| and |src_rect.y| are
// allowed.  The output will all be stretched to fit inside of |dst_rect|.
// This function is not thread safe.
// Returns whether the draw call succeeded.
SB_EXPORT bool SbBlitterBlitRectToRectTiled(SbBlitterContext context,
                                            SbBlitterSurface source_surface,
                                            SbBlitterRect src_rect,
                                            SbBlitterRect dst_rect);

// This function achieves the same effect as calling SbBlitterBlitRectToRect()
// |num_rects| time with each of the |num_rects| values of |src_rects| and
// |dst_rects|.  Using this function allows for greater efficiency than calling
// SbBlitterBlitRectToRect() in a loop.
// This function is not thread safe.
// Returns whether the draw call succeeded.
SB_EXPORT bool SbBlitterBlitRectsToRects(SbBlitterContext context,
                                         SbBlitterSurface source_surface,
                                         const SbBlitterRect* src_rects,
                                         const SbBlitterRect* dst_rects,
                                         int num_rects);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // SB_HAS(BLITTER)

#endif  // STARBOARD_BLITTER_H_
