Codebase list splix / debian/1.0.1-1 src / bandanalyser.cpp
debian/1.0.1-1

Tree @debian/1.0.1-1 (Download .tar.gz)

bandanalyser.cpp @debian/1.0.1-1raw · history · blame

/*
 * 	bandanalyser.cpp		(C) 2006, Aurélien Croc (AP²C)
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; version 2 of the License.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the
 *  Free Software Foundation, Inc.,
 *  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 *  $Id: bandanalyser.cpp 60 2006-12-14 01:03:17Z ap2c $
 *
 */
#include "bandanalyser.h"
#include "band.h"
#include "error.h"


/*
 * Vérification si les bandes sont vides
 * Check if bands are empty
 */
void checkEmptyBand(Band *band)
{
	const unsigned char *data;
	size_t i, size, last;
	unsigned char c;

	data = band->band();
	size = (band->width() * band->height() + 7) >> 3;
	last = size % sizeof(unsigned long);
	size -= last;

	for (i=0; i < size; i += sizeof(unsigned long))
	       if (~*((unsigned long *)&data[i]) != 0) {
		       return;
	       }
	for (; i < last + size; i++) {
		c = ~data[i];
		if (c != 0)
			return;
	}
	band->setEmpty();
}

void correctBlackColor(Band *bandC, Band *bandM, Band *bandY, Band *bandB)
{
	unsigned char *cyan, *magenta, *yellow, *black;
	unsigned long i;
	size_t size, last;

	cyan = bandC->band();
	magenta = bandM->band();
	yellow = bandY->band();
	black = bandB->band();

	size = (bandC->width() * bandC->height() + 7) >> 3;
	last = size % sizeof(unsigned long);
	size -= last;

	for (i=0; i < size; i += sizeof(unsigned long)) {
		unsigned long mask;

		mask = *((unsigned long *)&cyan[i]) | 
			*((unsigned long *)&magenta[i]) | 
			*((unsigned long *)&yellow[i]);
		if (~mask == 0)
			continue;
		
		*((unsigned long *)&cyan[i]) |= ~mask;
		*((unsigned long *)&magenta[i]) |= ~mask;
		*((unsigned long *)&yellow[i]) |= ~mask;
		*((unsigned long *)&black[i]) &= mask;
	}
	
	for (; i < last + size; i++) {
		unsigned char mask;

		mask = cyan[i] | magenta[i] | yellow[i];
		if (mask == 0xFF)
			continue;
		cyan[i] |= ~mask;
		magenta[i] |= ~mask;
		yellow[i] |= ~mask;
		black[i] &= mask;
	}
}