add copy_channel

This commit is contained in:
David Rose 2009-11-08 03:11:32 +00:00
parent 29ad1a585c
commit 340aafea67
2 changed files with 56 additions and 0 deletions

View File

@ -900,6 +900,59 @@ lighten_sub_image(const PNMImage &copy, int xto, int yto,
}
}
////////////////////////////////////////////////////////////////////
// Function: PNMImage::copy_channel
// Access: Published
// Description: Copies just a single channel from the source image
// into a single channel of this image, leaving the
// remaining channels alone.
////////////////////////////////////////////////////////////////////
void PNMImage::
copy_channel(const PNMImage &copy, int xto, int yto, int cto,
int xfrom, int yfrom, int cfrom,
int x_size, int y_size) {
int xmin, ymin, xmax, ymax;
setup_sub_image(copy, xto, yto, xfrom, yfrom, x_size, y_size,
xmin, ymin, xmax, ymax);
if (get_maxval() == copy.get_maxval()) {
// The simple case: no pixel value rescaling is required.
int x, y;
for (y = ymin; y < ymax; y++) {
if (cto == 3 && cfrom == 3) {
// To alpha channel, from alpha channel.
for (x = xmin; x < xmax; x++) {
set_alpha_val(x, y, copy.get_alpha_val(x - xmin + xfrom, y - ymin + yfrom));
}
} else if (cto == 3 && cfrom == 0) {
// To alpha channel, from blue (or gray) channel.
for (x = xmin; x < xmax; x++) {
set_alpha_val(x, y, copy.get_blue_val(x - xmin + xfrom, y - ymin + yfrom));
}
} else if (cto == 0 && cfrom == 3) {
// To blue (or gray) channel, from alpha channel.
for (x = xmin; x < xmax; x++) {
set_blue_val(x, y, copy.get_alpha_val(x - xmin + xfrom, y - ymin + yfrom));
}
} else {
// Generic channels.
for (x = xmin; x < xmax; x++) {
set_channel_val(x, y, cto, copy.get_channel_val(x - xmin + xfrom, y - ymin + yfrom, cfrom));
}
}
}
} else {
// The harder case: rescale pixel values according to maxval.
int x, y;
for (y = ymin; y < ymax; y++) {
for (x = xmin; x < xmax; x++) {
set_channel(x, y, cto, copy.get_channel(x - xmin + xfrom, y - ymin + yfrom, cfrom));
}
}
}
}
////////////////////////////////////////////////////////////////////
// Function: PNMImage::render_spot
// Access: Published

View File

@ -203,6 +203,9 @@ PUBLISHED:
int xfrom = 0, int yfrom = 0,
int x_size = -1, int y_size = -1,
double pixel_scale = 1.0);
void copy_channel(const PNMImage &copy, int xto, int yto, int cto,
int xfrom = 0, int yfrom = 0, int cfrom = 0,
int x_size = -1, int y_size = -1);
void render_spot(const Colord &fg, const Colord &bg,
double min_radius, double max_radius);