/*
 * Copyright 2009 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#include "SkBitmapScaler.h"
#include "SkBitmapProcState.h"
#include "SkColorPriv.h"
#include "SkPaint.h"
#include "SkTypes.h"
#include "SkUtils.h"
#include "SkUtilsArm.h"

#include "SkConvolver.h"

#if !defined(SK_CPU_ARM64) && SK_ARM_ARCH >= 6 && !defined(SK_CPU_BENDIAN)
void SI8_D16_nofilter_DX_arm(
    const SkBitmapProcState& s,
    const uint32_t* SK_RESTRICT xy,
    int count,
    uint16_t* SK_RESTRICT colors) SK_ATTRIBUTE_OPTIMIZE_O1;

void SI8_D16_nofilter_DX_arm(const SkBitmapProcState& s,
                             const uint32_t* SK_RESTRICT xy,
                             int count, uint16_t* SK_RESTRICT colors) {
    SkASSERT(count > 0 && colors != NULL);
    SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
    SkASSERT(SkPaint::kNone_FilterLevel == s.fFilterLevel);

    const uint16_t* SK_RESTRICT table = s.fBitmap->getColorTable()->lock16BitCache();
    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels();

    // buffer is y32, x16, x16, x16, x16, x16
    // bump srcAddr to the proper row, since we're told Y never changes
    SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
    srcAddr = (const uint8_t*)((const char*)srcAddr +
                               xy[0] * s.fBitmap->rowBytes());

    uint8_t src;

    if (1 == s.fBitmap->width()) {
        src = srcAddr[0];
        uint16_t dstValue = table[src];
        sk_memset16(colors, dstValue, count);
    } else {
        int i;
        int count8 = count >> 3;
        const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy + 1);

        asm volatile (
            "cmp        %[count8], #0                  \n\t"  // compare loop counter with 0
            "beq        2f                             \n\t"  // if loop counter == 0, exit
            "1:                                        \n\t"
            "ldmia      %[xx]!, {r5, r7, r9, r11}      \n\t"  // load ptrs to pixels 0-7
            "subs       %[count8], %[count8], #1       \n\t"  // decrement loop counter
            "uxth       r4, r5                         \n\t"  // extract ptr 0
            "mov        r5, r5, lsr #16                \n\t"  // extract ptr 1
            "uxth       r6, r7                         \n\t"  // extract ptr 2
            "mov        r7, r7, lsr #16                \n\t"  // extract ptr 3
            "ldrb       r4, [%[srcAddr], r4]           \n\t"  // load pixel 0 from image
            "uxth       r8, r9                         \n\t"  // extract ptr 4
            "ldrb       r5, [%[srcAddr], r5]           \n\t"  // load pixel 1 from image
            "mov        r9, r9, lsr #16                \n\t"  // extract ptr 5
            "ldrb       r6, [%[srcAddr], r6]           \n\t"  // load pixel 2 from image
            "uxth       r10, r11                       \n\t"  // extract ptr 6
            "ldrb       r7, [%[srcAddr], r7]           \n\t"  // load pixel 3 from image
            "mov        r11, r11, lsr #16              \n\t"  // extract ptr 7
            "ldrb       r8, [%[srcAddr], r8]           \n\t"  // load pixel 4 from image
            "add        r4, r4, r4                     \n\t"  // double pixel 0 for RGB565 lookup
            "ldrb       r9, [%[srcAddr], r9]           \n\t"  // load pixel 5 from image
            "add        r5, r5, r5                     \n\t"  // double pixel 1 for RGB565 lookup
            "ldrb       r10, [%[srcAddr], r10]         \n\t"  // load pixel 6 from image
            "add        r6, r6, r6                     \n\t"  // double pixel 2 for RGB565 lookup
            "ldrb       r11, [%[srcAddr], r11]         \n\t"  // load pixel 7 from image
            "add        r7, r7, r7                     \n\t"  // double pixel 3 for RGB565 lookup
            "ldrh       r4, [%[table], r4]             \n\t"  // load pixel 0 RGB565 from colmap
            "add        r8, r8, r8                     \n\t"  // double pixel 4 for RGB565 lookup
            "ldrh       r5, [%[table], r5]             \n\t"  // load pixel 1 RGB565 from colmap
            "add        r9, r9, r9                     \n\t"  // double pixel 5 for RGB565 lookup
            "ldrh       r6, [%[table], r6]             \n\t"  // load pixel 2 RGB565 from colmap
            "add        r10, r10, r10                  \n\t"  // double pixel 6 for RGB565 lookup
            "ldrh       r7, [%[table], r7]             \n\t"  // load pixel 3 RGB565 from colmap
            "add        r11, r11, r11                  \n\t"  // double pixel 7 for RGB565 lookup
            "ldrh       r8, [%[table], r8]             \n\t"  // load pixel 4 RGB565 from colmap
            "ldrh       r9, [%[table], r9]             \n\t"  // load pixel 5 RGB565 from colmap
            "ldrh       r10, [%[table], r10]           \n\t"  // load pixel 6 RGB565 from colmap
            "ldrh       r11, [%[table], r11]           \n\t"  // load pixel 7 RGB565 from colmap
            "pkhbt      r5, r4, r5, lsl #16            \n\t"  // pack pixels 0 and 1
            "pkhbt      r6, r6, r7, lsl #16            \n\t"  // pack pixels 2 and 3
            "pkhbt      r8, r8, r9, lsl #16            \n\t"  // pack pixels 4 and 5
            "pkhbt      r10, r10, r11, lsl #16         \n\t"  // pack pixels 6 and 7
            "stmia      %[colors]!, {r5, r6, r8, r10}  \n\t"  // store last 8 pixels
            "bgt        1b                             \n\t"  // loop if counter > 0
            "2:                                        \n\t"
            : [xx] "+r" (xx), [count8] "+r" (count8), [colors] "+r" (colors)
            : [table] "r" (table), [srcAddr] "r" (srcAddr)
            : "memory", "cc", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
        );

        for (i = (count & 7); i > 0; --i) {
            src = srcAddr[*xx++]; *colors++ = table[src];
        }
    }

    s.fBitmap->getColorTable()->unlock16BitCache();
}

void SI8_opaque_D32_nofilter_DX_arm(
    const SkBitmapProcState& s,
    const uint32_t* SK_RESTRICT xy,
    int count,
    SkPMColor* SK_RESTRICT colors) SK_ATTRIBUTE_OPTIMIZE_O1;

void SI8_opaque_D32_nofilter_DX_arm(const SkBitmapProcState& s,
                                    const uint32_t* SK_RESTRICT xy,
                                    int count, SkPMColor* SK_RESTRICT colors) {
    SkASSERT(count > 0 && colors != NULL);
    SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
    SkASSERT(SkPaint::kNone_FilterLevel == s.fFilterLevel);

    const SkPMColor* SK_RESTRICT table = s.fBitmap->getColorTable()->lockColors();
    const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels();

    // buffer is y32, x16, x16, x16, x16, x16
    // bump srcAddr to the proper row, since we're told Y never changes
    SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
    srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fBitmap->rowBytes());

    if (1 == s.fBitmap->width()) {
        uint8_t src = srcAddr[0];
        SkPMColor dstValue = table[src];
        sk_memset32(colors, dstValue, count);
    } else {
        const uint16_t* xx = (const uint16_t*)(xy + 1);

        asm volatile (
            "subs       %[count], %[count], #8        \n\t"   // decrement count by 8, set flags
            "blt        2f                            \n\t"   // if count < 0, branch to singles
            "1:                                       \n\t"   // eights loop
            "ldmia      %[xx]!, {r5, r7, r9, r11}     \n\t"   // load ptrs to pixels 0-7
            "uxth       r4, r5                        \n\t"   // extract ptr 0
            "mov        r5, r5, lsr #16               \n\t"   // extract ptr 1
            "uxth       r6, r7                        \n\t"   // extract ptr 2
            "mov        r7, r7, lsr #16               \n\t"   // extract ptr 3
            "ldrb       r4, [%[srcAddr], r4]          \n\t"   // load pixel 0 from image
            "uxth       r8, r9                        \n\t"   // extract ptr 4
            "ldrb       r5, [%[srcAddr], r5]          \n\t"   // load pixel 1 from image
            "mov        r9, r9, lsr #16               \n\t"   // extract ptr 5
            "ldrb       r6, [%[srcAddr], r6]          \n\t"   // load pixel 2 from image
            "uxth       r10, r11                      \n\t"   // extract ptr 6
            "ldrb       r7, [%[srcAddr], r7]          \n\t"   // load pixel 3 from image
            "mov        r11, r11, lsr #16             \n\t"   // extract ptr 7
            "ldrb       r8, [%[srcAddr], r8]          \n\t"   // load pixel 4 from image
            "ldrb       r9, [%[srcAddr], r9]          \n\t"   // load pixel 5 from image
            "ldrb       r10, [%[srcAddr], r10]        \n\t"   // load pixel 6 from image
            "ldrb       r11, [%[srcAddr], r11]        \n\t"   // load pixel 7 from image
            "ldr        r4, [%[table], r4, lsl #2]    \n\t"   // load pixel 0 SkPMColor from colmap
            "ldr        r5, [%[table], r5, lsl #2]    \n\t"   // load pixel 1 SkPMColor from colmap
            "ldr        r6, [%[table], r6, lsl #2]    \n\t"   // load pixel 2 SkPMColor from colmap
            "ldr        r7, [%[table], r7, lsl #2]    \n\t"   // load pixel 3 SkPMColor from colmap
            "ldr        r8, [%[table], r8, lsl #2]    \n\t"   // load pixel 4 SkPMColor from colmap
            "ldr        r9, [%[table], r9, lsl #2]    \n\t"   // load pixel 5 SkPMColor from colmap
            "ldr        r10, [%[table], r10, lsl #2]  \n\t"   // load pixel 6 SkPMColor from colmap
            "ldr        r11, [%[table], r11, lsl #2]  \n\t"   // load pixel 7 SkPMColor from colmap
            "subs       %[count], %[count], #8        \n\t"   // decrement loop counter
            "stmia      %[colors]!, {r4-r11}          \n\t"   // store 8 pixels
            "bge        1b                            \n\t"   // loop if counter >= 0
            "2:                                       \n\t"
            "adds       %[count], %[count], #8        \n\t"   // fix up counter, set flags
            "beq        4f                            \n\t"   // if count == 0, branch to exit
            "3:                                       \n\t"   // singles loop
            "ldrh       r4, [%[xx]], #2               \n\t"   // load pixel ptr
            "subs       %[count], %[count], #1        \n\t"   // decrement loop counter
            "ldrb       r5, [%[srcAddr], r4]          \n\t"   // load pixel from image
            "ldr        r6, [%[table], r5, lsl #2]    \n\t"   // load SkPMColor from colmap
            "str        r6, [%[colors]], #4           \n\t"   // store pixel, update ptr
            "bne        3b                            \n\t"   // loop if counter != 0
            "4:                                       \n\t"   // exit
            : [xx] "+r" (xx), [count] "+r" (count), [colors] "+r" (colors)
            : [table] "r" (table), [srcAddr] "r" (srcAddr)
            : "memory", "cc", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
        );
    }

    s.fBitmap->getColorTable()->unlockColors();
}
#endif // !defined(SK_CPU_ARM64) && SK_ARM_ARCH >= 6 && !defined(SK_CPU_BENDIAN)

///////////////////////////////////////////////////////////////////////////////

/*  If we replace a sampleproc, then we null-out the associated shaderproc,
    otherwise the shader won't even look at the matrix/sampler
 */
void SkBitmapProcState::platformProcs() {
#if !defined(SK_CPU_ARM64) && SK_ARM_ARCH >= 6 && !defined(SK_CPU_BENDIAN)
    bool isOpaque = 256 == fAlphaScale;
    bool justDx = false;

    if (fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) {
        justDx = true;
    }

    switch (fBitmap->colorType()) {
        case kIndex_8_SkColorType:
            if (justDx && SkPaint::kNone_FilterLevel == fFilterLevel) {
#if 0   /* crashing on android device */
                fSampleProc16 = SI8_D16_nofilter_DX_arm;
                fShaderProc16 = NULL;
#endif
                if (isOpaque) {
                    // this one is only very slighty faster than the C version
                    fSampleProc32 = SI8_opaque_D32_nofilter_DX_arm;
                    fShaderProc32 = NULL;
                }
            }
            break;
        default:
            break;
    }
#endif
}

///////////////////////////////////////////////////////////////////////////////

extern void platformConvolutionProcs_arm_neon(SkConvolutionProcs* procs);

void platformConvolutionProcs_arm(SkConvolutionProcs* procs) {
}

void SkBitmapScaler::PlatformConvolutionProcs(SkConvolutionProcs* procs) {
    SK_ARM_NEON_WRAP(platformConvolutionProcs_arm)(procs);
}
