1 /* 2 * imagesource_desaturate.cpp 3 * 4 * Supports Greyscale and RGB data 5 * Supports random access 6 * 7 * Copyright (c) 2007 by Alastair M. Robinson 8 * Distributed under the terms of the GNU General Public License - 9 * see the file named "COPYING" for more details. 10 * 11 * TODO: Support CMYK Data 12 * 13 */ 14 15 #include <iostream> 16 #include <stdlib.h> 17 #include <string.h> 18 #include <math.h> 19 20 #include "imagesource_desaturate.h" 21 22 using namespace std; 23 ~ImageSource_Desaturate()24ImageSource_Desaturate::~ImageSource_Desaturate() 25 { 26 if(source) 27 delete source; 28 } 29 30 GetRow(int row)31ISDataType *ImageSource_Desaturate::GetRow(int row) 32 { 33 if(row==currentrow) 34 return(rowbuffer); 35 36 ISDataType *srcdata=source->GetRow(row); 37 38 switch(type) 39 { 40 case IS_TYPE_GREY: 41 case IS_TYPE_GREYA: 42 // Grey images are already desaturated by definition 43 // so no-op. 44 return(srcdata); 45 break; 46 case IS_TYPE_RGB: 47 { 48 for(int s=0;s<width*samplesperpixel;s+=samplesperpixel) 49 { 50 int t=(srcdata[s]+srcdata[s+1]+srcdata[s+2])/3; 51 rowbuffer[s]=rowbuffer[s+1]=rowbuffer[s+2]=t; 52 } 53 } 54 break; 55 case IS_TYPE_RGBA: 56 { 57 for(int s=0;s<width*samplesperpixel;s+=samplesperpixel) 58 { 59 int t=(srcdata[s]+srcdata[s+1]+srcdata[s+2])/3; 60 rowbuffer[s]=rowbuffer[s+1]=rowbuffer[s+2]=t; 61 rowbuffer[s+3]=srcdata[s+3]; 62 } 63 } 64 break; 65 default: 66 throw "Desaturate: type not (yet) handled"; 67 } 68 69 currentrow=row; 70 71 return(rowbuffer); 72 } 73 74 ImageSource_Desaturate(ImageSource * source)75ImageSource_Desaturate::ImageSource_Desaturate(ImageSource *source) 76 : ImageSource(source), source(source) 77 { 78 if(STRIP_ALPHA(source->type)==IS_TYPE_CMYK) 79 throw "Desaturate: CMYK Images not yet supported."; 80 81 MakeRowBuffer(); 82 } 83