/*
 * $Id: PixelPtrAllScan.java,v 1.1 1999/08/06 15:07:54 yamauchi Exp $
 *     (M\pi)^2 : PixelPointer : AllScan 
 *	Copyright 1999 By YAMAUCHI Hitoshi 山内 斉 
 *	@author YAMAUCHI Hitoshi 山内 斉
 *
 *	RayTracing での初期光分散のための pixel pointer
 *	
 * original source screenPointer.h
 *
 *	pixel pointer class 
 *	    allscan    全画面を順にスキャンする
 *	
 * 1999年8月 6日(金)
 */

package jp.ac.tohoku.is.archi.mpi2.raytrace;

import  jp.ac.tohoku.is.archi.mpi2.util.Assert;

/**
 * All scan on a screen 
 *   次々に screen 上で 位置を increment していく生成器
 *   (まず X 方向に scan する．)
 */
public final class PixelPtrAllScan extends PixelPointer {
    public PixelPtrAllScan(int maxX, int maxY)
    {
	this.initMax(maxX, maxY);
    }
    
    /**
     * scan 方式名を返す
     */
    public String getScreenPointerType()
    {
	return("ScanType : AllScan (not distributed ray generation)");
    }
    
    /**
     * スクリーンの最大値をセットする
     */
    private void initMax(int maxX, int maxY)
    {
	Assert.out(maxX >  0, "Illegal maxX PixelPtrAllScan.initMax");
	Assert.out(maxY >  0, "Illegal maxY PixelPtrAllScan.initMax");
	this.mMaxX = maxX;
	this.mMaxY = maxY; 
	this.mX = -1;	// 最初に x = 0 を返すため
	this.mY =  0;	
    }

    /**
     * 次の screen 位置を取り出す
     *------------------------------
     * 以下のコードを 1 ステップづつ実行する
     * for(int y = 0; y < maxY; y++)
     * {
     *    for(int x = 0; x < maxX; x++)
     *    {
     *    }
     * }
     */
    public boolean next()
    {
	this.mX++;
	if(this.mX >= this.mMaxX)
	{
	    this.mX = 0;
	    this.mY++;
	    if(this.mY >= this.mMaxY)	    
	    {
		return(false);	// これ以上の ray の生成はできない。
	    }
	}
	return(true);
    }

    /**
     * test
     */
    public static void main(String [] args)
    {
	PixelPtrAllScan ppAllScan = new PixelPtrAllScan(32, 16);
	System.out.println("Test : PixelPtrAllScan");
	while(ppAllScan.next())
	{
	    System.out.println(ppAllScan.getPixelPosX() + ", " +
			       ppAllScan.getPixelPosY());
	}
    }
}
