def mix_wx_color(ratio, color1, color2): '''Mix two wxPython colors according to the given `ratio`.''' rgb = color_tools.mix_rgb( ratio, wx_color_to_rgb(color1), wx_color_to_rgb(color2) ) return rgb_to_wx_color(rgb)
def make_bitmap(lightness=1, saturation=1): '''Make the bitmap of the color wheel.''' bitmap = wx.EmptyBitmap(BIG_LENGTH, BIG_LENGTH) assert isinstance(bitmap, wx.Bitmap) dc = wx.MemoryDC(bitmap) dc.SetBrush(wx_tools.colors.get_background_brush()) dc.SetPen(wx.TRANSPARENT_PEN) dc.DrawRectangle(-5, -5, BIG_LENGTH + 10, BIG_LENGTH + 10) center_x = center_y = BIG_LENGTH // 2 background_color_rgb = wx_tools.colors.wx_color_to_rgb( wx_tools.colors.get_background_color() ) for x, y in cute_iter_tools.product(xrange(BIG_LENGTH), xrange(BIG_LENGTH)): # This is a big loop so the code is optimized to keep it fast. rx, ry = (x - center_x), (y - center_y) distance = (rx ** 2 + ry ** 2) ** 0.5 if (SMALL_RADIUS - AA_THICKNESS) <= distance <= \ (BIG_RADIUS + AA_THICKNESS): angle = -math.atan2(rx, ry) hue = (angle + math.pi) / two_pi rgb = colorsys.hls_to_rgb(hue, lightness, saturation) if abs(distance - RADIUS) > HALF_THICKNESS: # This pixel requires some anti-aliasing. if distance < RADIUS: aa_distance = SMALL_RADIUS - distance else: # distance > RADIUS aa_distance = distance - BIG_RADIUS aa_ratio = aa_distance / AA_THICKNESS rgb = color_tools.mix_rgb( aa_ratio, background_color_rgb, rgb ) color = wx_tools.colors.rgb_to_wx_color(rgb) pen = wx.Pen(color) dc.SetPen(pen) dc.DrawPoint(x, y) return bitmap
def test(): ''' ''' assert color_tools.mix_rgb(0.5, (0, 1, 0.5), (1, 0, 0)) == (0.5, 0.5, 0.25)
def mix_wx_color(ratio, color1, color2): '''Mix two wxPython colors according to the given `ratio`.''' rgb = color_tools.mix_rgb(ratio, wx_color_to_rgb(color1), wx_color_to_rgb(color2)) return rgb_to_wx_color(rgb)