survey_seahorse

Software Engineering Project - Fall 2018
Log | Files | Refs | README

qrbitstream.php (5386B)


      1 <?php
      2 /*
      3  * PHP QR Code encoder
      4  *
      5  * Bitstream class
      6  *
      7  * Based on libqrencode C library distributed under LGPL 2.1
      8  * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
      9  *
     10  * PHP QR Code is distributed under LGPL 3
     11  * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
     12  *
     13  * This library is free software; you can redistribute it and/or
     14  * modify it under the terms of the GNU Lesser General Public
     15  * License as published by the Free Software Foundation; either
     16  * version 3 of the License, or any later version.
     17  *
     18  * This library is distributed in the hope that it will be useful,
     19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
     21  * Lesser General Public License for more details.
     22  *
     23  * You should have received a copy of the GNU Lesser General Public
     24  * License along with this library; if not, write to the Free Software
     25  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
     26  */
     27      
     28     class QRbitstream {
     29     
     30         public $data = array();
     31         
     32         //----------------------------------------------------------------------
     33         public function size()
     34         {
     35             return count($this->data);
     36         }
     37         
     38         //----------------------------------------------------------------------
     39         public function allocate($setLength)
     40         {
     41             $this->data = array_fill(0, $setLength, 0);
     42             return 0;
     43         }
     44     
     45         //----------------------------------------------------------------------
     46         public static function newFromNum($bits, $num)
     47         {
     48             $bstream = new QRbitstream();
     49             $bstream->allocate($bits);
     50             
     51             $mask = 1 << ($bits - 1);
     52             for($i=0; $i<$bits; $i++) {
     53                 if($num & $mask) {
     54                     $bstream->data[$i] = 1;
     55                 } else {
     56                     $bstream->data[$i] = 0;
     57                 }
     58                 $mask = $mask >> 1;
     59             }
     60 
     61             return $bstream;
     62         }
     63         
     64         //----------------------------------------------------------------------
     65         public static function newFromBytes($size, $data)
     66         {
     67             $bstream = new QRbitstream();
     68             $bstream->allocate($size * 8);
     69             $p=0;
     70 
     71             for($i=0; $i<$size; $i++) {
     72                 $mask = 0x80;
     73                 for($j=0; $j<8; $j++) {
     74                     if($data[$i] & $mask) {
     75                         $bstream->data[$p] = 1;
     76                     } else {
     77                         $bstream->data[$p] = 0;
     78                     }
     79                     $p++;
     80                     $mask = $mask >> 1;
     81                 }
     82             }
     83 
     84             return $bstream;
     85         }
     86         
     87         //----------------------------------------------------------------------
     88         public function append(QRbitstream $arg)
     89         {
     90             if (is_null($arg)) {
     91                 return -1;
     92             }
     93             
     94             if($arg->size() == 0) {
     95                 return 0;
     96             }
     97             
     98             if($this->size() == 0) {
     99                 $this->data = $arg->data;
    100                 return 0;
    101             }
    102             
    103             $this->data = array_values(array_merge($this->data, $arg->data));
    104 
    105             return 0;
    106         }
    107         
    108         //----------------------------------------------------------------------
    109         public function appendNum($bits, $num)
    110         {
    111             if ($bits == 0) 
    112                 return 0;
    113 
    114             $b = QRbitstream::newFromNum($bits, $num);
    115             
    116             if(is_null($b))
    117                 return -1;
    118 
    119             $ret = $this->append($b);
    120             unset($b);
    121 
    122             return $ret;
    123         }
    124 
    125         //----------------------------------------------------------------------
    126         public function appendBytes($size, $data)
    127         {
    128             if ($size == 0) 
    129                 return 0;
    130 
    131             $b = QRbitstream::newFromBytes($size, $data);
    132             
    133             if(is_null($b))
    134                 return -1;
    135 
    136             $ret = $this->append($b);
    137             unset($b);
    138 
    139             return $ret;
    140         }
    141         
    142         //----------------------------------------------------------------------
    143         public function toByte()
    144         {
    145         
    146             $size = $this->size();
    147 
    148             if($size == 0) {
    149                 return array();
    150             }
    151             
    152             $data = array_fill(0, (int)(($size + 7) / 8), 0);
    153             $bytes = (int)($size / 8);
    154 
    155             $p = 0;
    156             
    157             for($i=0; $i<$bytes; $i++) {
    158                 $v = 0;
    159                 for($j=0; $j<8; $j++) {
    160                     $v = $v << 1;
    161                     $v |= $this->data[$p];
    162                     $p++;
    163                 }
    164                 $data[$i] = $v;
    165             }
    166             
    167             if($size & 7) {
    168                 $v = 0;
    169                 for($j=0; $j<($size & 7); $j++) {
    170                     $v = $v << 1;
    171                     $v |= $this->data[$p];
    172                     $p++;
    173                 }
    174                 $data[$bytes] = $v;
    175             }
    176 
    177             return $data;
    178         }
    179 
    180     }