|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace PHPQRCode; |
|
|
|
|
|
class FrameFiller { |
|
|
|
|
|
public $width; |
|
|
public $frame; |
|
|
public $x; |
|
|
public $y; |
|
|
public $dir; |
|
|
public $bit; |
|
|
|
|
|
|
|
|
public function __construct($width, &$frame) |
|
|
{ |
|
|
$this->width = $width; |
|
|
$this->frame = $frame; |
|
|
$this->x = $width - 1; |
|
|
$this->y = $width - 1; |
|
|
$this->dir = -1; |
|
|
$this->bit = -1; |
|
|
} |
|
|
|
|
|
|
|
|
public function setFrameAt($at, $val) |
|
|
{ |
|
|
$this->frame[$at['y']][$at['x']] = chr($val); |
|
|
} |
|
|
|
|
|
|
|
|
public function getFrameAt($at) |
|
|
{ |
|
|
return ord($this->frame[$at['y']][$at['x']]); |
|
|
} |
|
|
|
|
|
|
|
|
public function next() |
|
|
{ |
|
|
do { |
|
|
|
|
|
if($this->bit == -1) { |
|
|
$this->bit = 0; |
|
|
return array('x'=>$this->x, 'y'=>$this->y); |
|
|
} |
|
|
|
|
|
$x = $this->x; |
|
|
$y = $this->y; |
|
|
$w = $this->width; |
|
|
|
|
|
if($this->bit == 0) { |
|
|
$x--; |
|
|
$this->bit++; |
|
|
} else { |
|
|
$x++; |
|
|
$y += $this->dir; |
|
|
$this->bit--; |
|
|
} |
|
|
|
|
|
if($this->dir < 0) { |
|
|
if($y < 0) { |
|
|
$y = 0; |
|
|
$x -= 2; |
|
|
$this->dir = 1; |
|
|
if($x == 6) { |
|
|
$x--; |
|
|
$y = 9; |
|
|
} |
|
|
} |
|
|
} else { |
|
|
if($y == $w) { |
|
|
$y = $w - 1; |
|
|
$x -= 2; |
|
|
$this->dir = -1; |
|
|
if($x == 6) { |
|
|
$x--; |
|
|
$y -= 8; |
|
|
} |
|
|
} |
|
|
} |
|
|
if($x < 0 || $y < 0) return null; |
|
|
|
|
|
$this->x = $x; |
|
|
$this->y = $y; |
|
|
|
|
|
} while(ord($this->frame[$y][$x]) & 0x80); |
|
|
|
|
|
return array('x'=>$x, 'y'=>$y); |
|
|
} |
|
|
|
|
|
} ; |