mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
add copy_channel
This commit is contained in:
parent
29ad1a585c
commit
340aafea67
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user