Image.java 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package me.hammerle.supersnuvi.javafx;
  2. import javafx.scene.image.PixelReader;
  3. import javafx.scene.image.PixelWriter;
  4. public abstract class Image
  5. {
  6. private javafx.scene.image.Image[] colored;
  7. private int slot = -1;
  8. public Image()
  9. {
  10. colored = new javafx.scene.image.Image[0];
  11. }
  12. public void bindSlot(int slot)
  13. {
  14. this.slot = slot;
  15. }
  16. public void createSlot(int r, int g, int b, int alpha)
  17. {
  18. if(getImage() == null)
  19. {
  20. return;
  21. }
  22. javafx.scene.image.Image[] newColored = new javafx.scene.image.Image[colored.length + 1];
  23. System.arraycopy(colored, 0, newColored, 0, colored.length);
  24. javafx.scene.image.Image image = getImage();
  25. PixelReader reader = image.getPixelReader();
  26. int w = (int) image.getWidth();
  27. int h = (int) image.getHeight();
  28. javafx.scene.image.WritableImage wi = new javafx.scene.image.WritableImage(w, h);
  29. PixelWriter writer = wi.getPixelWriter();
  30. newColored[colored.length] = wi;
  31. colored = newColored;
  32. int argb = (alpha << 24) | (r << 16) | (g << 8) | b;
  33. for(int x = 0; x < w; x++)
  34. {
  35. for(int y = 0; y < h; y++)
  36. {
  37. writer.setArgb(x, y, mixColor(reader.getArgb(x, y), r, g, b, alpha));
  38. }
  39. }
  40. }
  41. private int mixColor(int argb, int r, int g, int b, int alpha)
  42. {
  43. if(argb == 0)
  44. {
  45. return 0;
  46. }
  47. int br = (((argb >> 16) & 0xFF) + r) >> 1;
  48. int bg = (((argb >> 8) & 0xFF) + g) >> 1;
  49. int bb = ((argb & 0xFF) + b) >> 1;
  50. int ba = (((argb >> 24) & 0xFF) + alpha) >> 1;
  51. return (ba << 24) | (br << 16) | (bg << 8) | bb;
  52. }
  53. protected final javafx.scene.image.Image getImageSlot()
  54. {
  55. if(slot < 0 || slot >= colored.length)
  56. {
  57. return getImage();
  58. }
  59. return colored[slot];
  60. }
  61. protected abstract javafx.scene.image.Image getImage();
  62. public abstract double getWidth();
  63. public abstract double getHeight();
  64. }