An argument for using enums as PConstants, or how to get round it in JRubyArt

In the vanilla processing example, there is much repetition of code in a if/else chain to achieve, what is done more simply with an array and a hash. If only processing PConstants were java enums, it could be much neater in vanilla processing. JRubyArt 57 lines of code, vanilla processing 83 lines of code.

# Blending
# by Andres Colubri. Somewhat refactored for JRubyArt by Martin Prout could be
# much better in java if PConstants were enums (we use a ruby hash here)
# Images can be blended using one of the 10 blending modes
# (currently available only in P2D and P3).
# Click to go to cycle through the modes.
#

# NOTE: THIS EXAMPLE IS IN PROGRESS -- REAS

attr_reader :img1, :img2, :pic_alpha, :sel_mode, :idx
# avoid the lengthy if/else chain of the original by using array and hash
NAMES = %w[
  REPLACE BLEND ADD SUBTRACT LIGHTEST DARKEST DIFFERENCE EXCLUSION MULTIPLY SCREEN
].freeze
VALUES = [
  REPLACE, BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, DIFFERENCE, EXCLUSION, MULTIPLY
]
FILTERS = VALUES.zip(NAMES).to_h

def setup
  sketch_title 'Blending'
  @img1 = load_image(data_path('layer1.jpg'))
  @img2 = load_image(data_path('layer2.jpg'))
  noStroke
  @idx = -1
  @sel_mode = VALUES.first
end

def draw
  @pic_alpha = (map1d(mouse_x, (0..width), (0..255))).to_i
  background(0)
  tint(255, 255)
  image(img1, 0, 0)
  blend_mode(sel_mode)
  tint(255, pic_alpha)
  image(img2, 0, 0)
  blend_mode(REPLACE)
  fill(255)
  rect(0, 0, 94, 22)
  fill(0)
  text(FILTERS.fetch(sel_mode, 'REPLACE'), 10, 15)
end

def mouse_pressed
  @idx = (idx == VALUES.length) ? 0 : idx + 1
  @sel_mode = VALUES[idx]
end

def mouse_dragged
  return unless height - 50 < mouse_y
  @pic_alpha = (map1d(mouse_x, (0..width), (0..255))).to_i
end

def settings
  size(640, 360, P2D)
end