/*
 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code 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 the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

#if !defined(JAVA2D_NO_MLIB) || defined(MLIB_ADD_SUFF)

#include <vis_proto.h>
#include "vis_AlphaMacros.h"

/***************************************************************/

#define STORE_INT      \
    *dst = fgpixel

#define STORE_D64(TSIZE, dst, mask)    \
    vis_pst_##TSIZE(fgpixel_d, dst, mask)

/***************************************************************/

#define INIT_FG

/***************************************************************/

#define DEF_GLYPH(TSIZE)                                       \
    const jubyte *pixels;                                      \
    unsigned int rowBytes;                                     \
    int left, top;                                             \
    int width, height;                                         \
    int right, bottom;                                         \
                                                               \
    pixels = (const jubyte *) glyphs[glyphCounter].pixels;     \
                                                               \
    if (!pixels) continue;                                     \
                                                               \
    left = glyphs[glyphCounter].x;                             \
    top = glyphs[glyphCounter].y;                              \
    width = glyphs[glyphCounter].width;                        \
    height = glyphs[glyphCounter].height;                      \
    rowBytes = width;                                          \
    right = left + width;                                      \
    bottom = top + height;                                     \
    if (left < clipLeft) {                                     \
        pixels += clipLeft - left;                             \
        left = clipLeft;                                       \
    }                                                          \
    if (top < clipTop) {                                       \
        pixels += (clipTop - top) * rowBytes;                  \
        top = clipTop;                                         \
    }                                                          \
    if (right > clipRight) {                                   \
        right = clipRight;                                     \
    }                                                          \
    if (bottom > clipBottom) {                                 \
        bottom = clipBottom;                                   \
    }                                                          \
    if (right <= left || bottom <= top) {                      \
        continue;                                              \
    }                                                          \
    width = right - left;                                      \
    height = bottom - top;                                     \
                                                               \
    dstBase = pRasInfo->rasBase;                               \
    PTR_ADD(dstBase, top*scan + TSIZE*left)

/***************************************************************/

void ADD_SUFF(AnyByteDrawGlyphList)(GLYPH_LIST_PARAMS)
{
    mlib_s32 glyphCounter;
    mlib_s32 scan = pRasInfo->scanStride;
    mlib_u8  *dstBase;
    mlib_s32 j;
    mlib_d64 fgpixel_d;
    mlib_d64 dzero;
    mlib_s32 pix, mask0, mask1, mask_h, mask_l, off;
    mlib_f32 fzero;

    INIT_FG

    fzero = vis_fzeros();
    dzero = vis_fzero();
    D64_FROM_U8x8(fgpixel_d, fgpixel);

    for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
        DEF_GLYPH(1);

        for (j = 0; j < height; j++) {
            mlib_u8 *src = (void*)pixels;
            mlib_u8 *dst, *dst_end;
            mlib_d64 ss, s0, s1;

            dst = (void*)dstBase;
            dst_end = dst + width;

            while (((mlib_s32)dst & 7) && (dst < dst_end)) {
                pix = *src++;
                if (pix) STORE_INT;
                dst++;
            }

            off = (mlib_s32)src & 7;
            ss = *(mlib_d64*)(src - off);
            mask_h = vis_fcmpne16(vis_fpmerge(vis_read_hi(ss), fzero), dzero);
            mask_l = vis_fcmpne16(vis_fpmerge(vis_read_lo(ss), fzero), dzero);
            mask1 = (mask_h << 4) | mask_l;

#pragma pipeloop(0)
            for (; dst <= (dst_end - 8); dst += 8) {
                mask0 = mask1;
                src += 8;
                ss = *(mlib_d64*)(src - off);
                s0 = vis_fpmerge(vis_read_hi(ss), fzero);
                s1 = vis_fpmerge(vis_read_lo(ss), fzero);
                mask_h = vis_fcmpne16(s0, dzero);
                mask_l = vis_fcmpne16(s1, dzero);
                mask1 = (mask_h << 4) | mask_l;
                STORE_D64(8, dst, (mask0 << off) | (mask1 >> (8 - off)));
            }

            while (dst < dst_end) {
                pix = *src++;
                if (pix) STORE_INT;
                dst++;
            }

            PTR_ADD(dstBase, scan);
            pixels += rowBytes;
        }
    }
}

/***************************************************************/

void ADD_SUFF(AnyShortDrawGlyphList)(GLYPH_LIST_PARAMS)
{
    mlib_s32 glyphCounter;
    mlib_s32 scan = pRasInfo->scanStride;
    mlib_u8  *dstBase;
    mlib_s32 j;
    mlib_d64 fgpixel_d;
    mlib_d64 dzero;
    mlib_s32 pix, mask0, mask1, off;
    mlib_f32 fzero;

    INIT_FG

    fzero = vis_fzeros();
    dzero = vis_fzero();
    D64_FROM_U16x4(fgpixel_d, fgpixel);

    for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
        DEF_GLYPH(2);

        for (j = 0; j < height; j++) {
            mlib_u8 *src = (void*)pixels;
            mlib_u16 *dst, *dst_end;
            mlib_f32 ss;

            dst = (void*)dstBase;
            dst_end = dst + width;

            while (((mlib_s32)dst & 7) && (dst < dst_end)) {
                pix = *src++;
                if (pix) STORE_INT;
                dst++;
            }

            off = (mlib_s32)src & 3;
            ss = *(mlib_f32*)(src - off);
            mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);

#pragma pipeloop(0)
            for (; dst <= (dst_end - 4); dst += 4) {
                mask0 = mask1;
                src += 4;
                ss = *(mlib_f32*)(src - off);
                mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);
                STORE_D64(16, dst, (mask0 << off) | (mask1 >> (4 - off)));
            }

            while (dst < dst_end) {
                pix = *src++;
                if (pix) STORE_INT;
                dst++;
            }

            PTR_ADD(dstBase, scan);
            pixels += rowBytes;
        }
    }
}

/***************************************************************/

void ADD_SUFF(AnyIntDrawGlyphList)(GLYPH_LIST_PARAMS)
{
    mlib_s32 glyphCounter;
    mlib_s32 scan = pRasInfo->scanStride;
    mlib_u8  *dstBase;
    mlib_s32 j;
    mlib_d64 fgpixel_d;
    mlib_d64 dzero;
    mlib_s32 pix, mask0, mask1, mask, off;
    mlib_f32 fzero;

    INIT_FG

    fzero = vis_fzeros();
    dzero = vis_fzero();
    fgpixel_d = vis_to_double_dup(fgpixel);

    for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
        DEF_GLYPH(4);

        for (j = 0; j < height; j++) {
            mlib_u8 *src = (void*)pixels;
            mlib_u32 *dst, *dst_end;
            mlib_f32 ss;

            dst = (void*)dstBase;
            dst_end = dst + width;

            while (((mlib_s32)dst & 7) && (dst < dst_end)) {
                pix = *src++;
                if (pix) STORE_INT;
                dst++;
            }

            off = (mlib_s32)src & 3;
            ss = *(mlib_f32*)(src - off);
            mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);

#pragma pipeloop(0)
            for (; dst <= (dst_end - 4); dst += 4) {
                mask0 = mask1;
                src += 4;
                ss = *(mlib_f32*)(src - off);
                mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);
                mask = (mask0 << off) | (mask1 >> (4 - off));
                STORE_D64(32, dst, mask >> 2);
                STORE_D64(32, dst + 2, mask);
            }

            while (dst < dst_end) {
                pix = *src++;
                if (pix) STORE_INT;
                dst++;
            }

            PTR_ADD(dstBase, scan);
            pixels += rowBytes;
        }
    }
}

/***************************************************************/

void ADD_SUFF(Any4ByteDrawGlyphList)(GLYPH_LIST_PARAMS)
{
    mlib_d64 buff[BUFF_SIZE/2];
    void     *pbuff = buff;
    mlib_s32 glyphCounter;
    mlib_s32 scan = pRasInfo->scanStride;
    mlib_u8  *dstBase;
    mlib_s32 j;
    mlib_d64 fgpixel_d;
    mlib_d64 dzero;
    mlib_s32 pix, mask0, mask1, mask, off;
    mlib_f32 fzero, fgpixel_f;
    mlib_s32 max_width = BUFF_SIZE;

    INIT_FG

    fzero = vis_fzeros();
    dzero = vis_fzero();
    fgpixel_f = vis_ldfa_ASI_PL(&fgpixel);
    fgpixel_d = vis_freg_pair(fgpixel_f, fgpixel_f);
    fgpixel = *(mlib_u32*)&fgpixel_f;

    for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
        DEF_GLYPH(4);

        if (((mlib_s32)dstBase | scan) & 3) {
            if (width > max_width) {
                if (pbuff != buff) {
                    mlib_free(pbuff);
                }
                pbuff = mlib_malloc(width*sizeof(mlib_s32));
                if (pbuff == NULL) return;
                max_width = width;
            }
        }

        for (j = 0; j < height; j++) {
            mlib_u8 *src = (void*)pixels;
            mlib_u32 *dst, *dst_end;
            mlib_f32 ss;

            if ((mlib_s32)dstBase & 3) {
                COPY_NA(dstBase, pbuff, width*sizeof(mlib_s32));
                dst = pbuff;
            } else {
                dst = (void*)dstBase;
            }
            dst_end = dst + width;

            while (((mlib_s32)dst & 7) && (dst < dst_end)) {
                pix = *src++;
                if (pix) STORE_INT;
                dst++;
            }

            off = (mlib_s32)src & 3;
            ss = *(mlib_f32*)(src - off);
            mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);

#pragma pipeloop(0)
            for (; dst <= (dst_end - 4); dst += 4) {
                mask0 = mask1;
                src += 4;
                ss = *(mlib_f32*)(src - off);
                mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);
                mask = (mask0 << off) | (mask1 >> (4 - off));
                STORE_D64(32, dst, mask >> 2);
                STORE_D64(32, dst + 2, mask);
            }

            while (dst < dst_end) {
                pix = *src++;
                if (pix) STORE_INT;
                dst++;
            }

            if ((mlib_s32)dstBase & 3) {
                COPY_NA(pbuff, dstBase, width*sizeof(mlib_s32));
            }

            PTR_ADD(dstBase, scan);
            pixels += rowBytes;
        }
    }

    if (pbuff != buff) {
        mlib_free(pbuff);
    }
}

/***************************************************************/

#endif /* JAVA2D_NO_MLIB */
