アニメgifのループ回数をいじるクラス。

例によって動くかわかんないけど
会社の昼休みに息抜きで書きました。

<?php
/**
 * Created on 2009/2/25
 * (c) mana
 */

class AniGifLoop{
	var $fp;
	var $fp_way_flag = false;
	function __construct($filepath){
		$this->fp = fopen($filepath,"rb");
	}

	function getLoopCount(){	// public / int
		if($fp_way_flag === true)return -1;
		$fp_way_flag = true;

		$this->before();
		$fp = $this->fp;
		fread($fp,1);	// 0x01固定値を送る

		$application_data = fread($fp,2);
		$simobyte = $application_data>>8;
		$kamibyte = ($application_data|0xff)<<8;

		return $simobyte | $kamibyte << 8;
	}
	function setLoopCount($num){	// public / ByteString
		if($fp_way_flag === true)return false;
		$fp_way_flag = true;

		if($num>0xffff)$num = 0xffff;
		$simobyte = $num>>8;
		$kamibyte = (num|0xff)<<8;
		
		$src = $this->before();
		$fp = $this->fp;
		$src .= fread($fp,1);	// 0x01固定値を送る

		$src .= pack($simobyte,"c");
		$src .= pack($kamibyte,"c");

		$src .= $this->after();
		return $src;
	}

	private function before(){
		$fp = $this->fp;
		$c = fread($fp,4);
		$src .= $c;
		$c = fread($fp,1)
		if(ord($c) === 0x39){	// GIF89aである
			$src .= $c;
		$i = 0;
		while(!feof($fp)){
			// Application Extensionを調整
			do{
				$c = fread($fp,1);
				$src .= $c;
			}while(ord($c) !== 0x21 && !feof($fp));	// Extension Introducer
			if(feof($fp)){	// Application Extensionが見つからなかった
				break;
			}
			$c2 = fread($fp,1);
			$src .= $c2;
			if(ord($c2) === 0xff){	// Extension Label(1B)
				$src .= fread($fp,13);	// Application Data(nB)直前まで送る
				break;
			}
		}
		return $src;
	}
	function after(){
		
		$fp = $this->fp;
		while(!feof($fp)){
			$src .= fread($fp,1);
		}
		return $src;
	}

}