//
/* ----------------------------------------------------------------------------------------------
    prn_head.java	ドットインパクトプリンタ				ver. 1.00 (JDK 1.02)
    														ueyama@infonet.co.jp  1999.03.04
---------------------------------------------------------------------------------------------- */

import java.applet.Applet;
import java.awt.*;

public class prn_head extends Applet implements Runnable
{
	int			Wait=128;									// 待ち時間 (msec)
	int			R,G,B;
	int			Fx=126, Fy=13;								// 文字表示位置
	int			Fc=1;										// 文字表示色 0:淡灰 1:濃灰 2:赤
	int			Hx=0;										// ヘッド位置
	int			Hp=1;										// ヘッド移動ピッチ
	boolean		Busy=false;
	Image		Gif;
	Image		buf=null;
	Thread		th=null;
	Graphics	gr;
	Button		bt_slow, bt_fast, bt_pause, bt_reset, bt_run, bt_pitch;
	boolean     T=true, F=false;
	boolean		font[][]={{F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F},	// 「漢」データ
						  {F,F,F,F,F,F,F,T,F,F,F,F,F,F,F,F,T,F,F,F,F,F,F,F},
						  {F,F,F,F,F,F,F,F,T,T,T,F,F,F,F,F,T,T,T,F,F,F,F,F},
						  {F,F,T,F,F,F,F,F,F,T,T,F,F,F,F,T,T,T,T,T,T,T,T,F},
						  {F,F,F,T,T,T,F,F,F,F,F,F,F,T,T,T,T,F,F,T,T,T,T,F},
						  {F,F,F,F,T,T,F,F,F,F,F,T,T,T,T,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,F,F,F,F,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,T,F,F,F,F,F,F,F,F,F,F,F,F,F,T,F,F,F,F,T,F},
						  {F,F,F,T,F,F,F,F,F,F,F,F,F,F,T,F,F,T,F,F,F,F,T,F},
						  {F,F,F,T,F,F,F,T,T,T,T,T,F,F,T,F,F,T,F,F,F,T,F,F},
						  {F,F,F,T,F,F,F,T,T,T,T,T,F,F,T,F,F,T,F,F,F,T,F,F},
						  {F,T,T,T,T,T,F,T,F,F,F,T,F,F,T,F,F,T,F,F,T,F,F,F},
						  {F,T,T,T,T,T,F,T,F,F,F,T,F,F,T,F,F,T,F,T,T,F,F,F},
						  {F,F,F,T,F,F,F,T,F,F,F,T,F,F,T,F,F,T,T,T,F,F,F,F},
						  {F,F,F,T,F,F,F,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F},
						  {F,F,F,T,F,F,F,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F},
						  {F,F,F,T,F,F,F,T,F,F,F,T,F,F,T,F,F,T,T,F,F,F,F,F},
						  {F,T,T,T,T,T,F,T,F,F,F,T,F,F,T,F,F,T,F,T,F,F,F,F},
						  {F,T,T,T,T,T,F,T,F,F,F,T,F,F,T,F,F,T,F,F,T,F,F,F},
						  {F,F,F,T,F,F,F,T,T,T,T,T,F,F,T,F,F,T,F,F,F,T,F,F},
						  {F,F,F,T,F,F,F,T,T,T,T,T,F,F,T,F,F,T,F,F,F,T,T,F},
						  {F,F,F,T,F,F,F,F,F,F,F,F,F,F,T,F,F,T,F,F,F,T,T,F},
						  {F,F,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,T,F,F,F,T,F,F},
						  {F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F},
						  
						  {F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F},
						  
						  {F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F},	// 「字」データ
						  {F,F,F,F,F,F,F,T,T,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,F,T,T,T,T,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,T,T,T,T,F,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,F,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,T,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,T,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,T,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,T,F,F,F,F,F,T,F,F,F,F,F,F,F,T,F,F},
						  {F,F,F,F,T,F,F,T,F,F,F,F,F,T,F,F,F,F,F,F,F,T,F,F},
						  {F,F,F,F,T,F,F,T,F,F,F,F,F,T,F,F,F,F,F,F,F,T,T,F},
						  {F,T,T,T,T,F,F,T,F,F,F,T,T,T,T,T,T,T,T,T,T,T,T,F},
						  {F,T,T,T,T,F,F,T,F,F,F,T,T,T,T,T,T,T,T,T,T,T,F,F},
						  {F,T,F,F,T,F,F,T,F,F,F,T,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,T,F,F,T,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,T,F,T,T,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,T,T,T,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,F,T,T,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,F,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,F,F,T,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,T,T,F,T,T,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,T,T,T,F,F,F,F,F,T,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,F,T,T,F,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F},
						  {F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F}};
	
	public void init()
	{
		R=Integer.parseInt(getParameter("bg_red"));
		G=Integer.parseInt(getParameter("bg_green"));
		B=Integer.parseInt(getParameter("bg_blue"));
		setBackground(new Color(R,G,B));
		buf=createImage(size().width,size().height);
		MediaTracker mt=new MediaTracker(this);
		Gif=getImage(getCodeBase(),"prn_head.gif");
		mt.addImage(Gif, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
		
		Panel p=new Panel();
		p.add(bt_slow =new Button("<<"));
		p.add(bt_reset =new Button("RESET"));
		p.add(bt_pitch =new Button("PITCH 7"));
		p.add(bt_run =new Button("RUN"));
		p.add(bt_pause =new Button("PAUSE"));
		p.add(bt_fast =new Button(">>"));
		setLayout(new BorderLayout());
		add("South",p);
		gr=getGraphics();
	}
	
	public void start()
	{
		if(th==null)
		{
			th=new Thread(this);
			th.start();
		}
	}
	
	public void dsp_dot(int x, int y, int c, Graphics g)			// ドットの表示
	{
		Graphics	gx=g.create();
		gx.clipRect(x,y,7,7);
		gx.drawImage(Gif,x-105,y-7*c,this);
		gx.dispose();
	}
	
	public void dsp_head(int x, Graphics g)							// プリントヘッドの表示
	{
		Graphics	gx=g.create();
		gx.clipRect(x,0,105,194);
		gx.drawImage(Gif,x,0,this);
		gx.dispose();
	}
	
	public void dsp_font(int c, Graphics g)							// 文字「漢字」の表示
	{
		int x, y, m, n;
		m=c;
		for(y=0;y<24;y++)
		{
			for(x=0;x<50;x++)
			{
				if(((Fx+x*7-(Hx+77))==0 && y%2==0) || ((Fx+x*7-(Hx+21))==0 && y%2==1)) m=2;
				else if(((Fx+x*7-(Hx+77))<0 && y%2==0) || ((Fx+x*7-(Hx+21))<0 && y%2==1)) m=1;
				else m=c;
				if(font[x][y]) dsp_dot(Fx+x*7,Fy+y*7,m,g);
			}
		}
	}
	
	public void paint(Graphics g)
	{
		g.setColor(new Color(R,G,B));
		g.fillRect(0,0,size().width,size().height);
		dsp_head(Hx, g);											// 印字ヘッドを描く
		dsp_font(Fc, g);											// 文字「漢字」を描く
	}

	public void run()
	{
		while(th!=null)
		{
			if(Busy)
			{
				Graphics offg=buf.getGraphics();
				paint(offg);
				Graphics ong=getGraphics();
				ong.drawImage(buf,0,0,this);
				Hx+=Hp;
				if(Hx>489)
				{
					Busy=false;
					bt_reset.enable();
				}
			}
			try
			{
				th.sleep(Wait*Hp);
			}
			catch (InterruptedException e){};
		}
	}
	
	public boolean mouseDown(Event e, int mx, int my)
	{
		if(my<194)
		{
			if(mx>110)
			{
				Busy=true;
				Fc=0;
				bt_reset.disable();
			}
			else
			{
				Busy=false;
				Fc=1;
				bt_reset.enable();
			}
		}
		return true;
	}
	
	public boolean action(Event e, Object o)
	{
		if(e.target==bt_slow)
		{
			Wait*=2;
			bt_fast.enable();
		}
		else if(e.target==bt_fast)
		{
			Wait/=2;
			if(Wait==32) bt_fast.disable();
		}
		else if(e.target==bt_pause)
		{
			Busy=false;
			bt_reset.enable();
		}
		else if(e.target==bt_reset)
		{
			Busy=false; Hx=0; Fc=1;
			bt_reset.disable();
			repaint();
		}
		else if(e.target==bt_run)
		{
			Busy=true;
			Fc=0;
			if(Hx==490) Hx=0;
			bt_reset.disable();
		}
		else if(e.target==bt_pitch)
		{
			bt_pitch.setLabel("PITCH "+Hp);
			if(Hp==1)
			{
				Hp=7;
				Hx/=7; Hx*=7;
			}
			else Hp=1;
		}
		return true;
	}
	
	public void stop()
	{
		if(th!=null)
		{
			th.stop();
			th=null;
		}
	}
}
//
戻る