/*
 * $Id: PixelPtrScanlineScan.java,v 1.1 1999/08/06 15:07:55 yamauchi Exp $
 *     (M\pi)^2 : PixelPointer 
 *	Copyright 1999 By YAMAUCHI Hitoshi 山内 斉 
 *	@author YAMAUCHI Hitoshi 山内 斉
 *
 *	RayTracing での初期光分散のための pixel pointer
 *	
 * original source screenPointer.h
 *
 *	pixel pointer class 
 *		scanlinescan 	scanline を PE に割り当てる
 * 1999年8月 6日(金)
 */

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

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


/**
 * distributed with scanline
 *	PE に scanline を分散して割り当てる
 *	scanline ごと飛び飛びに screen を移動する
 */
public final class PixelPtrScanlineScan extends PixelPointer {
    private int mSkipYLines;
    
    /**
     * constructor
     */
    public PixelPtrScanlineScan(int maxX, int maxY, int skipYLines, int startY)
    {
	this.initMax(maxX, maxY, skipYLines, startY);
    }
    
    /**
     * scan 方式の名前を返す
     */
    public String getScreenPointerType() 
    {
	return("ScanType : Scanline (distributed first ray generation)");
    }
    
    /**
     * initialize 
     */
    public void initMax(int maxX, int maxY, int skipYLines, int startY)
    {
	Assert.out(maxX >  0, "Illegal maxX PixelPtrScanlineScan.initMax");
	Assert.out(maxY >  0, "Illegal maxY PixelPtrScanlineScan.initMax");
	this.mMaxX = maxX;
	this.mMaxY = maxY; 
	this.mX = -1;	// 最初に x = 0 を返すため
	
	Assert.out(skipYLines > 0, 
		   "Illegal skipYLines PixelPtrScanlineScan.initMax");
	this.mSkipYLines = skipYLines;

	Assert.out(startY >= 0, 
		   "Illegal startY PixelPtrScanlineScan.initMax");
	this.mY = startY;	// 最初の scanline
    }

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

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

