123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- """
- Rounded rectangles in both non-antialiased and antialiased varieties.
- """
- import pygame as pg
- from pygame import gfxdraw
- def round_rect(surface, rect, color, rad=20, border=0, inside=(0, 0, 0, 0)):
- """
- Draw a rect with rounded corners to surface. Argument rad can be specified
- to adjust curvature of edges (given in pixels). An optional border
- width can also be supplied; if not provided the rect will be filled.
- Both the color and optional interior color (the inside argument) support
- alpha.
- """
- rect = pg.Rect(rect)
- zeroed_rect = rect.copy()
- zeroed_rect.topleft = 0, 0
- image = pg.Surface(rect.size).convert_alpha()
- image.fill((0, 0, 0, 0))
- _render_region(image, zeroed_rect, color, rad)
- if border:
- zeroed_rect.inflate_ip(-2 * border, -2 * border)
- _render_region(image, zeroed_rect, inside, rad)
- surface.blit(image, rect)
- def _render_region(image, rect, color, rad):
- """Helper function for round_rect."""
- corners = rect.inflate(-2 * rad, -2 * rad)
- for attribute in ("topleft", "topright", "bottomleft", "bottomright"):
- pg.draw.circle(image, color, getattr(corners, attribute), rad)
- image.fill(color, rect.inflate(-2 * rad, 0))
- image.fill(color, rect.inflate(0, -2 * rad))
- def aa_round_rect(surface, rect, color, rad=20, border=0, inside=(0, 0, 0)):
- """
- Draw an antialiased rounded rect on the target surface. Alpha is not
- supported in this implementation but other than that usage is identical to
- round_rect.
- """
- rect = pg.Rect(rect)
- _aa_render_region(surface, rect, color, rad)
- if border:
- rect.inflate_ip(-2 * border, -2 * border)
- _aa_render_region(surface, rect, inside, rad)
- def _aa_render_region(image, rect, color, rad):
- """Helper function for aa_round_rect."""
- corners = rect.inflate(-2 * rad - 1, -2 * rad - 1)
- for attribute in ("topleft", "topright", "bottomleft", "bottomright"):
- x, y = getattr(corners, attribute)
- gfxdraw.aacircle(image, x, y, rad, color)
- gfxdraw.filled_circle(image, x, y, rad, color)
- image.fill(color, rect.inflate(-2 * rad, 0))
- image.fill(color, rect.inflate(0, -2 * rad))
|