QRbitstream::append()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 18
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

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