mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -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
|
// Function: PNMImage::render_spot
|
||||||
// Access: Published
|
// Access: Published
|
||||||
|
@ -203,6 +203,9 @@ PUBLISHED:
|
|||||||
int xfrom = 0, int yfrom = 0,
|
int xfrom = 0, int yfrom = 0,
|
||||||
int x_size = -1, int y_size = -1,
|
int x_size = -1, int y_size = -1,
|
||||||
double pixel_scale = 1.0);
|
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,
|
void render_spot(const Colord &fg, const Colord &bg,
|
||||||
double min_radius, double max_radius);
|
double min_radius, double max_radius);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user