人気ブログランキング | 話題のタグを見る

cairoの文字の位置 2

今回は静的にRangeが使える。
ただ、拡大のマトリックスを使うと、描写が荒くなる。
前回のは、拡大してもきれい。
拡大は、context#font_sizeでも、できるけど縦横比が同じだ。
適材適所に使うしかない。
文字だから、右上を基準にしたい時もあるけど、
ちょっと、治せば良さそうだ。
Stringクラスのcenter、ljust、rjustメソッドなんかも、良さげだ。

#!usr/bin/env ruby

require 'sdl'
require 'cairo'

class BackGround
def initialize(w, h)
@w, @h = w, h
end

def update(c)
c.set_source_color(Cairo::Color::WHITE)
c.rectangle(0, 0, @w, @h)
c.fill
end
end

class Moji
def initialize(w, h)
@x, @y = w / 2, h / 2
@text = 'Cairo on Ruby/SDL'
@image = Cairo::ImageSurface.new(w, h)
c = Cairo::Context.new(@image)
c.set_source_color(Cairo::Color::RED)
c.font_size = 50
e = c.text_extents(@text)
x = -e.x_bearing
y = -e.y_bearing
c.move_to(x, y)
c.show_text(@text)
cx, cy = e.width / 2, e.height / 2
@range_x = -cx .. cx
@range_y = -cy .. cy
end

def update(c)
c.matrix = Cairo::Matrix.translate(@x, @y)
c.set_source(@image, @range_x.first, @range_y.first)
c.paint
end
end

class Phase
def initialize(screen)
@screen = screen
@w, @h = @screen.w, @screen.h
@image = Cairo::ImageSurface.new(@w, @h)
@bg = BackGround.new(@w, @h)
@moji = Moji.new(@w, @h)
end

def update
context = Cairo::Context.new(@image)
@bg.update(context)
@moji.update(context)
surface = SDL::Surface.new_from(@image.data, @image.width, @image.height, 32, @image.stride, 0, 0, 0, 0)
@screen.put(surface, 0, 0)
end

def run
loop do
while e=SDL::Event.poll
exit if e.kind_of?(SDL::Event::Quit) || (e.kind_of?(SDL::Event::KeyDown) && e.sym == SDL::Key::ESCAPE)
end
self.update
@screen.flip
SDL.delay(20)
end
end
end

SDL.init(SDL::INIT_VIDEO)
@screen = SDL::Screen.open(500, 350, SDL::Screen.info.bpp, SDL::SWSURFACE)
Phase.new(@screen).run
by gaziya | 2011-05-17 22:53