()
| 135 | |
| 136 | |
| 137 | def draw_png() -> Image.Image: |
| 138 | image = Image.new("RGB", (W, H), "white") |
| 139 | draw = ImageDraw.Draw(image) |
| 140 | |
| 141 | root_y = 72 |
| 142 | closed_group_y = 170 |
| 143 | open_group_y = 610 |
| 144 | closed_ys = [220 + idx * 44 for idx in range(len(CLOSED_ROWS))] |
| 145 | open_ys = [660 + idx * 44 for idx in range(len(OPEN_ROWS))] |
| 146 | |
| 147 | # Draw tree edges before nodes so node labels stay clean. |
| 148 | draw.line((ROOT_X + 72, root_y + 27, ROOT_X + 72, open_group_y), fill=LINE, width=2) |
| 149 | draw_branch(draw, closed_group_y, closed_ys, CLOSED) |
| 150 | draw_branch(draw, open_group_y, open_ys, OPEN) |
| 151 | |
| 152 | centered_node(draw, ROOT_X + 72, root_y, "TokenCost", F_ROOT, TEXT) |
| 153 | centered_node(draw, GROUP_X, closed_group_y, "Closed API", F_GROUP, CLOSED) |
| 154 | centered_node(draw, GROUP_X, open_group_y, "Open / open-access", F_GROUP, OPEN) |
| 155 | |
| 156 | for y, (name, value) in zip(closed_ys, CLOSED_ROWS): |
| 157 | draw_leaf(draw, y, name, value, PAPERFLOW if name == "PaperFlow" else CLOSED, name == "PaperFlow") |
| 158 | |
| 159 | for y, (name, value) in zip(open_ys, OPEN_ROWS): |
| 160 | draw_leaf(draw, y, name, value, OPEN) |
| 161 | |
| 162 | return image |
| 163 | |
| 164 | |
| 165 | def rgb(c: tuple[int, int, int]) -> str: |
no test coverage detected