bool BlpBlend(const image::buffer& input_a, const image::buffer& input_b, image::buffer& output) { unsigned int input_width = 0; unsigned int input_height = 0; image::pixels input_a_pic, input_b_pic, output_pic; if (!image::blp::read(input_a, input_a_pic, &input_width, &input_height)) { return false; } if (input_width != kBlpSize || input_height != kBlpSize) { return false; } if (!image::blp::read(input_b, input_b_pic, &input_width, &input_height)) { return false; } if (input_width != kBlpSize || input_height != kBlpSize) { return false; } output_pic.resize(kBlpSize * kBlpSize); image::rgba* ptr = output_pic.data(); for (size_t i = 0; i < kBlpSize * kBlpSize; ++i) { image::rgba const& pixel_a = input_a_pic[i]; image::rgba const& pixel_b = input_b_pic[i]; ptr->r = clamp_channel_bits8(((255 - pixel_a.a) * pixel_b.r + pixel_a.a * pixel_a.r) / 255); ptr->g = clamp_channel_bits8(((255 - pixel_a.a) * pixel_b.g + pixel_a.a * pixel_a.g) / 255); ptr->b = clamp_channel_bits8(((255 - pixel_a.a) * pixel_b.b + pixel_a.a * pixel_a.b) / 255); ptr->a = clamp_channel_bits8(255 - (255 - pixel_a.a) * (255 - pixel_b.a) / 255); ptr++; } if (!image::blp::write(output_pic, output, kBlpSize, kBlpSize, 95)) { return false; } return true; }
boost::uint8_t operator()(int alpha_a, int alpha_b) const { return clamp_channel_bits8(alpha_a + alpha_b - alpha_a * alpha_b / 255); }
boost::uint8_t operator()(int channel_a, int channel_b, int alpha_a, int alpha_b) const { return clamp_channel_bits8(channel_a + channel_b * (255 - alpha_a) / 255); }
boost::uint8_t operator()(int channel_a, int channel_b) const { return clamp_channel_bits8(k1_ * channel_a * channel_b / 65535 + k2_ * channel_a / 255 + k3_ * channel_b / 255 + k4_); }
boost::uint8_t operator()(int channel_a, int channel_b, int alpha_a, int alpha_b) const { return clamp_channel_bits8((channel_a * alpha_a * (255 - alpha_b) + channel_b * alpha_b * (255 - alpha_a)) / 65535); }