graphicscomposition/openwfcompositionengine/common/include/owfattributes.h
author Matt Plumtree <matt.plumtree@nokia.com>
Fri, 23 Apr 2010 17:57:02 +0100
branchNewGraphicsArchitecture
changeset 39 a4b63488e0b0
parent 0 5d03bc08d59c
child 36 01a6848ebfd7
child 163 bbf46f59e123
permissions -rw-r--r--
Revise some of the compositor performance improvements to improve correctness. Implement pixel blending using a variation of Jim Blinn's no-division blending algorithm. Move transparency type simplification further up the composition code. Remove some unnecessary fields. Output to YUV implementation needs revision as it is actually converting from YUV (copy of source conversion code).

/* Copyright (c) 2009 The Khronos Group Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and/or associated documentation files (the
 * "Materials"), to deal in the Materials without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Materials, and to
 * permit persons to whom the Materials are furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Materials.
 *
 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 */

#ifndef OWFATTRIBUTES_H_
#define OWFATTRIBUTES_H_

#include "owftypes.h"
#include "owfutils.h"


#ifdef __cplusplus
extern "C"
{
#endif


/*!
 *  \file Attribute interface
 *
 *  Attribute interface provides mechanism for controlled reading/writing
 *  access of different object properties in WFC and WFD APIs by proxying
 *  object instances' properties.
 *
 */
#define RANGE_UNDEFINED     0xFFFFFFFF
#define ATTR_LENGTH_BITS    20
#define MAX_ATTR_LENGTH     (1 << ATTR_LENGTH_BITS)-1
#define NUM_ATTR_VALUE_COPIES 3
#define COMMITTED_ATTR_VALUE_INDEX 0
#define WORKING_ATTR_VALUE_INDEX 1
#define SNAPSHOT_ATTR_VALUE_INDEX 2

typedef enum {
    ATTR_ERROR_NONE             = 0,
    ATTR_ERROR_NOT_FOUND        = -1,
    ATTR_ERROR_ALREADY_IN_USE   = -2,
    ATTR_ERROR_INVALID_ATTRIBUTE= -3,
    ATTR_ERROR_INVALID_VALUE    = -4,
    ATTR_ERROR_INVALID_ARGUMENT = -5,
    ATTR_ERROR_INVALID_CONTEXT  = -6,
    ATTR_ERROR_NO_MEMORY        = -7,
    ATTR_ERROR_INSANE           = -8,
    ATTR_ERROR_ACCESS_DENIED    = -9,
    ATTR_ERROR_INVALID_TYPE     = -10,
    ATTR_ERROR_CANT_HANDLE      = -11
} OWF_ATTRIBUTE_LIST_STATUS;

/* Attribute value element types */
typedef enum {
    AT_UNDEFINED = 0,
    AT_INTEGER = 1,
    AT_FLOAT = 2,
    AT_BOOLEAN = 3
} OWF_ATTRIBUTE_TYPE;


/*
 * Attribute information (header)
 *
 * Dirty field is internal. Do not fiddle with it.
 * 
 * Comment on use of bitfields: 
 * 1: It stops generic use of split dirty flag
 * 2: Some compilers will not reorder members to merge length into earier fields.
 */
typedef struct {
    OWFuint                 type: 2;
    OWFuint                 dirty: 1;
    OWFuint                 dirtysnapshot: 1;
    OWFuint                 readonly: 1;
    OWFuint                 size;                       //Size of one primitive
    OWFuint                 length: ATTR_LENGTH_BITS;   //Number of primitives in vector
} OWF_ATTRIBUTE_INFO;

/*
 * Attribute may be a scalar (1-element) or vector (n-element),
 * containing a reference to either integer, boolean or float value(s).
 * Attribute type cannot be changed after it has been initialized.
 *
 * Attributes don't own the data they refer to; attributes only
 * control the reading and writing of the data they refer to.
 */

typedef OWFfloat*           OWF_FLOAT_REF;
typedef OWFint*             OWF_INT_REF;
typedef OWFboolean*         OWF_BOOL_REF;
typedef OWFfloat*           OWF_FLOAT_VECTOR_REF;
typedef OWFint*             OWF_INT_VECTOR_REF;

typedef struct {
    OWF_ATTRIBUTE_INFO      attr_info;
    union {
        OWF_INT_REF             int_value;
        OWF_FLOAT_REF           float_value;
        void*                   gen_ptr;
        /*
        OWF_INT_VECTOR_REF      int_vector_value;
        OWF_FLOAT_VECTOR_REF    float_vector_value;
        */
    } attr_value[NUM_ATTR_VALUE_COPIES];
} OWF_ATTRIBUTE;

/*
 * Attribute list/context. Container for attributes.
 *
 * One list/context can contain constant number of
 * attributes (amount of which is defined at construction
 * time)
 */
typedef struct {
    OWFint                  range_start;
    OWFint                  range_end;
    OWF_ATTRIBUTE*          attributes;
    OWF_ATTRIBUTE_LIST_STATUS  last_error;
} OWF_ATTRIBUTE_LIST;

/*
 * \brief Initializes attribute context
 *
 * \param aContext Attribute context to initialize
 * \param aStart Attribute range start
 * \param aEnd Attribute range end. Must be greater than range start.
 *
 * \return ERR_INVALID_ARGUMENT
 * ERR_NO_MEMORY
 */
OWF_API_CALL void
OWF_AttributeList_Create(OWF_ATTRIBUTE_LIST* aContext,
                         OWFint aStart,
                         OWFint aEnd);

/*
 * \brief Destroy attribute context and free any resources (memory
 * blocks) allocated to it. All attributes are destroyed.
 *
 * \param aContext Attribute context to destroy
 *
 * \return ERR_INVALID_ARGUMENT
 * ERR_INVALID_CONTEXT
 */
OWF_API_CALL void
OWF_AttributeList_Destroy(OWF_ATTRIBUTE_LIST* aContext);

/*
 * \brief Gets the last error from the attribute.
 * Resets the error state.
 *
 * \return	Error code.
 *
 */
OWF_API_CALL OWF_ATTRIBUTE_LIST_STATUS
OWF_AttributeList_GetError(OWF_ATTRIBUTE_LIST* aContext);

/*
 * \brief Intialize integer attribute
 *
 * \param aContext Attibute context
 * \param aName Attribute name
 * \param aValue Attribute initial value
 * \param aRdOnly Read-only flag
 *
 * \return ERR_INVALID_ARGUMENT
 * ERR_INVALID_ATTRIBUTE
 * ERR_INVALID_CONTEXT
 */
OWF_API_CALL void
OWF_Attribute_Initi(OWF_ATTRIBUTE_LIST* aContext,
                    OWFint aName,
                    OWF_INT_REF aValue,
                    OWFboolean aRdOnly);

/*
 * \brief Initialize float attribute
 *
 * \param aContext Attribute context
 * \param aName Attribute name
 * \param aValue Initial value for attribute
 * \param aRdOnly Read-only flag
 *
 * \return ERR_INVALID_ARGUMENT
 * ERR_INVALID_ATTRIBUTE
 * ERR_INVALID_CONTEXT
 */
OWF_API_CALL void
OWF_Attribute_Initf(OWF_ATTRIBUTE_LIST* aContext,
                    OWFint aName,
                    OWF_FLOAT_REF aValue,
                    OWFboolean aRdOnly);

/*
 * \brief Initialize boolean attribute
 *
 * \param aContext Attribute context
 * \param aName Attribute name
 * \param aValue Initial value for attribute
 * \param aRdOnly Read-only flag
 *
 * \return ERR_INVALID_ARGUMENT
 * ERR_INVALID_ATTRIBUTE
 * ERR_INVALID_CONTEXT
 */
OWF_API_CALL void
OWF_Attribute_Initb(OWF_ATTRIBUTE_LIST* aContext,
                    OWFint aName,
                    OWF_BOOL_REF aValue,
                    OWFboolean aRdOnly);

/*
 * \brief Initialize vector attribute
 *
 * \param aContext Attribute context
 * \param aName Attribute name
 * \param aLength Attribute (vector) length
 * \param aValues Initial value(s) for attribute
 * \param aRdOnly Read-only flag
 *
 * \return ERR_INVALID_ARGUMENT
 * ERR_INVALID_ATTRIBUTE
 * ERR_INVALID_CONTEXT
 * ERR_CANT_HANDLE
 */
OWF_API_CALL void
OWF_Attribute_Initiv(OWF_ATTRIBUTE_LIST* aContext,
                     OWFint aName,
                     OWFint aLength,
                     OWF_INT_VECTOR_REF aValues,
                     OWFboolean aRdOnly);

/*
 * \brief Initialize vector attribute
 *
 * \param aContext Attribute context
 * \param aName Attribute name
 * \param aLength Attribute (vector) length
 * \param aValues Initial value(s) for attributes
 * \param aRdOnly Read-only flag
 *
 * \return
 */
OWF_API_CALL void
OWF_Attribute_Initfv(OWF_ATTRIBUTE_LIST* aContext,
                     OWFint aName,
                     OWFint aLength,
                     OWF_FLOAT_VECTOR_REF aValues,
                     OWFboolean aRdOnly);

/*
 * \brief Get attribute integer value.
 *
 * \param aContext Attribute context
 * \param aName Attribute name
 *
 * \return Attribute integer value (floats are floor()ed). For vector
 * attributes the return value will be error ERR_INVALID_TYPE.
 * ERR_INVALID_ATTRIBUTE
 * ERR_INVALID_CONTEXT
 */
OWF_API_CALL OWFint
OWF_Attribute_GetValuei(OWF_ATTRIBUTE_LIST* aContext,
                        OWFint aName);

/*
 * \brief Return boolean attribute value
 *
 * \param aContext Attribute context
 * \param aName Attribute name
 *
 * \return Attribute value
 * ERR_INVALID_ATTRIBUTE
 * ERR_INVALID_TYPE
 */
OWF_API_CALL OWFboolean
OWF_Attribute_GetValueb(OWF_ATTRIBUTE_LIST* aContext,
                        OWFint aName);

/*
 * \brief Get attribute float value
 *
 * \param aContext
 * \param aName
 * \param aValue
 *
 * \return Attribute
 */
OWF_API_CALL OWFfloat
OWF_Attribute_GetValuef(OWF_ATTRIBUTE_LIST* aContext,
                        OWFint aName);

/*
 * \brief
 *
 * \param aContext
 * \param aName
 * \param aSize
 * \param aValue
 *
 * \return
 */
OWF_API_CALL OWFint
OWF_Attribute_GetValueiv(OWF_ATTRIBUTE_LIST* aContext,
                         OWFint aName,
                         OWFint aLength,
                         OWFint* aValue);

/*
 * \brief
 *
 * \param aContext
 * \param aName
 * \param aSize
 * \param aValue
 *
 * \return
 */
OWF_API_CALL OWFint
OWF_Attribute_GetValuefv(OWF_ATTRIBUTE_LIST* aContext,
                         OWFint aName,
                         OWFint aLength,
                         OWFfloat* aValue);

/*
 * \brief
 *
 * \param aContext
 * \param aName
 * \param aValue
 *
 * \return
 */
OWF_API_CALL void
OWF_Attribute_SetValuei(OWF_ATTRIBUTE_LIST* aContext,
                        OWFint aName,
                        OWFint aValue);

/*
 * \brief
 *
 * \param aContext
 * \param aName
 * \param aValue
 *
 * \return
 */
OWF_API_CALL void
OWF_Attribute_SetValuef(OWF_ATTRIBUTE_LIST* aContext,
                        OWFint aName,
                        OWFfloat aValue);

/*
 * \brief
 *
 * \param
 * \param
 * \param
 *
 * \return
 */
OWF_API_CALL void
OWF_Attribute_SetValueb(OWF_ATTRIBUTE_LIST* aContext,
                        OWFint aName,
                        OWFboolean aValue);

/*
 * \brief
 *
 * \param
 * \param
 * \param
 *
 * \return
 */
OWF_API_CALL void
OWF_Attribute_SetValueiv(OWF_ATTRIBUTE_LIST* aContext,
                         OWFint aName,
                         OWFint aLength,
                         const OWFint* aValue);

/*
 * \brief
 *
 * \param
 * \param
 * \param
 *
 * \return
 */
OWF_API_CALL void
OWF_Attribute_SetValuefv(OWF_ATTRIBUTE_LIST* aContext,
                         OWFint aName,
                         OWFint aLength,
                         const OWFfloat* aValue);


OWF_API_CALL void
OWF_AttributeList_Commit(OWF_ATTRIBUTE_LIST* aContext, OWFint aStart, OWFint aEnd, OWFint aCopyTo );


#ifdef __cplusplus
}
#endif

#endif /* ATTRIBUTES_H_ */