Path: blob/master/src/java.desktop/share/native/libmlib_image/mlib_ImageAffine_NN.c
41152 views
/*1* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/242526/*27* FUNCTION28* Internal functions for mlib_ImageAffine with Nearest Neighbor filtering.29*/3031#include "mlib_ImageAffine.h"3233/***************************************************************/34#define sp srcPixelPtr35#define dp dstPixelPtr3637/***************************************************************/38#undef DTYPE39#define DTYPE mlib_s324041#ifdef _MSC_VER42/* Workaround for MSC optimizer bug (known affected versions4312.00.8168-12.00.8804). See bug 4893435 for details. */44#pragma optimize("gs", off)45#endif /* _MSC_VER */46#ifdef i386 /* do not perform the coping by mlib_d64 data type for x86 */4748mlib_status mlib_ImageAffine_s32_1ch_nn(mlib_affine_param *param)49{50DECLAREVAR();51DTYPE *srcPixelPtr;52DTYPE *dstLineEnd;5354for (j = yStart; j <= yFinish; j++) {55CLIP(1);56dstLineEnd = (DTYPE *) dstData + xRight;5758for (; dp <= dstLineEnd; dp++) {59sp = S_PTR(Y) + (X >> MLIB_SHIFT);60dp[0] = sp[0];6162X += dX;63Y += dY;64}65}6667return MLIB_SUCCESS;68}6970#else7172mlib_status mlib_ImageAffine_s32_1ch_nn(mlib_affine_param *param)73{74DECLAREVAR();75DTYPE *srcPixelPtr;76mlib_s32 i, size;7778for (j = yStart; j <= yFinish; j++) {79d64_2x32 dd;8081CLIP(1);82size = xRight - xLeft + 1;8384if ((mlib_addr) dp & 7) {85sp = S_PTR(Y);86*dp++ = sp[X >> MLIB_SHIFT];87X += dX;88Y += dY;89size--;90}9192for (i = 0; i <= (size - 2); i += 2) {93mlib_f32 *sp0, *sp1;9495sp0 = (mlib_f32 *) S_PTR(Y);96sp1 = (mlib_f32 *) S_PTR(Y + dY);9798dd.f32s.f0 = sp0[X >> MLIB_SHIFT];99dd.f32s.f1 = sp1[(X + dX) >> MLIB_SHIFT];100101*(mlib_d64 *) dp = dd.d64;102103dp += 2;104X += 2 * dX;105Y += 2 * dY;106}107108if (size & 1) {109sp = S_PTR(Y);110*dp = sp[X >> MLIB_SHIFT];111}112}113114return MLIB_SUCCESS;115}116117#endif /* i386 ( do not perform the coping by mlib_d64 data type for x86 ) */118119/***************************************************************/120mlib_status mlib_ImageAffine_s32_2ch_nn(mlib_affine_param *param)121{122DECLAREVAR();123DTYPE *srcPixelPtr;124DTYPE *dstLineEnd;125126for (j = yStart; j <= yFinish; j++) {127CLIP(2);128dstLineEnd = (DTYPE *) dstData + 2 * xRight;129130for (; dp <= dstLineEnd; dp += 2) {131sp = S_PTR(Y) + 2 * (X >> MLIB_SHIFT);132dp[0] = sp[0];133dp[1] = sp[1];134135X += dX;136Y += dY;137}138}139140return MLIB_SUCCESS;141}142143/***************************************************************/144mlib_status mlib_ImageAffine_s32_3ch_nn(mlib_affine_param *param)145{146DECLAREVAR();147DTYPE *srcPixelPtr;148DTYPE *dstLineEnd;149150for (j = yStart; j <= yFinish; j++) {151CLIP(3);152dstLineEnd = (DTYPE *) dstData + 3 * xRight;153154for (; dp <= dstLineEnd; dp += 3) {155sp = S_PTR(Y) + 3 * (X >> MLIB_SHIFT);156dp[0] = sp[0];157dp[1] = sp[1];158dp[2] = sp[2];159160X += dX;161Y += dY;162}163}164165return MLIB_SUCCESS;166}167168/***************************************************************/169mlib_status mlib_ImageAffine_s32_4ch_nn(mlib_affine_param *param)170{171DECLAREVAR();172DTYPE *srcPixelPtr;173DTYPE *dstLineEnd;174175for (j = yStart; j <= yFinish; j++) {176CLIP(4);177dstLineEnd = (DTYPE *) dstData + 4 * xRight;178179for (; dp <= dstLineEnd; dp += 4) {180sp = S_PTR(Y) + 4 * (X >> MLIB_SHIFT);181dp[0] = sp[0];182dp[1] = sp[1];183dp[2] = sp[2];184dp[3] = sp[3];185186X += dX;187Y += dY;188}189}190191return MLIB_SUCCESS;192}193194/***************************************************************/195#undef DTYPE196#define DTYPE mlib_d64197198mlib_status mlib_ImageAffine_d64_1ch_nn(mlib_affine_param *param)199{200DECLAREVAR();201DTYPE *srcPixelPtr;202DTYPE *dstLineEnd;203204for (j = yStart; j <= yFinish; j++) {205CLIP(1);206dstLineEnd = (DTYPE *) dstData + xRight;207208for (; dp <= dstLineEnd; dp++) {209sp = S_PTR(Y);210dp[0] = sp[X >> MLIB_SHIFT];211212X += dX;213Y += dY;214}215}216217return MLIB_SUCCESS;218}219220/***************************************************************/221mlib_status mlib_ImageAffine_d64_2ch_nn(mlib_affine_param *param)222{223DECLAREVAR();224DTYPE *srcPixelPtr;225DTYPE *dstLineEnd;226227for (j = yStart; j <= yFinish; j++) {228CLIP(2);229dstLineEnd = (DTYPE *) dstData + 2 * xRight;230231for (; dp <= dstLineEnd; dp += 2) {232sp = S_PTR(Y) + 2 * (X >> MLIB_SHIFT);233dp[0] = sp[0];234dp[1] = sp[1];235236X += dX;237Y += dY;238}239}240241return MLIB_SUCCESS;242}243244/***************************************************************/245mlib_status mlib_ImageAffine_d64_3ch_nn(mlib_affine_param *param)246{247DECLAREVAR();248DTYPE *srcPixelPtr;249DTYPE *dstLineEnd;250251for (j = yStart; j <= yFinish; j++) {252CLIP(3);253dstLineEnd = (DTYPE *) dstData + 3 * xRight;254255for (; dp <= dstLineEnd; dp += 3) {256sp = S_PTR(Y) + 3 * (X >> MLIB_SHIFT);257dp[0] = sp[0];258dp[1] = sp[1];259dp[2] = sp[2];260261X += dX;262Y += dY;263}264}265266return MLIB_SUCCESS;267}268269/***************************************************************/270mlib_status mlib_ImageAffine_d64_4ch_nn(mlib_affine_param *param)271{272DECLAREVAR();273DTYPE *srcPixelPtr;274DTYPE *dstLineEnd;275276for (j = yStart; j <= yFinish; j++) {277CLIP(4);278dstLineEnd = (DTYPE *) dstData + 4 * xRight;279280for (; dp <= dstLineEnd; dp += 4) {281sp = S_PTR(Y) + 4 * (X >> MLIB_SHIFT);282dp[0] = sp[0];283dp[1] = sp[1];284dp[2] = sp[2];285dp[3] = sp[3];286287X += dX;288Y += dY;289}290}291292return MLIB_SUCCESS;293}294295/***************************************************************/296#ifdef _MSC_VER297/* Workaround for MSC optimizer bug (known affected versions29812.00.8168-12.00.8804). See bug 4893435 for details. */299#pragma optimize("gs", on)300#endif /* _MSC_VER */301302303