1 /* darken.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 darken : public frei0r::mixer2 28 { 29 public: darken(unsigned int width,unsigned int height)30 darken(unsigned int width, unsigned int height) 31 { 32 } 33 34 /** 35 * 36 * Perform a darken operation between sources in1 and in2, using 37 * the generalised algorithm: 38 * D_r = min(A_r, B_r); 39 * D_g = min(A_g, B_g); 40 * D_b = min(A_b, B_b); 41 * D_a = min(A_a, B_a); 42 * 43 **/ update(double time,uint32_t * out,const uint32_t * in1,const uint32_t * in2)44 void update(double time, 45 uint32_t* out, 46 const uint32_t* in1, 47 const uint32_t* in2) 48 { 49 const uint8_t *src1 = reinterpret_cast<const uint8_t*>(in1); 50 const uint8_t *src2 = reinterpret_cast<const uint8_t*>(in2); 51 uint8_t *dst = reinterpret_cast<uint8_t*>(out); 52 uint32_t sizeCounter = size; 53 54 uint32_t b; 55 uint8_t s1, s2; 56 57 while (sizeCounter--) 58 { 59 for (b = 0; b < ALPHA; b++) 60 { 61 s1 = src1[b]; 62 s2 = src2[b]; 63 dst[b] = MIN(s1,s2); 64 } 65 66 dst[ALPHA] = MIN(src1[ALPHA], src2[ALPHA]); 67 68 src1 += NBYTES; 69 src2 += NBYTES; 70 dst += NBYTES; 71 } 72 } 73 74 75 }; 76 77 78 frei0r::construct<darken> plugin("darken", 79 "Perform a darken operation between two sources (minimum value of both sources).", 80 "Jean-Sebastien Senecal", 81 0,2, 82 F0R_COLOR_MODEL_RGBA8888); 83 84