連番画像作成アプリ(Actor版)

Actorを利用して、マルチコア環境で高速化する(はずの)ものにしてみた。

「actor { ... }」って、Rubyのthreadの様に書けるので便利ね、
この場合「loop { ... }」の存在が生きてくるように感じる。

あと、senderがあるので、
erlangみたいに、わざわざselfを投げなくても良くて、超便利。

さらに、これを改良して、リモートのActorを呼べる様にする予定。

import scala.actors._
import scala.actors.Actor._

import ryugate.image._
import ryugate.video._
import ryugate.text.Format

import java.awt.Font
import java.awt.Color
import java.io.File

object make_sequence extends Application {
  val rate = 10
  val second = 10

  for (i <- 0 to rate*second) {
    actor {
      make_frame(i)
    }
  }

  def make_frame(no:int) = {
    val act = actor {
      loop {
        react {
          case "get" =>
            sender ! make_image(no, rate)
            exit()
        }
      }
    }
    
    act ! "get"
    loop {
      react{
        case img:Image =>
          val filename = Format.sprintf("images/%04d.jpg", no)
          println(filename)
          img.write("jpg", new File(filename))
          exit()
      }
    }
  }

  def make_image(no:int, r:int) = {
    val img = new Image(400,300, Image.TYPE_INT_RGB)
    img.clearBackground(Color.BLUE)
    img.process((g) => {
      g.setFont("MS Gothic", Font.BOLD, 48)
      g.antialias((g) => {
        g.drawString(new Timecode(no).tc(r).toString, 50,100)
        g.drawString(Format.sprintf("%04d", no), 50,150)
      })
    })
  }
}