Sophie

Sophie

distrib > Fedora > 14 > i386 > media > os > by-pkgid > a38bd0805b29ade14a7f2cf74c4bcb4e > files > 36

ruby-gtk2-0.90.2-1.fc14.i686.rpm

# Copyright (c) 2005 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
# $Id: cairo-pattern-fill.rb,v 1.1 2005/10/12 05:38:30 ktou Exp $
=begin
= cairo/Pattern Fill

This demo shows how to use GDK and cairo to fill by pattern.
From http://cairographics.org/samples/pattern_fill.html.
=end
require 'common'

module Demo
  class CairoPatternFill < CairoWindow
    X_FUZZ = 0.08
    Y_FUZZ = 0.08
    
    X_INNER_RADIUS = 0.3
    Y_INNER_RADIUS = 0.2
    
    X_OUTER_RADIUS = 0.45
    Y_OUTER_RADIUS = 0.35
    
    SPIKES = 10

    TEXT = "Ruby!"

    def initialize
      super('cairo pattern fill')
    end

    def draw(cr)
      srand(45)
      
      cr.set_line_width(0.01)

      x = y = nil
      0.step(SPIKES * 2 - 1, 2) do |i|
        x = x_position(i, X_INNER_RADIUS)
        y = y_position(i, Y_INNER_RADIUS)
        
        if (i == 0)
          cr.move_to(x, y)
        else
          cr.line_to(x, y)
        end
            
        i += 1
            
        x = x_position(i, X_OUTER_RADIUS)
        y = y_position(i, Y_OUTER_RADIUS)
        
        cr.line_to(x, y)
      end

      cr.close_path
      cr.stroke
          
      cr.select_font_face("Sans",
                          Cairo::FONT_SLANT_NORMAL,
                          Cairo::FONT_WEIGHT_BOLD)

      cr.move_to(x - 0.5, y)
      cr.set_font_size(0.1)
      cr.text_path(TEXT)
      cr.set_source_rgba(1, 0, 0.5)
      cr.fill
          
      cr.set_font_size(0.2)
      extents = cr.text_extents(TEXT)
      x = 0.5 - (extents.width / 2 + extents.x_bearing)
      y = 0.5 - (extents.height / 2 + extents.y_bearing)

      cr.move_to(x, y)
      cr.text_path(TEXT)
      cr.set_source_rgba(1, 0, 0)
      cr.stroke
    end

    def x_position(i, radius)
      0.5 + Math.cos(Math::PI * i / SPIKES) * radius + rand * X_FUZZ
    end

    def y_position(i, radius)
      0.5 + Math.sin(Math::PI * i / SPIKES) * radius + rand * Y_FUZZ      
    end
  end
end