BitmapMixer.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2022, Tobias Christiansen <tobyase@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "BitmapMixer.h"
  7. namespace Gfx {
  8. void BitmapMixer::mix_with(Bitmap& other_bitmap, MixingMethod mixing_method)
  9. {
  10. VERIFY(m_bitmap.size() == other_bitmap.size());
  11. int height = m_bitmap.height();
  12. int width = m_bitmap.width();
  13. for (int y = 0; y < height; ++y) {
  14. for (int x = 0; x < width; ++x) {
  15. auto original_color = m_bitmap.get_pixel(x, y);
  16. auto other_color = other_bitmap.get_pixel(x, y);
  17. Color output_color = { 0, 0, 0, original_color.alpha() };
  18. switch (mixing_method) {
  19. case MixingMethod::Add:
  20. output_color.set_red(original_color.red() + other_color.red());
  21. output_color.set_green(original_color.green() + other_color.green());
  22. output_color.set_blue(original_color.blue() + other_color.blue());
  23. break;
  24. case MixingMethod::Lightest:
  25. auto original_lightness = original_color.red() + original_color.green() + original_color.blue();
  26. auto other_lightness = other_color.red() + other_color.green() + other_color.blue();
  27. if (original_lightness > other_lightness) {
  28. output_color = original_color;
  29. } else {
  30. output_color.set_red(other_color.red());
  31. output_color.set_green(other_color.green());
  32. output_color.set_blue(other_color.blue());
  33. }
  34. break;
  35. }
  36. if (original_color != output_color)
  37. m_bitmap.set_pixel(x, y, output_color);
  38. }
  39. }
  40. }
  41. }