Commit 161efd59 authored by twanvl's avatar twanvl

AlphaMask combines alphas instead of overwriting

parent 68aac879
...@@ -87,6 +87,24 @@ void set_alpha(Image& img, const Image& img_alpha) { ...@@ -87,6 +87,24 @@ void set_alpha(Image& img, const Image& img_alpha) {
} }
} }
void set_alpha(Image& img, Byte* al, const wxSize& alpha_size) {
if (img.GetWidth() != alpha_size.GetWidth() || img.GetHeight() != alpha_size.GetHeight()) {
throw Error(_("Image must have same size as mask"));
}
if (!img.HasAlpha()) {
// copy
img.InitAlpha();
memcpy(img.GetAlpha(), al, img.GetWidth() * img.GetHeight());
} else{
// merge
Byte *im = img.GetAlpha();
size_t size = img.GetWidth() * img.GetHeight();
for (size_t i = 0 ; i < size ; ++i) {
im[i] = (im[i] * al[i]) / 255;
}
}
}
void set_alpha(Image& img, double alpha) { void set_alpha(Image& img, double alpha) {
Byte b_alpha = alpha * 255; Byte b_alpha = alpha * 255;
if (!img.HasAlpha()) { if (!img.HasAlpha()) {
......
...@@ -130,6 +130,8 @@ void draw_combine_image(DC& dc, UInt x, UInt y, const Image& img, ImageCombine c ...@@ -130,6 +130,8 @@ void draw_combine_image(DC& dc, UInt x, UInt y, const Image& img, ImageCombine c
/// Use the red channel of img_alpha as alpha channel for img /// Use the red channel of img_alpha as alpha channel for img
void set_alpha(Image& img, const Image& img_alpha); void set_alpha(Image& img, const Image& img_alpha);
/// Use the given bytes as alpha channel for img
void set_alpha(Image& img, Byte* alphas, const wxSize& alphas_size);
/// Set the transparency of img /// Set the transparency of img
void set_alpha(Image& img, double alpha); void set_alpha(Image& img, double alpha);
......
...@@ -30,11 +30,7 @@ AlphaMask::~AlphaMask() { ...@@ -30,11 +30,7 @@ AlphaMask::~AlphaMask() {
} }
void AlphaMask::setAlpha(Image& img) const { void AlphaMask::setAlpha(Image& img) const {
if (img.GetWidth() != size.GetWidth() || img.GetHeight() != size.GetHeight()) { set_alpha(img, alpha, size);
throw InternalError(_("Image used with maks must have same size as mask"));
}
if (!img.HasAlpha()) img.InitAlpha();
memcpy(img.GetAlpha(), alpha, size.GetWidth() * size.GetHeight());
} }
void AlphaMask::setAlpha(Bitmap& bmp) const { void AlphaMask::setAlpha(Bitmap& bmp) const {
......
...@@ -126,6 +126,10 @@ void resample(const Image& img_in, Image& img_out) { ...@@ -126,6 +126,10 @@ void resample(const Image& img_in, Image& img_out) {
} }
void resample_and_clip(const Image& img_in, Image& img_out, wxRect rect) { void resample_and_clip(const Image& img_in, Image& img_out, wxRect rect) {
// mask to alpha
if (img_in.HasMask() && !img_in.HasAlpha()) {
const_cast<Image&>(img_in).InitAlpha();
}
// starting position in data // starting position in data
int offset_in = (rect.x + img_in.GetWidth() * rect.y); int offset_in = (rect.x + img_in.GetWidth() * rect.y);
if (img_out.GetHeight() == rect.height) { if (img_out.GetHeight() == rect.height) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment