aboutsummaryrefslogblamecommitdiff
path: root/helpers/rounded_rect.py
blob: f168e0e55a84dacf0973308b4492efc8b4369526 (plain) (tree)





























































                                                                                           
import pygame

class RoundedRect:
    def __init__(self, rect, outer_color, inner_color, linewidth = 2, radius = 0.4):
        self.rect        = pygame.Rect(rect)
        self.outer_color = pygame.Color(*outer_color)
        self.inner_color = pygame.Color(*inner_color)
        self.linewidth   = linewidth
        self.radius      = radius

    def surface(self):
        rectangle       = self.filledRoundedRect(self.rect, self.outer_color, self.radius)

        inner_rect      = pygame.Rect((
                self.rect.left   + 2 * self.linewidth,
                self.rect.top    + 2 * self.linewidth,
                self.rect.right  - 2 * self.linewidth,
                self.rect.bottom - 2 * self.linewidth
                ))

        inner_rectangle = self.filledRoundedRect(inner_rect, self.inner_color, self.radius)

        rectangle.blit(inner_rectangle, (self.linewidth, self.linewidth))

        return rectangle

    def filledRoundedRect(self, rect, color, radius=0.4):
        """
        filledRoundedRect(rect,color,radius=0.4)

        rect    : rectangle
        color   : rgb or rgba
        radius  : 0 <= radius <= 1
        """

        alpha        = color.a
        color.a      = 0
        pos          = rect.topleft
        rect.topleft = 0,0
        rectangle    = pygame.Surface(rect.size,pygame.SRCALPHA)

        circle       = pygame.Surface([min(rect.size)*3]*2,pygame.SRCALPHA)
        pygame.draw.ellipse(circle,(0,0,0),circle.get_rect(),0)
        circle       = pygame.transform.smoothscale(circle,[int(min(rect.size)*radius)]*2)

        radius              = rectangle.blit(circle,(0,0))
        radius.bottomright  = rect.bottomright
        rectangle.blit(circle,radius)
        radius.topright     = rect.topright
        rectangle.blit(circle,radius)
        radius.bottomleft   = rect.bottomleft
        rectangle.blit(circle,radius)

        rectangle.fill((0,0,0),rect.inflate(-radius.w,0))
        rectangle.fill((0,0,0),rect.inflate(0,-radius.h))

        rectangle.fill(color,special_flags=pygame.BLEND_RGBA_MAX)
        rectangle.fill((255,255,255,alpha),special_flags=pygame.BLEND_RGBA_MIN)

        return rectangle