1 /* screen.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 screen : public frei0r::mixer2 28 { 29 public: screen(unsigned int width,unsigned int height)30 screen(unsigned int width, unsigned int height) 31 { 32 } 33 34 /** 35 * 36 * Perform an RGB[A] screen operation between the pixel sources 37 * in1 and in2, using the generalised algorithm: 38 * 39 * D = 255 - (255 - A) * (255 - B) 40 * 41 **/ update(double time,uint32_t * out,const uint32_t * in1,const uint32_t * in2)42 void update(double time, 43 uint32_t* out, 44 const uint32_t* in1, 45 const uint32_t* in2) 46 { 47 const uint8_t *src1 = reinterpret_cast<const uint8_t*>(in1); 48 const uint8_t *src2 = reinterpret_cast<const uint8_t*>(in2); 49 uint8_t *dst = reinterpret_cast<uint8_t*>(out); 50 uint32_t sizeCounter = size; 51 52 uint32_t b, tmp; 53 54 while (sizeCounter--) 55 { 56 for (b = 0; b < ALPHA; b++) 57 dst[b] = 255 - INT_MULT((255 - src1[b]), (255 - src2[b]), tmp); 58 59 dst[ALPHA] = MIN(src1[ALPHA], src2[ALPHA]); 60 61 src1 += NBYTES; 62 src2 += NBYTES; 63 dst += NBYTES; 64 } 65 } 66 67 68 69 }; 70 71 72 frei0r::construct<screen> plugin("screen", 73 "Perform an RGB[A] screen operation between the pixel sources, using the generalised algorithm:\n" 74 "D = 255 - (255 - A) * (255 - B)", 75 "Jean-Sebastien Senecal", 76 0,2, 77 F0R_COLOR_MODEL_RGBA8888); 78 79