hard edge abstraction