1 /* divide.cpp 2 * Copyright (C) 2006 Jean-Sebastien Senecal (js@drone.ws) 3 * This file is a Frei0r plugin. 4 * The code is a modified version of code from the Gimp. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 */ 20 21 #include "frei0r.hpp" 22 #include "frei0r_math.h" 23 24 #define NBYTES 4 25 #define ALPHA 3 26 27 class divide : public frei0r::mixer2 28 { 29 public: divide(unsigned int width,unsigned int height)30 divide(unsigned int width, unsigned int height) 31 { 32 } 33 34 /** 35 * 36 * Perform an RGB[A] divide operation between the pixel sources in1 37 * and in2. in1 is the numerator, in2 the denominator. 38 * 39 **/ update(double time,uint32_t * out,const uint32_t * in1,const uint32_t * in2)40 void update(double time, 41 uint32_t* out, 42 const uint32_t* in1, 43 const uint32_t* in2) 44 { 45 const uint8_t *src1 = reinterpret_cast<const uint8_t*>(in1); 46 const uint8_t *src2 = reinterpret_cast<const uint8_t*>(in2); 47 uint8_t *dst = reinterpret_cast<uint8_t*>(out); 48 uint32_t sizeCounter = size; 49 50 uint32_t b, result; 51 52 while (sizeCounter--) 53 { 54 for (b = 0; b < ALPHA; b++) 55 { 56 result = ((src1[b] * 256) / (1 + src2[b])); 57 dst[b] = MIN(result, 255u); 58 } 59 60 dst[ALPHA] = MIN(src1[ALPHA], src2[ALPHA]); 61 62 src1 += NBYTES; 63 src2 += NBYTES; 64 dst += NBYTES; 65 } 66 } 67 68 69 70 }; 71 72 73 frei0r::construct<divide> plugin("divide", 74 "Perform an RGB[A] divide operation between the pixel sources: input1 is the numerator, input2 the denominator", 75 "Jean-Sebastien Senecal", 76 0,2, 77 F0R_COLOR_MODEL_RGBA8888); 78 79