From 340aafea6720e684a884c5f8da9762d033f2dad0 Mon Sep 17 00:00:00 2001 From: David Rose Date: Sun, 8 Nov 2009 03:11:32 +0000 Subject: [PATCH] add copy_channel --- panda/src/pnmimage/pnmImage.cxx | 53 +++++++++++++++++++++++++++++++++ panda/src/pnmimage/pnmImage.h | 3 ++ 2 files changed, 56 insertions(+) diff --git a/panda/src/pnmimage/pnmImage.cxx b/panda/src/pnmimage/pnmImage.cxx index b4b27a2e02..a65bd8805e 100644 --- a/panda/src/pnmimage/pnmImage.cxx +++ b/panda/src/pnmimage/pnmImage.cxx @@ -900,6 +900,59 @@ lighten_sub_image(const PNMImage ©, 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 ©, 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 diff --git a/panda/src/pnmimage/pnmImage.h b/panda/src/pnmimage/pnmImage.h index ff3b180653..f5a7fdcbf8 100644 --- a/panda/src/pnmimage/pnmImage.h +++ b/panda/src/pnmimage/pnmImage.h @@ -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 ©, 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);