//
/* ----------------------------------------------------------------------------------------------
    photo.java		アナログ & デジタル					ver. 1.00 (JDK 1.02)
    														ueyama@infonet.co.jp  1998.09.01
---------------------------------------------------------------------------------------------- */

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


public class photo extends Applet implements Runnable
{
	int			i,j;
	int			Pgrd=0;											// 写真の階調 0:256, 1:2, 2:4 ・・・
	int			Gx=400;											// グラフ表示の X 座標値
	int			Gy=135;											// グラフ表示の Y 座標値
	int			Data[]=new int[400*270];						// 写真の濃淡のデータ
	Image		Photo[]=new Image[5];
	Graphics	gr;
	Button		bt_start;
	Checkbox	cb_256, cb_2, cb_4, cb_8, cb_16;
	Thread		th=null;
	
	public void init()
	{
		gr=getGraphics();
		setBackground(new Color(255,255,232));
		
		MediaTracker mt=new MediaTracker(this);
		for(i=0,j=1;i<5;i++,j*=2)
		{
			Photo[i]=getImage(getCodeBase(),"photo"+j+".gif");
			mt.addImage(Photo[i], 0);
		}
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
		
		CheckboxGroup cg=new CheckboxGroup();
		Panel pb=new Panel();
		pb.add(new Label("Gradation:"));
		pb.add(cb_2  =new Checkbox("2",cg,false));
		pb.add(cb_4  =new Checkbox("4",cg,false));
		pb.add(cb_8  =new Checkbox("8",cg,false));
		pb.add(cb_16 =new Checkbox("16",cg,false));
		pb.add(cb_256=new Checkbox("256",cg,true));
		pb.add(bt_start=new Button("Graph"));
		setLayout(new BorderLayout());
		add("South" ,pb);
	}
	
	public void start()
	{
		if(th==null)
		{
			th=new Thread(this);
			th.start();
		}
		Gx=400;
	}
	
	public void update(Graphics g)
	{
		paint(g);
	}
	
	public int disp_grph(int x0, int y0)
	{
		int	y1=340-(Data[Gy*400+x0] & 255)/4;
		y0=(x0==0)?y1:y0;
		gr.setColor(new Color(0,0,208));						// グラフの表示
		gr.drawLine(x0,y0,x0,y1);
		return y1;
	}
	
	public void paint(Graphics g)
	{
		int c, y0=0;
		
		g.drawImage(Photo[Pgrd],0,0,400,270,this);
		g.clearRect(0,276,400,340);
		
		c=(Pgrd>1)? 2<<(Pgrd-1): 8;								// c: Y軸目盛の本数
		gr.setColor(new Color(0,224,224));
		for(i=0;i=400) th.suspend();
		}
	}
	
	public boolean mouseDown(Event e, int mx, int my)
	{
		if(my<340 && Gx==400)
		{
			Gy=(my<270)? my:135;								// 表示 Y 座標の変更
			repaint();
		}
		return true;
	}
	
	public boolean action(Event e, Object o)
	{
		if(e.target==cb_256)		Pgrd=0;
		else if(e.target==cb_2)		Pgrd=1;
		else if(e.target==cb_4)		Pgrd=2;
		else if(e.target==cb_8)		Pgrd=3;
		else if(e.target==cb_16)	Pgrd=4;
		if(e.target==bt_start)
		{
			PixelGrabber pg=new PixelGrabber(Photo[Pgrd],0,0,400,270,Data,0,400);
			try
			{
				pg.grabPixels();							// 写真の濃淡データの取得
			}
			catch (InterruptedException ie) {return false;}
			if((pg.status() & ImageObserver.ABORT) !=0) {return false;}
			th.resume();
		}
		else th.suspend();
		Gx=0;
		repaint();
		return true;
	}
	
	public void stop()
	{
		if(th!=null)
		{
			th.stop();
			th=null;
		}
	}
}
//
戻る