0N/A/*
3909N/A * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A#if !defined(JAVA2D_NO_MLIB) || defined(MLIB_ADD_SUFF)
0N/A
0N/A#include <vis_AlphaMacros.h>
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntArgbSrcMaskFill()
0N/A * FourByteAbgrSrcMaskFill()
0N/A */
0N/A
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A \
0N/A dstA = MUL8_INT(dstA, 0xff - pathA); \
0N/A \
0N/A t0 = MUL8_VIS(cnstARGB0, pathA); \
0N/A t1 = MUL8_VIS(dstARGB, dstA); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A \
0N/A dstA = dstA + mul8_cnstA[pathA]; \
0N/A DIV_ALPHA(rr, dstA); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbSrcMaskFill_line(mlib_f32 *dst_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_d64 fgARGB,
0N/A mlib_f32 cnstARGB0,
0N/A mlib_u8 *mul8_cnstA,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0;
0N/A
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A
0N/A if (pathA0 == 0xff) {
0N/A dst_ptr[i] = vis_read_hi(fgARGB);
0N/A } else if (pathA0) {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A *(mlib_u8*)(dst_ptr + i) = dstA0;
0N/A }
0N/A
0N/A i0 = 1;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = i0; i <= width - 2; i += 2) {
0N/A pathA0 = pMask[i];
0N/A pathA1 = pMask[i + 1];
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstA1 = *(mlib_u8*)(dst_ptr + i + 1);
0N/A dstARGB = *(mlib_d64*)(dst_ptr + i);
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB));
0N/A MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A msk = (((-pathA0) & (1 << 11)) | ((-pathA1) & (1 << 10))) >> 10;
0N/A vis_pst_32(res0, dst_ptr + i, msk);
0N/A
0N/A *(mlib_u8*)(dst_ptr + i ) = dstA0;
0N/A *(mlib_u8*)(dst_ptr + i + 1) = dstA1;
0N/A
0N/A msk = (((254 - pathA0) & (1 << 11)) |
0N/A ((254 - pathA1) & (1 << 10))) >> 10;
0N/A vis_pst_32(fgARGB, dst_ptr + i, msk);
0N/A }
0N/A
0N/A if (i < width) {
0N/A pathA0 = pMask[i];
0N/A
0N/A if (pathA0 == 0xff) {
0N/A dst_ptr[i] = vis_read_hi(fgARGB);
0N/A } else if (pathA0) {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A *(mlib_u8*)(dst_ptr + i) = dstA0;
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbSrcMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_d64 fgARGB;
0N/A mlib_u8 *mul8_cnstA;
0N/A mlib_s32 j;
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA == 0) {
0N/A fgColor = 0;
0N/A }
0N/A
0N/A if (pMask == NULL) {
3265N/A void *pBase = pRasInfo->rasBase;
3265N/A pRasInfo->rasBase = rasBase;
0N/A ADD_SUFF(AnyIntSetRect)(pRasInfo,
3265N/A 0, 0, width, height,
0N/A fgColor, pPrim, pCompInfo);
3265N/A pRasInfo->rasBase = pBase;
0N/A return;
0N/A }
0N/A
0N/A mul8_cnstA = mul8table[cnstA];
0N/A if (cnstA != 0xff) {
0N/A cnstR = mul8_cnstA[cnstR];
0N/A cnstG = mul8_cnstA[cnstG];
0N/A cnstB = mul8_cnstA[cnstB];
0N/A }
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstR, cnstG, cnstB);
0N/A
0N/A fgARGB = vis_to_double_dup(fgColor);
0N/A
0N/A pMask += maskOff;
0N/A
0N/A if (rasScan == 4*width && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A vis_write_gsr(7 << 3);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbSrcMaskFill_line(rasBase, pMask, width, fgARGB, cnstARGB0,
0N/A mul8_cnstA, (void*)mul8table);
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(FourByteAbgrSrcMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff;
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_d64 fgARGB;
0N/A mlib_u8 *mul8_cnstA;
0N/A mlib_s32 j;
0N/A
0N/A cnstA = (mlib_u32)fgColor >> 24;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (pMask == NULL) {
3265N/A void *pBase = pRasInfo->rasBase;
3265N/A pRasInfo->rasBase = rasBase;
0N/A if (cnstA == 0) {
0N/A fgColor = 0;
0N/A } else {
0N/A fgColor = (fgColor << 8) | cnstA;
0N/A }
0N/A ADD_SUFF(Any4ByteSetRect)(pRasInfo,
3265N/A 0, 0, width, height,
0N/A fgColor, pPrim, pCompInfo);
3265N/A pRasInfo->rasBase = pBase;
0N/A return;
0N/A }
0N/A
0N/A mul8_cnstA = mul8table[cnstA];
0N/A
0N/A if (cnstA == 0) {
0N/A fgColor = 0;
0N/A cnstR = cnstG = cnstB = 0;
0N/A } else {
0N/A fgColor = (cnstA << 24) | (cnstB << 16) | (cnstG << 8) | cnstR;
0N/A if (cnstA != 0xff) {
0N/A cnstR = mul8_cnstA[cnstR];
0N/A cnstG = mul8_cnstA[cnstG];
0N/A cnstB = mul8_cnstA[cnstB];
0N/A }
0N/A }
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstB, cnstG, cnstR);
0N/A
0N/A fgARGB = vis_to_double_dup(fgColor);
0N/A
0N/A pMask += maskOff;
0N/A
0N/A if (((mlib_s32)rasBase | rasScan) & 3) {
0N/A if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A } else {
0N/A if (rasScan == 4*width && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A }
0N/A
0N/A vis_write_gsr(7 << 3);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A if (!((mlib_s32)rasBase & 3)) {
0N/A IntArgbSrcMaskFill_line(rasBase, pMask, width, fgARGB, cnstARGB0,
0N/A mul8_cnstA, (void*)mul8table);
0N/A } else {
0N/A mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32));
0N/A IntArgbSrcMaskFill_line(pbuff, pMask, width, fgARGB, cnstARGB0,
0N/A mul8_cnstA, (void*)mul8table);
0N/A mlib_ImageCopy_na(pbuff, rasBase, width*sizeof(mlib_s32));
0N/A }
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntRgbSrcMaskFill()
0N/A * IntBgrSrcMaskFill()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A \
0N/A dstA = 0xff - pathA; \
0N/A \
0N/A t0 = MUL8_VIS(cnstARGB0, pathA); \
0N/A t1 = MUL8_VIS(dstARGB, dstA); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A \
0N/A dstA = dstA + mul8_cnstA[pathA]; \
0N/A DIV_ALPHA_RGB(rr, dstA); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntRgbSrcMaskFill_line(mlib_f32 *dst_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_d64 fgARGB,
0N/A mlib_f32 cnstARGB0,
0N/A mlib_u8 *mul8_cnstA,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0;
0N/A
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A
0N/A if (pathA0 == 0xff) {
0N/A dst_ptr[i] = vis_read_hi(fgARGB);
0N/A } else if (pathA0) {
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A
0N/A i0 = 1;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = i0; i <= width - 2; i += 2) {
0N/A pathA0 = pMask[i];
0N/A pathA1 = pMask[i + 1];
0N/A dstARGB = *(mlib_d64*)(dst_ptr + i);
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB));
0N/A MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A msk = (((-pathA0) & (1 << 11)) | ((-pathA1) & (1 << 10))) >> 10;
0N/A vis_pst_32(res0, dst_ptr + i, msk);
0N/A
0N/A msk = (((254 - pathA0) & (1 << 11)) |
0N/A ((254 - pathA1) & (1 << 10))) >> 10;
0N/A vis_pst_32(fgARGB, dst_ptr + i, msk);
0N/A }
0N/A
0N/A if (i < width) {
0N/A pathA0 = pMask[i];
0N/A
0N/A if (pathA0 == 0xff) {
0N/A dst_ptr[i] = vis_read_hi(fgARGB);
0N/A } else if (pathA0) {
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntRgbSrcMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_d64 fgARGB;
0N/A mlib_u8 *mul8_cnstA;
0N/A mlib_s32 j;
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA == 0) fgColor = 0;
0N/A
0N/A if (pMask == NULL) {
3265N/A void *pBase = pRasInfo->rasBase;
3265N/A pRasInfo->rasBase = rasBase;
0N/A ADD_SUFF(AnyIntSetRect)(pRasInfo,
3265N/A 0, 0, width, height,
0N/A fgColor, pPrim, pCompInfo);
3265N/A pRasInfo->rasBase = pBase;
0N/A return;
0N/A }
0N/A
0N/A mul8_cnstA = mul8table[cnstA];
0N/A if (cnstA != 0xff) {
0N/A cnstR = mul8_cnstA[cnstR];
0N/A cnstG = mul8_cnstA[cnstG];
0N/A cnstB = mul8_cnstA[cnstB];
0N/A }
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstR, cnstG, cnstB);
0N/A
0N/A fgARGB = vis_to_double_dup(fgColor);
0N/A
0N/A pMask += maskOff;
0N/A
0N/A if (rasScan == 4*width && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A vis_write_gsr(7 << 3);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntRgbSrcMaskFill_line(rasBase, pMask, width, fgARGB, cnstARGB0,
0N/A mul8_cnstA, (void*)mul8table);
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntBgrSrcMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_d64 fgARGB;
0N/A mlib_u8 *mul8_cnstA;
0N/A mlib_s32 j;
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA == 0) {
0N/A fgColor = 0;
0N/A } else {
0N/A fgColor = (cnstB << 16) | (cnstG << 8) | (cnstR);
0N/A }
0N/A
0N/A if (pMask == NULL) {
3265N/A void *pBase = pRasInfo->rasBase;
3265N/A pRasInfo->rasBase = rasBase;
0N/A ADD_SUFF(AnyIntSetRect)(pRasInfo,
3265N/A 0, 0, width, height,
0N/A fgColor, pPrim, pCompInfo);
3265N/A pRasInfo->rasBase = pBase;
0N/A return;
0N/A }
0N/A
0N/A mul8_cnstA = mul8table[cnstA];
0N/A if (cnstA != 0xff) {
0N/A cnstR = mul8_cnstA[cnstR];
0N/A cnstG = mul8_cnstA[cnstG];
0N/A cnstB = mul8_cnstA[cnstB];
0N/A }
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstB, cnstG, cnstR);
0N/A
0N/A fgARGB = vis_to_double_dup(fgColor);
0N/A
0N/A pMask += maskOff;
0N/A
0N/A if (rasScan == 4*width && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A vis_write_gsr(7 << 3);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntRgbSrcMaskFill_line(rasBase, pMask, width, fgARGB, cnstARGB0,
0N/A mul8_cnstA, (void*)mul8table);
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(ThreeByteBgrSrcMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff;
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_d64 fgARGB;
0N/A mlib_u8 *mul8_cnstA;
0N/A mlib_s32 j;
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA == 0) {
0N/A fgColor = 0;
0N/A }
0N/A
0N/A if (pMask == NULL) {
3265N/A void *pBase = pRasInfo->rasBase;
3265N/A pRasInfo->rasBase = rasBase;
0N/A ADD_SUFF(Any3ByteSetRect)(pRasInfo,
3265N/A 0, 0, width, height,
0N/A fgColor, pPrim, pCompInfo);
3265N/A pRasInfo->rasBase = pBase;
0N/A return;
0N/A }
0N/A
0N/A mul8_cnstA = mul8table[cnstA];
0N/A if (cnstA != 0xff) {
0N/A cnstR = mul8_cnstA[cnstR];
0N/A cnstG = mul8_cnstA[cnstG];
0N/A cnstB = mul8_cnstA[cnstB];
0N/A }
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstR, cnstG, cnstB);
0N/A
0N/A fgARGB = vis_to_double_dup(fgColor);
0N/A
0N/A pMask += maskOff;
0N/A
0N/A if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A
0N/A vis_write_gsr(7 << 3);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A ADD_SUFF(ThreeByteBgrToIntArgbConvert)(rasBase, pbuff, width, 1,
0N/A pRasInfo, pRasInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A IntRgbSrcMaskFill_line(pbuff, pMask, width, fgARGB, cnstARGB0,
0N/A mul8_cnstA, (void*)mul8table);
0N/A
0N/A IntArgbToThreeByteBgrConvert(pbuff, rasBase, width, 1,
0N/A pRasInfo, pRasInfo, pPrim, pCompInfo);
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#endif