get("#348") -- rgb functions
get("#346") -- getcrop
get("#337") -- map(list, f)
get("#388") -- rectangle functions

brightnessThreshold = 0.9

function horizontalsplit(img)
  local function isEmpty(x)
    for y=0, img.height-1 do
      if bright(rgb(img.getInt(x, y))) <= brightnessThreshold then
        return false
      end
    end
    return true
  end

  local lastEmpty, start = true, nil
  local segments = {}
  
  for x=0, img.width-1 do
    empty = isEmpty(x)
    if empty and not lastEmpty then
      table.insert(segments, {start, x})
    elseif not empty and lastEmpty then
      start = x
    end
    lastEmpty = empty
  end
  
  if not lastEmpty then
    table.insert(segments, {start, img.width})
  end
  
  if #segments <= 1 then -- don't bother with only 1 segment
    return {}
  end
  
  local result = {}
  for _, seg in ipairs(segments) do
    local sx1, sx2 = unpack(seg)
    
    local cropped = {
      width = sx2-sx1,
      height = img.height,
      getInt = function(x, y)
        return img.getInt(x+sx1, y)
      end
    }
    local x1, y1, x2, y2 = getcrop(cropped)
    table.insert(result, newRectangle(x1+sx1, y1, x2-x1, y2-y1))
  end
  return result
end