nuclear@12: /* nuclear@12: eqemu - electronic queue system emulator nuclear@12: Copyright (C) 2014 John Tsiombikas , nuclear@12: Eleni-Maria Stea nuclear@12: nuclear@12: This program is free software: you can redistribute it and/or modify nuclear@12: it under the terms of the GNU General Public License as published by nuclear@12: the Free Software Foundation, either version 3 of the License, or nuclear@12: (at your option) any later version. nuclear@12: nuclear@12: This program is distributed in the hope that it will be useful, nuclear@12: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@12: GNU General Public License for more details. nuclear@12: nuclear@12: You should have received a copy of the GNU General Public License nuclear@12: along with this program. If not, see . nuclear@12: */ nuclear@8: #include nuclear@8: #include nuclear@8: #include "fblur.h" nuclear@8: nuclear@8: #if defined(__i386__) || defined(__ia64__) || defined(WIN32) || \ nuclear@8: (defined(__alpha__) || defined(__alpha)) || \ nuclear@8: defined(__arm__) || \ nuclear@8: (defined(__mips__) && defined(__MIPSEL__)) || \ nuclear@8: defined(__SYMBIAN32__) || \ nuclear@8: defined(__x86_64__) || \ nuclear@8: defined(__LITTLE_ENDIAN__) nuclear@8: #define FBLUR_LITTLE_ENDIAN nuclear@8: #else nuclear@8: #define FBLUR_BIG_ENDIAN nuclear@8: #endif nuclear@8: nuclear@8: /* some color packing/unpacking macros */ nuclear@8: #ifdef FBLUR_BIG_ENDIAN nuclear@8: #define RSHIFT 24 nuclear@8: #define GSHIFT 16 nuclear@8: #define BSHIFT 8 nuclear@8: #else /* little endian */ nuclear@8: #define RSHIFT 0 nuclear@8: #define GSHIFT 8 nuclear@8: #define BSHIFT 16 nuclear@8: #endif nuclear@8: nuclear@8: #define RED(p) (((p) >> RSHIFT) & 0xff) nuclear@8: #define GREEN(p) (((p) >> GSHIFT) & 0xff) nuclear@8: #define BLUE(p) (((p) >> BSHIFT) & 0xff) nuclear@8: #define RGB(r, g, b) \ nuclear@8: ((((r) & 0xff) << RSHIFT) | \ nuclear@8: (((g) & 0xff) << GSHIFT) | \ nuclear@8: (((b) & 0xff) << BSHIFT)) nuclear@8: nuclear@8: #define MIN(a, b) ((a) < (b) ? (a) : (b)) nuclear@8: #define MAX(a, b) ((a) > (b) ? (a) : (b)) nuclear@8: nuclear@8: nuclear@8: void fast_blur(int dir, int amount, uint32_t *buf, int x, int y) nuclear@8: { nuclear@8: int i, j, half; nuclear@8: uint32_t *dptr, *sptr, *tmp_buf; nuclear@8: nuclear@8: int blur_len = dir == BLUR_HORIZ ? x : y; nuclear@8: int blur_times = dir == BLUR_HORIZ ? y : x; nuclear@8: nuclear@8: if(amount <= 1) return; nuclear@8: nuclear@8: dptr = buf; nuclear@8: half = amount / 2; nuclear@8: nuclear@8: tmp_buf = (uint32_t*)alloca(blur_len * sizeof(uint32_t)); nuclear@8: nuclear@8: for(i=0; i half) { nuclear@8: uint32_t out = *(sptr - half - 1); nuclear@8: ar -= RED(out); nuclear@8: ag -= GREEN(out); nuclear@8: ab -= BLUE(out); nuclear@8: divisor--; nuclear@8: } nuclear@8: nuclear@8: if(j < blur_len - half) { nuclear@8: uint32_t in = *(sptr + half); nuclear@8: ar += RED(in); nuclear@8: ag += GREEN(in); nuclear@8: ab += BLUE(in); nuclear@8: divisor++; nuclear@8: } nuclear@8: nuclear@8: r = ar / divisor; nuclear@8: g = ag / divisor; nuclear@8: b = ab / divisor; nuclear@8: nuclear@8: r = MAX(MIN(r, 255), 0); nuclear@8: g = MAX(MIN(g, 255), 0); nuclear@8: b = MAX(MIN(b, 255), 0); nuclear@8: nuclear@8: *dptr = RGB(r, g, b); nuclear@8: dptr += dir == BLUR_HORIZ ? 1 : x; nuclear@8: sptr++; nuclear@8: } nuclear@8: nuclear@8: } nuclear@8: nuclear@8: if(dir == BLUR_BOTH) { nuclear@8: fast_blur(BLUR_HORIZ, amount, buf, x, y); nuclear@8: } nuclear@8: }