15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 University of Szeged
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Zoltan Herczeg
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef FEGaussianBlurNEON_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define FEGaussianBlurNEON_h
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if HAVE(ARM_NEON_INTRINSICS)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/cpu/arm/filters/NEONHelpers.h"
33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FEGaussianBlur.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void boxBlurNEON(Uint8ClampedArray* srcPixelArray, Uint8ClampedArray* dstPixelArray,
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        unsigned dx, int dxLeft, int dxRight, int stride, int strideLine, int effectWidth, int effectHeight)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t* sourcePixel = reinterpret_cast<uint32_t*>(srcPixelArray->data());
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t* destinationPixel = reinterpret_cast<uint32_t*>(dstPixelArray->data());
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float32x4_t deltaX = vdupq_n_f32(1.0 / dx);
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int pixelLine = strideLine / 4;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int pixelStride = stride / 4;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int y = 0; y < effectHeight; ++y) {
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int line = y * pixelLine;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        float32x4_t sum = vdupq_n_f32(0);
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Fill the kernel
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int maxKernelSize = std::min(dxRight, effectWidth);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (int i = 0; i < maxKernelSize; ++i) {
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            float32x4_t sourcePixelAsFloat = loadRGBA8AsFloat(sourcePixel + line + i * pixelStride);
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sum = vaddq_f32(sum, sourcePixelAsFloat);
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Blurring
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (int x = 0; x < effectWidth; ++x) {
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int pixelOffset = line + x * pixelStride;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            float32x4_t result = vmulq_f32(sum, deltaX);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            storeFloatAsRGBA8(result, destinationPixel + pixelOffset);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (x >= dxLeft) {
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                float32x4_t sourcePixelAsFloat = loadRGBA8AsFloat(sourcePixel + pixelOffset - dxLeft * pixelStride);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                sum = vsubq_f32(sum, sourcePixelAsFloat);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (x + dxRight < effectWidth) {
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                float32x4_t sourcePixelAsFloat = loadRGBA8AsFloat(sourcePixel + pixelOffset + dxRight * pixelStride);
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                sum = vaddq_f32(sum, sourcePixelAsFloat);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#endif // HAVE(ARM_NEON_INTRINSICS)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // FEGaussianBlurNEON_h
79