1/* 2 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26#if !defined(JAVA2D_NO_MLIB) || defined(MLIB_ADD_SUFF) 27 28#include <vis_proto.h> 29#include "java2d_Mlib.h" 30 31/***************************************************************/ 32 33#define SET_PIX(index, chan) \ 34 pPix[chan] = pix##chan 35 36#define XOR_PIX(index, chan) \ 37 pPix[chan] ^= pix##chan 38 39/***************************************************************/ 40 41#define EXTRA_1(FUNC, ANYTYPE, NCHAN, DO_PIX) 42#define EXTRA_3(FUNC, ANYTYPE, NCHAN, DO_PIX) 43#define EXTRA_4(FUNC, ANYTYPE, NCHAN, DO_PIX) \ 44 if ((((jint)pPix | scan) & 3) == 0) { \ 45 mlib_s32 s_pixel = pixel, r_pixel; \ 46 *(mlib_f32*)&r_pixel = vis_ldfa_ASI_PL(&s_pixel); \ 47 ADD_SUFF(AnyInt##FUNC)(pRasInfo, x1, y1, r_pixel, steps, error, \ 48 bumpmajormask, errmajor, bumpminormask, \ 49 errminor, pPrim, pCompInfo); \ 50 return; \ 51 } 52 53/***************************************************************/ 54 55#define GET_PIXEL(pix) \ 56 mlib_s32 pix = pixel 57 58/***************************************************************/ 59 60#define DEFINE_SET_LINE(FUNC, ANYTYPE, NCHAN, DO_PIX) \ 61void ADD_SUFF(ANYTYPE##FUNC)(SurfaceDataRasInfo * pRasInfo, \ 62 jint x1, \ 63 jint y1, \ 64 jint pixel, \ 65 jint steps, \ 66 jint error, \ 67 jint bumpmajormask, \ 68 jint errmajor, \ 69 jint bumpminormask, \ 70 jint errminor, \ 71 NativePrimitive * pPrim, \ 72 CompositeInfo * pCompInfo) \ 73{ \ 74 ANYTYPE##DataType *pPix = (void *)(pRasInfo->rasBase); \ 75 mlib_s32 scan = pRasInfo->scanStride; \ 76 mlib_s32 bumpmajor, bumpminor, mask; \ 77 GET_PIXEL(pix); \ 78 EXTRACT_CONST_##NCHAN(pix); \ 79 \ 80 EXTRA_##NCHAN(FUNC, AnyInt, NCHAN, DO_PIX); \ 81 \ 82 PTR_ADD(pPix, y1 * scan + x1 * ANYTYPE##PixelStride); \ 83 \ 84 errminor += errmajor; \ 85 \ 86 if (bumpmajormask & 0x1) bumpmajor = ANYTYPE##PixelStride; else \ 87 if (bumpmajormask & 0x2) bumpmajor = -ANYTYPE##PixelStride; else \ 88 if (bumpmajormask & 0x4) bumpmajor = scan; else \ 89 bumpmajor = - scan; \ 90 \ 91 if (bumpminormask & 0x1) bumpminor = ANYTYPE##PixelStride; else \ 92 if (bumpminormask & 0x2) bumpminor = -ANYTYPE##PixelStride; else \ 93 if (bumpminormask & 0x4) bumpminor = scan; else \ 94 if (bumpminormask & 0x8) bumpminor = -scan; else \ 95 bumpminor = 0; \ 96 \ 97 if (errmajor == 0) { \ 98 do { \ 99 PROCESS_PIX_##NCHAN(DO_PIX); \ 100 PTR_ADD(pPix, bumpmajor); \ 101 } while (--steps > 0); \ 102 return; \ 103 } \ 104 \ 105 do { \ 106 PROCESS_PIX_##NCHAN(DO_PIX); \ 107 mask = error >> 31; \ 108 PTR_ADD(pPix, bumpmajor + (bumpminor &~ mask)); \ 109 error += errmajor - (errminor &~ mask); \ 110 } while (--steps > 0); \ 111} 112 113DEFINE_SET_LINE(SetLine, AnyInt, 1, SET_PIX) 114DEFINE_SET_LINE(SetLine, AnyShort, 1, SET_PIX) 115DEFINE_SET_LINE(SetLine, AnyByte, 1, SET_PIX) 116DEFINE_SET_LINE(SetLine, Any3Byte, 3, SET_PIX) 117DEFINE_SET_LINE(SetLine, Any4Byte, 4, SET_PIX) 118 119/***************************************************************/ 120 121#undef GET_PIXEL 122#define GET_PIXEL(pix) \ 123 mlib_s32 xorpixel = pCompInfo->details.xorPixel; \ 124 mlib_s32 alphamask = pCompInfo->alphaMask; \ 125 mlib_s32 pix = (pixel ^ xorpixel) &~ alphamask 126 127#undef EXTRA_4 128#define EXTRA_4(FUNC, ANYTYPE, NCHAN, DO_PIX) 129 130DEFINE_SET_LINE(XorLine, AnyInt, 1, XOR_PIX) 131DEFINE_SET_LINE(XorLine, AnyShort, 1, XOR_PIX) 132DEFINE_SET_LINE(XorLine, AnyByte, 1, XOR_PIX) 133DEFINE_SET_LINE(XorLine, Any3Byte, 3, XOR_PIX) 134DEFINE_SET_LINE(XorLine, Any4Byte, 4, XOR_PIX) 135 136/***************************************************************/ 137 138#endif 139