/* SPDX-License-Identifier: LGPL-2.1-only OR BSD-3-Clause */
/******************************************************************************
 *
 * This file is provided under a dual license.  When you use or
 * distribute this software, you may choose to be licensed under
 * version 2.1 of the GNU Lesser General Public License
 * ("LGPLv2.1 License") or BSD License.
 *
 * LGPLv2.1 License
 *
 * Copyright(C) 2019 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2.1 of the GNU Lesser General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html for more
 * details.
 *
 * BSD LICENSE
 *
 * Copyright(C) 2019 MediaTek Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/

/*----------------------------------------------------------------------------*/
/*! @file u_wgl_tools.h 
 *  $RCSfile: $
 *  $Revision: #1 $
 *  $Date: 2015/05/29 $
 *  $Author: brianpc.huang $
 *  
 *  @par Description:
 *         This header file contains public interfaces, constant and type 
 *         definitions of the Widget Library.
 */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*! @addtogroup groupMW_WGL
 *  @{ 
 */
/*----------------------------------------------------------------------------*/
 
#ifndef _U_WGL_TOOLS_H_
#define _U_WGL_TOOLS_H_

/*-----------------------------------------------------------------------------
                    include files
 ----------------------------------------------------------------------------*/
#include "u_wgl_common.h"

#ifdef __cplusplus
extern "C" {
#endif

/*-----------------------------------------------------------------------------
                    macros, defines, typedefs, enums
 ----------------------------------------------------------------------------*/

#define WIDGET_SERIAL_ID(_widget_type_id)                               \
            ((UINT32)((_widget_type_id)-HT_WGL_WIDGET_START))    /**<To get widget type serial id.  */

#define WGL_MAKE_CONTENT_ID(_widget_type_id, _content_type_id)          \
            ( (WIDGET_SERIAL_ID(_widget_type_id)<<9) | ((UINT32)(_content_type_id) & 0x000001FF) )    /**< Content Type ID:
                                                                                                                              --> Reserved(14:0x0) + WidgetTypeID(9) + ContentTypeID(9)       */

#define WGL_IS_CONTENT_BELONG_WIDGET(_content_type_id, _widget_type_id) \
            ( ((UINT32)(_content_type_id)>>9) == WIDGET_SERIAL_ID(_widget_type_id) )    /**<Judge the content si belong to widget or not.   */

#define WGL_MAKE_BORDER_ID(_border_type_id)                             \
            ((UINT32)(_border_type_id)&0x000001FF)    /**<  Border Type ID:
                                                                                                         --> Reserved(23:0x0) + BorderTypeID(9) */

#define TAG(b, l, v)                                                \
    (                                                               \
        (((((UINT32) 1 ) << ((UINT8)(l))) - 1) & ((UINT32) (v)))    \
          << ((UINT8)(b) - (UINT8)(l) + 1)                          \
    )    /**<Tag */

/*Command Category Prefix*/
#define WGL_CMDCTG_WIDGET       0x01    /**< Widget Command Category Prefix       */
#define WGL_CMDCTG_BORDER       0x02    /**<  Border Command Category Prefix      */
#define WGL_CMDCTG_CONTENT      0x04    /**< Content Command Category Prefix       */

#define WIDGET_SERIAL_ID_BASE   0x01FF    /**<The widget serial base id. */


#define WGL_MAKE_GL_WIDGET_CMD(_cmd_id)    \
                    (TAG(31, 4, WGL_CMDCTG_WIDGET) | TAG(27, 9, 0) | TAG(18, 9, WIDGET_SERIAL_ID_BASE) | TAG(9, 10, (_cmd_id)) )    
                    /**<Widget make general widget command by command id.  */

#define WGL_MAKE_ANIM_WIDGET_CMD(_cmd_id)  \
                    WGL_MAKE_GL_WIDGET_CMD(_cmd_id)    /**<To make animation widget command.  */

#define WGL_MAKE_WIDGET_CMD(_widget_type_id, _cmd_id)       \
                    (TAG(31, 4, WGL_CMDCTG_WIDGET) | TAG(27, 9, 0) | TAG(18, 9, WIDGET_SERIAL_ID(_widget_type_id)) | TAG(9, 10, (_cmd_id)) )    /**<Widget Commands:
                                                                                                                                                                                                                                                            --> Category prefix(4) + Reserved (9:0x0) + WidgetTypeID(9) + Command Id (10)         */

#define WGL_MAKE_CONTENT_CMD(_content_type_id, _cmd_id)     \
                    (TAG(31, 4, WGL_CMDCTG_CONTENT) | TAG(27, 18, (_content_type_id)) | TAG(9, 10, (_cmd_id)) )    /**<     Content Commands:
                                                                                                                                                                                                                    --> Category prefix(4) + WidgetTypeID(9) + ContentTypeID(9) + Command Id (10)     */

#define WGL_MAKE_BORDER_CMD(_border_type_id, _cmd_id)       \
                    (TAG(31, 4, WGL_CMDCTG_BORDER) | TAG(27, 9, 0) | TAG(18, 9, (_border_type_id)) | TAG(9, 10, (_cmd_id)) )    /**<   Border Commands:
                                                                                                                                                                                                                                    --> Category prefix(4) + Reserved (9:0x0) + BorderTypeID (9) + Command Id (10)       */


#define WGL_PACK(_x)                                                        \
        ((VOID *)((UINT32)(_x)))    /**< To pack for widget. */
        
#define WGL_PACK_2(_x, _y)                                                  \
        ((VOID *) (  (((UINT32)((UINT16)(_x)))<<16) | ((UINT32)((UINT16)(_y)))  ) )    /**<To pack by two UINT16 for widget. */
        
#define WGL_PACK_3(_x16, _y8, _z8)                                          \
        (VOID *)(  (((UINT32)((UINT16)(_x16)))<<16) | ((UINT32)((UINT8)(_y8))<<8) | ((UINT32)((UINT8)(_z8))) )    /**< To pack by UINT16+UINT8+UINT8 for widget. */
        
/*-----------------------------------------------------------------------------
                    structures
 ----------------------------------------------------------------------------*/


/*-----------------------------------------------------------------------------
                    functions
 ----------------------------------------------------------------------------*/



#ifdef __cplusplus
}
#endif

#endif

/*----------------------------------------------------------------------------*/
/*! @} */   /* end of  groupMW_WGL*/
/*----------------------------------------------------------------------------*/


