def draw(self, ctx: cairo.Context, eye_radius: float, relative_to=(0, 0)): pos = self.pos - relative_to top_intersection = pos + np.array([0, self.opening / 2]) bottom_intersection = pos - np.array([0, self.opening / 2]) right_point = pos + np.array([self.size, 0]) left_point = pos - np.array([self.size, 0]) center_1, rad_1 = circle_from_3_points(left_point, top_intersection, right_point) center_2, rad_2 = circle_from_3_points(left_point, bottom_intersection, right_point) # Eyelid 1: ctx.push_group() with source(ctx, self.color.to_pattern()): # Restrict drawing area to eyeball: ctx.arc(pos[0], pos[1], eye_radius + 1, 0, math.tau) ctx.clip() ctx.paint() # Sub circle 1: with operator(ctx, cairo.Operator.CLEAR): ctx.arc(center_1[0], center_1[1], rad_1, 0, math.tau) ctx.fill() ctx.reset_clip() with source(ctx, ctx.pop_group()): ctx.paint() # Eyelid 2: ctx.push_group() with source(ctx, self.color.to_pattern()): # Restrict drawing area to eyeball: ctx.arc(pos[0], pos[1], eye_radius + 1, 0, math.tau) ctx.clip() ctx.paint() # Sub circle 2: with operator(ctx, cairo.Operator.CLEAR): ctx.arc(center_2[0], center_2[1], rad_2, 0, math.tau) ctx.fill() ctx.reset_clip() with source(ctx, ctx.pop_group()): ctx.paint()