home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / python-support / gnome-games-data / gnome_sudoku / sudoku_thumber.py < prev    next >
Encoding:
Python Source  |  2009-04-14  |  5.1 KB  |  155 lines

  1. # -*- coding: utf-8 -*-
  2. import cairo
  3. import pango
  4. import gtk
  5.  
  6. SUDOKU_SIZE = 9
  7. N_BOXES = 3
  8.  
  9. PENCIL_GREY = (0.3,0.3,0.3)
  10. BACKGROUND_COLOR = (1.,1.,1.)
  11.  
  12. def draw_sudoku (cr, sudoku, played, size, offset_x=0, offset_y=0, border_color=(1.0,1.0,1.0), line_color=(0.0,0.0,0.0)):
  13.  
  14.     THIN = size / 100.
  15.     THICK = THIN * 2.
  16.     BORDER = THICK
  17.  
  18.     WHITE_SPACE = (size
  19.                    - 2 * BORDER
  20.                    - 2 * THICK
  21.                    - (N_BOXES - 1) * THICK
  22.                    - (N_BOXES * 2) * THIN
  23.                   )
  24.  
  25.     SQUARE_SIZE = WHITE_SPACE / SUDOKU_SIZE
  26.     FONT_SIZE = SQUARE_SIZE 
  27.  
  28.     outer = {}
  29.     outer["left"]   = offset_x
  30.     outer["right"]  = offset_x + size
  31.     outer["top"]    = offset_y
  32.     outer["bottom"] = offset_y + size
  33.  
  34.     # Entire background
  35.     cr.set_source_rgb(1.,1.,1.)
  36.     cr.rectangle(outer["left"],
  37.                  outer["top"],
  38.                  size,
  39.                  size)
  40.     cr.fill()
  41.  
  42.     # Outer border
  43.     cr.set_line_join(cairo.LINE_JOIN_ROUND)
  44.     cr.set_line_width(BORDER)
  45.     cr.rectangle(outer["left"]   + BORDER/2.0,
  46.                  outer["top"]    + BORDER/2.0,
  47.                  size            - BORDER,
  48.                  size            - BORDER)
  49.  
  50.     # Inner background
  51.     cr.set_source_rgb(*BACKGROUND_COLOR)
  52.     cr.fill_preserve()
  53.     #Border box
  54.     cr.set_source_rgb(*border_color)
  55.     cr.stroke()
  56.  
  57.     #Outer thick lines 
  58.     cr.set_line_join(cairo.LINE_JOIN_MITER)
  59.     cr.set_line_width(THICK)
  60.     cr.rectangle(outer["left"]   + BORDER +   THICK/2.0,
  61.                  outer["top"]    + BORDER +   THICK/2.0,
  62.                  size            - BORDER*2 - THICK,
  63.                  size            - BORDER*2 - THICK)
  64.  
  65.     cr.set_source_rgb(*line_color)
  66.     cr.stroke()
  67.  
  68.     inner = {}
  69.     inner["left"]   = outer["left"]   + BORDER + THICK
  70.     inner["right"]  = outer["right"]  - BORDER - THICK
  71.     inner["top"]    = outer["top"]    + BORDER + THICK
  72.     inner["bottom"] = outer["bottom"] - BORDER - THICK
  73.  
  74.     pos = {}
  75.     position = BORDER + THICK
  76.     pos[0] = position + SQUARE_SIZE/2.
  77.     last_line = 0
  78.     for n in range(1,SUDOKU_SIZE):
  79.         if n % N_BOXES == 0:
  80.             cr.set_line_width(THICK)
  81.             position += SQUARE_SIZE + last_line/2.0 + THICK/2.0
  82.             last_line = THICK
  83.         else:
  84.             cr.set_line_width(THIN)
  85.             position += SQUARE_SIZE + last_line/2.0 + THIN/2.0
  86.             last_line = THIN
  87.         pos[n] = position + last_line/2. + SQUARE_SIZE/2.0
  88.         cr.move_to(BORDER+THICK/2.+offset_x, position+offset_y)
  89.         cr.line_to(size-BORDER-THICK/2.+offset_x, position+offset_y)
  90.         cr.move_to(position+offset_x, BORDER+THICK/2.+offset_y)
  91.         cr.line_to(position+offset_x, size-BORDER-THICK/2.+offset_y)
  92.         cr.stroke()
  93.     cr.set_font_size(FONT_SIZE)
  94.     for x in range(SUDOKU_SIZE):
  95.         for y in range(SUDOKU_SIZE):
  96.             cr.move_to(pos[x],pos[y])
  97.             letter = None
  98.             if sudoku[y][x]:
  99.                 letter = str(sudoku[y][x])
  100.                 cr.select_font_face("",
  101.                          cairo.FONT_SLANT_NORMAL,
  102.                          cairo.FONT_WEIGHT_BOLD)
  103.                 cr.set_source_rgb(0,0,0)    
  104.                 xbearing,ybearing,width,height,xadvance,yadvance = (
  105.                     cr.text_extents(letter)
  106.                     )                
  107.  
  108.             elif played and played[y][x]:
  109.                 cr.select_font_face("Times",
  110.                                     cairo.FONT_SLANT_ITALIC,
  111.                                     cairo.FONT_WEIGHT_NORMAL)
  112.                 cr.set_source_rgb(*PENCIL_GREY)
  113.                 letter = str(played[y][x])
  114.                 xbearing,ybearing,width,height,xadvance,yadvance = (
  115.                     cr.text_extents(letter)
  116.                     )
  117.             if letter:
  118.                 cr.move_to(pos[x]+offset_x-(xadvance/2.0),
  119.                            pos[y]+offset_y+(height/2.0))
  120.                 cr.show_text(letter)
  121.  
  122. def make_pixbuf (sudoku, played, border_color, line_color=(0.4,0.4,0.4)):
  123.     size = 120
  124.     surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, size, size)
  125.     cr = cairo.Context(surface)
  126.     draw_sudoku(cr, sudoku, played,  size, 0, 0, border_color, line_color)
  127.     pixbuf = gtk.gdk.pixbuf_new_from_data(surface.get_data(), gtk.gdk.COLORSPACE_RGB,
  128.                                           True, 8, surface.get_width(), surface.get_height(), surface.get_stride())
  129.     del surface
  130.     return pixbuf
  131.  
  132. if __name__ == "__main__":
  133.     sudoku = [[0, 0, 2, 3, 4, 5, 6, 0, 0]]*SUDOKU_SIZE
  134.     played = [[1,2,0,0,0,0,0,0,0,0]]+[[0,0,0,0,0,0,0,0,0,0]]*8
  135.  
  136.  
  137.     size = 250
  138.     line_color=(0.0,0.0,0.0)
  139.     border_color=(1.0,0.0,0.0)
  140.     surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 750, 750)
  141.     cr = cairo.Context(surface)
  142.     draw_sudoku(cr, sudoku, played,  size, 100, 250, border_color, line_color)
  143.     pb = gtk.gdk.pixbuf_new_from_data(surface.get_data(), gtk.gdk.COLORSPACE_RGB,
  144.                                           True, 8, surface.get_width(), surface.get_height(), surface.get_stride())
  145.     del surface
  146.  
  147.  
  148.     w = gtk.Window()
  149.     img = gtk.Image()
  150.     img.set_from_pixbuf(pb)
  151.     w.add(img)
  152.     w.show_all()
  153.     gtk.main()
  154.  
  155.