canvas: generalize views