Class: Miyako::Font

Inherits:
Object show all
Extended by:
Forwardable
Includes:
Animation, Layout, SpriteBase
Defined in:
lib/Miyako/API/font.rb

Overview

フォント管理クラス

フォントは、等幅フォント奨励(プロポーショナルフォントを選ぶと、文字が正しく描画されない可能性あり)

Constant Summary collapse

@@font_cache =
{}
@@name_2_font_path =
Hash.new
@@font_base_path =
Hash.new
@@font_base_name =
Hash.new
@@initialized =
false

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Layout

#add_snap_child, #bottom, #bottom!, #broad_rect, #center, #center!, #centering, #centering!, #copy_layout, #delete_snap_child, #get_snap_children, #get_snap_sprite, #h, #include_snap_child?, #init_layout, #layout_dispose, #left, #left!, #middle, #middle!, #move, #move!, #move_to, #move_to!, #on_move, #outside_bottom, #outside_bottom!, #outside_left, #outside_left!, #outside_right, #outside_right!, #outside_top, #outside_top!, #pos, #rect, #relative_move_to, #relative_move_to!, #reset_snap, #right, #right!, #segment, #set_layout_size, #set_snap_children, #set_snap_sprite, #snap, #top, #top!, #update_layout, #update_layout_position, #w, #x, #y

Methods included from Animation

[], []=, anim_hash, #reset, reset, start, #start, #stop, stop, update, update_animation, #update_animation

Methods included from SpriteBase

#bitmap, #hide, #image_rect, #image_size, #oh, #oh=, #ow, #ow=, #ox, #ox=, #oy, #oy=, #part_rect, #rect, #render_d, #show, #to_sprite, #to_unit, #update

Constructor Details

#initialize(fname, size = 16) ⇒ Font

インスタンス生成

指定したフォントファイル名から、フォントインスタンスを生成する。 フォントファイルのパスは、Miyako2.0起動時にファイルパス(カレントディレクトリとシステムのフォントディレクトリ)を 再帰的に検索し、先に見つけた方を採用する(同一ファイル名がカレントディレクトリとシステムのディレクトリに両方 存在するときは、カレントディレクトリを優先する) そのため、フォントファイル名は、パスを指定する必要がない(逆に言うと、パスを指定すると例外が発生する)。

fname

フォントファイル名(フォントファミリー名不可)。パス指定不可

size

フォントの大きさ。単位はピクセル。デフォルトは 16

返却値

生成されたインスタンスを返す



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/Miyako/API/font.rb', line 153

def initialize(fname, size=16)
  init_layout
  @size = size
  @color = [255, 255, 255]
  @fname = fname
  @vspace = 0
  @hspace = 0
  @bold = false
  @italic = false
  @under_line = false
  @fpath = Font.findFontPath(@fname) or raise MiyakoIOError.new(@fname)
  @font = Font.get_font_inner(@fname, @fpath, @size)
  @font.style = SDL::TTF::STYLE_NORMAL
  init_height
  @use_shadow = false
  @shadow_color = [128, 128, 128]
  @shadow_margin = [2, 2]
  @unit = SpriteUnitFactory.create
  @text = ""
  @visible = true
  set_layout_size(*self.text_size(@text))
end

Instance Attribute Details

#ascentObject (readonly)

OS_MAC_OS_X = “mac_osx”

ORG_ENC = "UTF-8"
NEW_ENC = "UTF-8-MAC"


40
41
42
# File 'lib/Miyako/API/font.rb', line 40

def ascent
  @ascent
end

#colorObject

Returns the value of attribute color.



41
42
43
# File 'lib/Miyako/API/font.rb', line 41

def color
  @color
end

#descentObject (readonly)

OS_MAC_OS_X = “mac_osx”

ORG_ENC = "UTF-8"
NEW_ENC = "UTF-8-MAC"


40
41
42
# File 'lib/Miyako/API/font.rb', line 40

def descent
  @descent
end

#heightObject (readonly)

OS_MAC_OS_X = “mac_osx”

ORG_ENC = "UTF-8"
NEW_ENC = "UTF-8-MAC"


40
41
42
# File 'lib/Miyako/API/font.rb', line 40

def height
  @height
end

#hspaceObject

Returns the value of attribute hspace.



41
42
43
# File 'lib/Miyako/API/font.rb', line 41

def hspace
  @hspace
end

#line_skipObject (readonly)

OS_MAC_OS_X = “mac_osx”

ORG_ENC = "UTF-8"
NEW_ENC = "UTF-8-MAC"


40
41
42
# File 'lib/Miyako/API/font.rb', line 40

def line_skip
  @line_skip
end

#shadow_colorObject

Returns the value of attribute shadow_color.



41
42
43
# File 'lib/Miyako/API/font.rb', line 41

def shadow_color
  @shadow_color
end

#shadow_marginObject

Returns the value of attribute shadow_margin.



41
42
43
# File 'lib/Miyako/API/font.rb', line 41

def shadow_margin
  @shadow_margin
end

#sizeObject

OS_MAC_OS_X = “mac_osx”

ORG_ENC = "UTF-8"
NEW_ENC = "UTF-8-MAC"


40
41
42
# File 'lib/Miyako/API/font.rb', line 40

def size
  @size
end

#textObject

OS_MAC_OS_X = “mac_osx”

ORG_ENC = "UTF-8"
NEW_ENC = "UTF-8-MAC"


40
41
42
# File 'lib/Miyako/API/font.rb', line 40

def text
  @text
end

#use_shadowObject

Returns the value of attribute use_shadow.



41
42
43
# File 'lib/Miyako/API/font.rb', line 41

def use_shadow
  @use_shadow
end

#vspaceObject

Returns the value of attribute vspace.



41
42
43
# File 'lib/Miyako/API/font.rb', line 41

def vspace
  @vspace
end

Class Method Details

.create_font_pathObject

:nodoc:



111
112
113
114
115
116
117
118
# File 'lib/Miyako/API/font.rb', line 111

def Font.create_font_path #:nodoc:
  osn = Miyako::getOSName
  @@font_base_path[osn].each{|path|
    path = path.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
    path = path.tr("\\", "\/")
    @@name_2_font_path = Font.search_font_path_file(@@name_2_font_path, path)
  }
end

.findFontPath(fname) ⇒ Object

:nodoc:



120
121
122
123
# File 'lib/Miyako/API/font.rb', line 120

def Font.findFontPath(fname) #:nodoc:
  fname = fname.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
  return @@name_2_font_path.fetch(fname, nil)
end

.get_font_inner(fname, fpath, size = 16) ⇒ Object

:nodoc:



125
126
127
128
129
130
131
132
133
# File 'lib/Miyako/API/font.rb', line 125

def Font.get_font_inner(fname, fpath, size=16) #:nodoc:
  if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
    fname = fname.encode(Encoding::UTF_8)
    fpath = fpath.encode(Encoding::UTF_8)
  end
  @@font_cache[fname] ||= {}
  @@font_cache[fname][size] ||= SDL::TTF.open(fpath, size)
  return @@font_cache[fname][size]
end

.initObject

フォント関連の初期化処理

既に初期化済みの時はMiyakoErrorが発生する

Raises:



89
90
91
92
93
94
# File 'lib/Miyako/API/font.rb', line 89

def Font.init
  raise MiyakoError, "Already initialized!" if @@initialized
  SDL::TTF.init
  Font.create_font_path
  @@initialized = true
end

.initialized?Boolean

フォント周辺の初期化がされた?

Returns:

  • (Boolean)


97
98
99
# File 'lib/Miyako/API/font.rb', line 97

def Font.initialized?
  @@initialized
end

.sans_serifObject

Sans Serifフォント(ゴシックフォント)を取得する

マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、 共通の名称でフォントインスタンスを取得するときに使う(主にゴシックフォント)

返却値

OSごとに設定されたフォントイン寸タンス(フォントサイズは16)



527
528
529
530
531
532
533
# File 'lib/Miyako/API/font.rb', line 527

def Font::sans_serif
  filename = @@font_base_name[Miyako::getOSName].
               detect{|base|
                 Font.findFontPath(base[:sans_serif])
               }[:sans_serif]
  return Font.new(filename)
end

.search_font_path_file(hash, path) ⇒ Object

:nodoc:



101
102
103
104
105
106
107
108
109
# File 'lib/Miyako/API/font.rb', line 101

def Font.search_font_path_file(hash, path) #:nodoc:
  Dir.glob(path+"*"){|d|
    hash = Font.search_font_path_file(hash, d+"/") if test(?d, d)
    d = d.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
    d = d.tr("\\", "\/")
    hash[$1] = d if (d =~ /\/([^\/\.]+\.tt[fc])\z/ || d =~ /\/([^\/\.]+\.otf)\z/) # MacOSX対応
  }
  return hash
end

.serifObject

Serifフォント(明朝フォント)を取得する

マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、 共通の名称でフォントインスタンスを取得するときに使う(主に明朝フォント)

返却値

OSごとに設定されたフォントイン寸タンス(フォントサイズは16)



518
519
520
521
# File 'lib/Miyako/API/font.rb', line 518

def Font::serif
  filename = @@font_base_name[Miyako::getOSName].detect{|base| Font.findFontPath(base[:serif]) }[:serif]
  return Font.new(filename)
end

.system_fontObject

:nodoc:



535
536
537
# File 'lib/Miyako/API/font.rb', line 535

def Font::system_font #:nodoc:
  return Font.serif
end

Instance Method Details

#boldObject

フォントの属性をbold(太文字)に設定する

ブロックを渡したときは、ブロック評価中のみ太字になる 文字が領域外にはみ出る場合があるので注意!

返却値

自分自身



289
290
291
292
293
294
295
296
297
298
# File 'lib/Miyako/API/font.rb', line 289

def bold
  if block_given?
    tbold, self.bold = self.bold?, true
    yield
    self.bold = tbold
  else
    self.bold = true
  end
  return self
end

#bold=(f) ⇒ Object

フォントのbold属性を設定する

f

bold属性かどうか(true/false)



308
309
310
311
312
313
# File 'lib/Miyako/API/font.rb', line 308

def bold=(f)
  @bold = f
  @font.style |= SDL::TTF::STYLE_BOLD
  @font.style -= SDL::TTF::STYLE_BOLD unless @bold
  return self
end

#bold?Boolean

フォントのbold属性の有無を返す

返却値

bold属性かどうか(true/false)

Returns:

  • (Boolean)


302
303
304
# File 'lib/Miyako/API/font.rb', line 302

def bold?
  return @bold
end

#color_during(color) ⇒ Object

ブロック評価中のみ、フォントの文字の色を変更する

color

変更する色(の3要素の配列(値:0~255))

返却値

自分自身を返す

Raises:



240
241
242
243
244
245
246
# File 'lib/Miyako/API/font.rb', line 240

def color_during(color)
  raise MiyakoError, "not given block!" unless block_given?
  tcolor, self.color = @color, color
  yield
  self.color = tcolor
  return self
end

#disposeObject

フォントインスタンスを解放する



281
282
283
# File 'lib/Miyako/API/font.rb', line 281

def dispose
  @font = nil
end

#draw_text(dst, str, x, y) ⇒ Object

文字列を描画する

対象のスプライトに文字列を描画する

dst

描画先スプライト

str

描画する文字列

x

描画位置x軸

y

描画位置Y軸



387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
# File 'lib/Miyako/API/font.rb', line 387

def draw_text(dst, str, x, y)
  str = str.encode(Encoding::UTF_8)
  str.chars{|c|
    if @use_shadow
      src2 = @font.renderBlendedUTF8(c, @shadow_color[0], @shadow_color[1], @shadow_color[2])
      if src2
        SpriteUnitFactory.apply(@unit, {:bitmap=>src2, :ow=>src2.w, :oh=>src2.h})
        Miyako::Bitmap.blit_aa(@unit, dst.to_unit, x+@shadow_margin[0], y+@shadow_margin[1])
      else
        break x
      end
    end
    src = @font.renderBlendedUTF8(c, @color[0], @color[1], @color[2])
    if src
      SpriteUnitFactory.apply(@unit, {:bitmap=>src, :ow=>src.w, :oh=>src.h})
      Miyako::Bitmap.blit_aa(@unit, dst.to_unit, x, y)
    else
      break x
    end
    x += chr_size_inner(c)
  }
  return x
end

#get_fit_size(size) ⇒ Object

指定したピクセル数のフォントが十分(欠けることなく)収まるピクセル数を取得する

size

フォントの大きさ(単位:ピクセル)

返却値

算出されたピクセル数



268
269
270
271
272
# File 'lib/Miyako/API/font.rb', line 268

def get_fit_size(size)
  path = Font.findFontPath(@fname)
  font = SDL::TTF.open(path, size)
  return (size.to_f * (size.to_f / font.line_skip.to_f)).to_i
end

#initialize_copy(obj) ⇒ Object

:nodoc:



176
177
178
179
180
181
182
183
184
# File 'lib/Miyako/API/font.rb', line 176

def initialize_copy(obj) #:nodoc:
  @size = @size.dup
  @color = @color.dup
  @fname = @fname.dup
  @shadow_color = @shadow_color.dup
  @shadow_margin = @shadow_margin.dup
  @unit = @unit.dup
  @text = @text.dup
end

#italicObject

フォントの属性をitalic(斜め)に設定する

ブロックを渡したときは、ブロック評価中のみ斜体文字になる 文字が領域外にはみ出る場合があるので注意!

返却値

自分自身



319
320
321
322
323
324
325
326
327
328
# File 'lib/Miyako/API/font.rb', line 319

def italic
  if block_given?
    titalic, self.italic = self.italic?, true
    yield
    self.italic = titalic
  else
    self.italic = true
  end
  return self
end

#italic=(f) ⇒ Object

フォントのitalic属性を設定する

f

italic属性かどうか(true/false)



338
339
340
341
342
343
# File 'lib/Miyako/API/font.rb', line 338

def italic=(f)
  @italic = f
  @font.style |= SDL::TTF::STYLE_ITALIC
  @font.style -= SDL::TTF::STYLE_ITALIC unless @italic
  return self
end

#italic?Boolean

フォントのitalic属性の有無を返す

返却値

italic属性かどうか(true/false)

Returns:

  • (Boolean)


332
333
334
# File 'lib/Miyako/API/font.rb', line 332

def italic?
  return @italic
end

#line_heightObject

フォントサイズ(yやjなどの下にはみ出る箇所も算出)を取得する

返却値

算出されたフォントサイズ



276
277
278
# File 'lib/Miyako/API/font.rb', line 276

def line_height
  return @line_skip + @vspace + (@use_shadow ? @shadow_margin[1] : 0)
end

#margin_height(align, height) ⇒ Object

指定した高さで描画する際のマージンを求める

現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。 第1引数に渡す“align”は、以下の3種類のシンボルのどれかを渡す

:top

上側に描画(マージンはゼロ)

:middle

中間に描画

:bottom

下部に描画

align

描画位置

height

描画する高さ

返却値

マージンの値

Raises:



501
502
503
504
505
506
507
508
509
510
511
512
# File 'lib/Miyako/API/font.rb', line 501

def margin_height(align, height)
  case align
    when :top
      return 0
    when :middle
      return (height - self.line_height) >> 1
    when :bottom
      return height - self.line_height
  end
  #else
  raise MiyakoError, "Illegal margin_height align! : #{align}"
end

#normalObject

フォントの属性をすべてクリアする

f

自分自身



376
377
378
379
# File 'lib/Miyako/API/font.rb', line 376

def normal
  @font.style = 0
  return self
end

#renderObject

文字列を画面に描画する

返却値

自分自身を返す



413
414
415
416
417
# File 'lib/Miyako/API/font.rb', line 413

def render
  return self unless @visible
  draw_text(Screen, @text, @layout[:pos][0], @layout[:pos][1])
  return self
end

#render_str(text) ⇒ Object

文字列を画面に描画する

引数textは、内部でto_sメソッドを呼び出して文字列化している

text

描画対象の文字列

返却値

自分自身を返す



453
454
455
456
457
# File 'lib/Miyako/API/font.rb', line 453

def render_str(text)
  return self unless @visible
  draw_text(Screen, text.to_s, @layout[:pos][0], @layout[:pos][1])
  return self
end

#render_str_to(dst, text) ⇒ Object

文字列をスプライトに描画する

引数textは、内部でto_sメソッドを呼び出して文字列化している

dst

描画先スプライト

text

描画対象の文字列

返却値

自分自身を返す



464
465
466
467
468
# File 'lib/Miyako/API/font.rb', line 464

def render_str_to(dst, text)
  return self unless @visible
  draw_text(dst, text.to_s, @layout[:pos][0], @layout[:pos][1])
  return self
end

#render_to(dst) ⇒ Object

文字列をスプライトに描画する

dst

描画先スプライト

返却値

自分自身を返す



422
423
424
425
426
# File 'lib/Miyako/API/font.rb', line 422

def render_to(dst)
  return self unless @visible
  draw_text(dst, @text, @layout[:pos][0], @layout[:pos][1])
  return self
end

#render_xy(x, y) ⇒ Object

文字列を画面の指定の位置に描画する

x

x方向位置

y

y方向位置

返却値

自分自身を返す



432
433
434
435
436
# File 'lib/Miyako/API/font.rb', line 432

def render_xy(x, y)
  return self unless @visible
  draw_text(Screen, @text, x, y)
  return self
end

#render_xy_to(dst, x, y) ⇒ Object

文字列をスプライトの指定の位置に描画する

dst

描画先スプライト

x

x方向位置

y

y方向位置

返却値

自分自身を返す



443
444
445
446
447
# File 'lib/Miyako/API/font.rb', line 443

def render_xy_to(dst, x, y)
  return self unless @visible
  draw_text(dst, @text, x, y)
  return self
end

#shadow_during(color = @shadow_color, margin = @shadow_margin) ⇒ Object

ブロック評価中のみ、影文字文字の色・マージンを変更する

また、ブロック評価中は影文字が強制的に有効になる

color

変更する色([r,g,b]の3要素の配列(値:0~255))、デフォルトはFont#shadow_colorメソッドの値()

margin

変更する色(2要素の整数の配列、デフォルトはFont#shadow_marginメソッドの値()

返却値

自分自身を返す

Raises:



253
254
255
256
257
258
259
260
261
262
263
# File 'lib/Miyako/API/font.rb', line 253

def shadow_during(color = @shadow_color, margin = @shadow_margin)
  raise MiyakoError, "not given block!" unless block_given?
  tflag, @use_shadow = @use_shadow, true
  tcolor, @shadow_color = @shadow_color, color
  tmargin, @shadow_margin = @shadow_margin, margin
  yield
  @use_shadow = tflag
  @shadow_color = tcolor
  @shadow_margin = tmargin
  return self
end

#size_during(sz) ⇒ Object

ブロック評価中のみ、フォントの大きさを変更する

sz

変更するフォントの大きさ(単位:ピクセル)

返却値

自分自身を返す

Raises:



228
229
230
231
232
233
234
235
# File 'lib/Miyako/API/font.rb', line 228

def size_during(sz)
  raise MiyakoError, "not given block!" unless block_given?
  tsize = @size
  self.size = sz
  yield
  self.size = tsize
  return self
end

#text_size(txt) ⇒ Object

文字列描画したときの大きさを取得する

現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。

txt

算出したい文字列

返却値

文字列を描画したときの大きさ(の配列)



484
485
486
487
488
489
# File 'lib/Miyako/API/font.rb', line 484

def text_size(txt)
  width = txt.chars.inject(0){|r, c|
    r += (c.bytesize == 1 ? @size >> 1 : @size) } +
         ((@use_shadow ? @shadow_margin[0] : 0) + @hspace) * (txt.chars.to_a.length - 1)
  return [width, self.line_height]
end

#under_lineObject

フォントの属性をunder_line(下線)に設定する

ブロックを渡したときは、ブロック評価中のみ下線付き文字になる

返却値

自分自身



348
349
350
351
352
353
354
355
356
357
# File 'lib/Miyako/API/font.rb', line 348

def under_line
  if block_given?
    tunder_line, self.under_line = self.under_line?, true
    yield
    self.under_line = tunder_line
  else
    self.under_line = true
  end
  return self
end

#under_line=(f) ⇒ Object

フォントのunder_line属性を設定する

f

under_line属性かどうか(true/false)



367
368
369
370
371
372
# File 'lib/Miyako/API/font.rb', line 367

def under_line=(f)
  @under_line = f
  @font.style |= SDL::TTF::STYLE_UNDERLINE
  @font.style -= SDL::TTF::STYLE_UNDERLINE unless @under_line
  return self
end

#under_line?Boolean

フォントのunder_line属性の有無を返す

返却値

under_line属性かどうか(true/false)

Returns:

  • (Boolean)


361
362
363
# File 'lib/Miyako/API/font.rb', line 361

def under_line?
  return @under_line
end

#visibleObject

描画可能・不可状態を返す

描画可能の時はtrue、不可能なときはfalseを返す

返却値

true/falseを返す



189
190
191
# File 'lib/Miyako/API/font.rb', line 189

def visible
  return @visible
end

#visible=(v) ⇒ Object

描画可能・不可状態を設定する

描画可能の時はtrue、不可能なときはfalseを渡す

返却値

自分自身を返す



196
197
198
199
# File 'lib/Miyako/API/font.rb', line 196

def visible=(v)
  @visible = v
  return self
end