| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 | <?php/* * PHP QR Code encoder * * Bitstream class * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net> * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */         class QRbitstream {            public $data = array();                //----------------------------------------------------------------------        public function size()        {            return count($this->data);        }                //----------------------------------------------------------------------        public function allocate($setLength)        {            $this->data = array_fill(0, $setLength, 0);            return 0;        }            //----------------------------------------------------------------------        public static function newFromNum($bits, $num)        {            $bstream = new QRbitstream();            $bstream->allocate($bits);                        $mask = 1 << ($bits - 1);            for($i=0; $i<$bits; $i++) {                if($num & $mask) {                    $bstream->data[$i] = 1;                } else {                    $bstream->data[$i] = 0;                }                $mask = $mask >> 1;            }            return $bstream;        }                //----------------------------------------------------------------------        public static function newFromBytes($size, $data)        {            $bstream = new QRbitstream();            $bstream->allocate($size * 8);            $p=0;            for($i=0; $i<$size; $i++) {                $mask = 0x80;                for($j=0; $j<8; $j++) {                    if($data[$i] & $mask) {                        $bstream->data[$p] = 1;                    } else {                        $bstream->data[$p] = 0;                    }                    $p++;                    $mask = $mask >> 1;                }            }            return $bstream;        }                //----------------------------------------------------------------------        public function append(QRbitstream $arg)        {            if (is_null($arg)) {                return -1;            }                        if($arg->size() == 0) {                return 0;            }                        if($this->size() == 0) {                $this->data = $arg->data;                return 0;            }                        $this->data = array_values(array_merge($this->data, $arg->data));            return 0;        }                //----------------------------------------------------------------------        public function appendNum($bits, $num)        {            if ($bits == 0)                 return 0;            $b = QRbitstream::newFromNum($bits, $num);                        if(is_null($b))                return -1;            $ret = $this->append($b);            unset($b);            return $ret;        }        //----------------------------------------------------------------------        public function appendBytes($size, $data)        {            if ($size == 0)                 return 0;            $b = QRbitstream::newFromBytes($size, $data);                        if(is_null($b))                return -1;            $ret = $this->append($b);            unset($b);            return $ret;        }                //----------------------------------------------------------------------        public function toByte()        {                    $size = $this->size();            if($size == 0) {                return array();            }                        $data = array_fill(0, (int)(($size + 7) / 8), 0);            $bytes = (int)($size / 8);            $p = 0;                        for($i=0; $i<$bytes; $i++) {                $v = 0;                for($j=0; $j<8; $j++) {                    $v = $v << 1;                    $v |= $this->data[$p];                    $p++;                }                $data[$i] = $v;            }                        if($size & 7) {                $v = 0;                for($j=0; $j<($size & 7); $j++) {                    $v = $v << 1;                    $v |= $this->data[$p];                    $p++;                }                $data[$bytes] = $v;            }            return $data;        }    }
 |