Changeset 8053:cf66615c36c6 in orange


Ignore:
Timestamp:
07/01/11 14:05:35 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
5440f8ed3cb2763d6f961bcff3ff9ddebe854d9e
Message:

Fixed PILRenderer to pass all colors components as ints.

Location:
orange/Orange
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/clustering/hierarchical.py

    r8042 r8053  
    10251025""" 
    10261026 
    1027 from orngMisc import ColorPalette, EPSRenderer 
     1027from Orange.misc.render import EPSRenderer, ColorPalette 
     1028 
    10281029class DendrogramPlot(object): 
    10291030    """ A class for drawing dendrograms 
     
    11681169    """ 
    11691170    import os 
    1170     from orngMisc import PILRenderer, EPSRenderer, SVGRenderer 
     1171    from Orange.misc.render import PILRenderer, EPSRenderer, SVGRenderer 
    11711172    name, ext = os.path.splitext(filename) 
    11721173    kwargs["renderer"] = {".eps":EPSRenderer, ".svg":SVGRenderer, ".png":PILRenderer}.get(ext.lower(), PILRenderer) 
  • orange/Orange/misc/render.py

    r8042 r8053  
    1111from __future__ import with_statement 
    1212 
     13import sys 
    1314import numpy 
     15import math 
     16 
     17 
     18class GeneratorContextManager(object): 
     19   def __init__(self, gen): 
     20       self.gen = gen 
     21   def __enter__(self): 
     22       try: 
     23           return self.gen.next() 
     24       except StopIteration: 
     25           raise RuntimeError("generator didn't yield") 
     26   def __exit__(self, type, value, traceback): 
     27       if type is None: 
     28           try: 
     29               self.gen.next() 
     30           except StopIteration: 
     31               return 
     32           else: 
     33               raise RuntimeError("generator didn't stop") 
     34       else: 
     35           try: 
     36               self.gen.throw(type, value, traceback) 
     37               raise RuntimeError("generator didn't stop after throw()") 
     38           except StopIteration: 
     39               return True 
     40           except: 
     41               # only re-raise if it's *not* the exception that was 
     42               # passed to throw(), because __exit__() must not raise 
     43               # an exception unless __exit__() itself failed.  But 
     44               # throw() has to raise the exception to signal 
     45               # propagation, so this fixes the impedance mismatch  
     46               # between the throw() protocol and the __exit__() 
     47               # protocol. 
     48               # 
     49               if sys.exc_info()[1] is not value: 
     50                   raise 
    1451 
    1552def contextmanager(func): 
     
    4077            return func(*args, **kwargs) 
    4178    return wrapper 
     79 
     80 
     81class ColorPalette(object): 
     82    def __init__(self, colors, gamma=None, overflow=(255, 255, 255), underflow=(255, 255, 255), unknown=(0, 0, 0)): 
     83        self.colors = colors 
     84        self.gammaFunc = lambda x, gamma:((math.exp(gamma*math.log(2*x-1)) if x > 0.5 else -math.exp(gamma*math.log(-2*x+1)) if x!=0.5 else 0.0)+1)/2.0 
     85        self.gamma = gamma 
     86        self.overflow = overflow 
     87        self.underflow = underflow 
     88        self.unknown = unknown 
     89 
     90    def get_rgb(self, val, gamma=None): 
     91        if val is None: 
     92            return self.unknown 
     93        gamma = self.gamma if gamma is None else gamma 
     94        index = int(val * (len(self.colors) - 1)) 
     95        if val < 0.0: 
     96            return self.underflow 
     97        elif val > 1.0: 
     98            return self.overflow 
     99        elif index == len(self.colors) - 1: 
     100            return tuple(self.colors[-1][i] for i in range(3)) # self.colors[-1].green(), self.colors[-1].blue()) 
     101        else: 
     102            red1, green1, blue1 = [self.colors[index][i] for i in range(3)] #, self.colors[index].green(), self.colors[index].blue() 
     103            red2, green2, blue2 = [self.colors[index + 1][i] for i in range(3)] #, self.colors[index + 1].green(), self.colors[index + 1].blue() 
     104            x = val * (len(self.colors) - 1) - index 
     105            if gamma is not None: 
     106                x = self.gammaFunc(x, gamma) 
     107            return [(c2 - c1) * x + c1 for c1, c2 in [(red1, red2), (green1, green2), (blue1, blue2)]] 
     108         
     109    def __call__(self, val, gamma=None): 
     110        return self.get_rgb(val, gamma) 
     111     
    42112 
    43113class Renderer(object): 
     
    335405        return len(text) * self.font()[1] 
    336406         
    337          
     407def _int_color(color): 
     408    """ Transform the color tuple (with floats) to tuple with ints 
     409    (needed by PIL)  
     410    """ 
     411    return tuple(map(int, color)) 
     412 
    338413class PILRenderer(Renderer): 
    339414    def __init__(self, width, height): 
    340415        Renderer.__init__(self, width, height) 
    341416        import Image, ImageDraw, ImageFont 
    342         self._pil_image = Image.new("RGB", (width, height), (255, 255, 255)) 
     417        self._pil_image = Image.new("RGB", (int(width), int(height)), (255, 255, 255)) 
    343418        self._draw =  ImageDraw.Draw(self._pil_image, "RGB") 
    344419        self._pil_font = ImageFont.load_default() 
     
    366441        sx, sy = self._transform(sx, sy) 
    367442        ex, ey = self._transform(ex, ey) 
    368         self._draw.line((sx, sy, ex, ey), fill=self.stroke_color(), width=int(self.stroke_width())) 
     443        self._draw.line((sx, sy, ex, ey), fill=_int_color(self.stroke_color()), 
     444                        width=int(self.stroke_width())) 
    369445 
    370446    @with_state 
     
    372448        x1, y1 = self._transform(x, y) 
    373449        x2, y2 = self._transform(x + w, y + h) 
    374         self._draw.rectangle((x1, y1, x2 ,y2), fill=self.fill_color(), outline=self.stroke_color()) 
     450        self._draw.rectangle((x1, y1, x2 ,y2), fill=_int_color(self.fill_color()), 
     451                             outline=_int_color(self.stroke_color())) 
    375452         
    376453    @with_state 
    377454    def draw_text(self, x, y, text, **kwargs): 
    378455        x, y = self._transform(x, y - self.font()[1]) 
    379         self._draw.text((x, y), text, font=self._pil_font, fill=self.stroke_color()) 
     456        self._draw.text((x, y), text, font=self._pil_font, 
     457                        fill=_int_color(self.stroke_color())) 
    380458         
    381459    def save(self, file): 
     
    384462    def string_size_hint(self, text, **kwargs): 
    385463        return self._pil_font.getsize(text)[1] 
     464     
    386465 
    387466class SVGRenderer(Renderer): 
Note: See TracChangeset for help on using the changeset viewer.