Extended to dither each RGB channel separately.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6407 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Pfeiffer 2004-01-29 18:47:58 +00:00
parent fc2f5c4f98
commit aa36fbce3a
2 changed files with 40 additions and 1 deletions

View File

@ -24,6 +24,12 @@ public:
TYPE2,
TYPE3
};
enum GrayFunction {
kMixToGray,
kRedChannel,
kGreenChannel,
kBlueChannel
};
Halftone(color_space cs, double gamma = 1.4, DITHERTYPE dither_type = TYPE3);
~Halftone();
int dither(uchar *dst, const uchar *src, int x, int y, int width);
@ -33,6 +39,7 @@ public:
void setPattern(const uchar *pattern);
PFN_gray getGrayFunction() const;
void setGrayFunction(PFN_gray gray);
void setGrayFunction(GrayFunction grayFunction);
protected:
void createGammaTable(double gamma);

View File

@ -18,7 +18,7 @@ using namespace std;
#include "Pattern.h"
uint gray(rgb_color c)
static uint gray(rgb_color c)
{
if (c.red == c.green && c.red == c.blue) {
return 255 - c.red;
@ -27,6 +27,21 @@ uint gray(rgb_color c)
}
}
static uint channel_red(rgb_color c)
{
return c.red;
}
static uint channel_green(rgb_color c)
{
return c.green;
}
static uint channel_blue(rgb_color c)
{
return c.blue;
}
Halftone::Halftone(color_space cs, double gamma, DITHERTYPE dither_type)
{
__pixel_depth = color_space2pixel_depth(cs);
@ -108,6 +123,23 @@ int Halftone::dither(
return (this->*__dither)(dst, src, x, y, width);
}
void Halftone::setGrayFunction(GrayFunction grayFunction)
{
PFN_gray function = NULL;
switch (grayFunction) {
case kMixToGray: function = gray;
break;
case kRedChannel: function = channel_red;
break;
case kGreenChannel: function = channel_green;
break;
case kBlueChannel: function = channel_blue;
break;
};
setGrayFunction(function);
}
int Halftone::ditherGRAY1(
uchar *dst,
const uchar *src,