| 120 |
120 |
|
| 121 |
121 |
def MultiCell(w,h,txt,border=0,align='L',fill=0)
|
| 122 |
122 |
if(@CurrentFont['type']=='Type0')
|
| 123 |
|
SJISMultiCell(w,h,txt,border,align,fill)
|
|
123 |
MBMultiCell(w,h,txt,border,align,fill)
|
| 124 |
124 |
else
|
| 125 |
125 |
super(w,h,txt,border,align,fill)
|
| 126 |
126 |
end
|
| 127 |
127 |
end
|
| 128 |
128 |
|
| 129 |
|
def SJISMultiCell(w,h,txt,border=0,align='L',fill=0)
|
|
129 |
def MBMultiCell(w,h,txt,border=0,align='L',fill=0)
|
|
130 |
#Multi-byte version of MultiCell() for UTF-8
|
| 130 |
131 |
#Output text with automatic or explicit line breaks
|
| 131 |
132 |
cw=@CurrentFont['cw']
|
| 132 |
133 |
if(w==0)
|
| ... | ... | |
| 148 |
149 |
b2=''
|
| 149 |
150 |
if(border.to_s.index('L'))
|
| 150 |
151 |
b2+='L'
|
| 151 |
|
end
|
|
152 |
end
|
| 152 |
153 |
if(border.to_s.index('R'))
|
| 153 |
154 |
b2+='R'
|
| 154 |
|
end
|
|
155 |
end
|
| 155 |
156 |
b=border.to_s.index('T') ? b2+'T' : b2
|
| 156 |
157 |
end
|
| 157 |
158 |
end
|
| 158 |
159 |
sep=-1
|
| 159 |
160 |
i=0
|
| 160 |
161 |
j=0
|
| 161 |
|
l=0
|
|
162 |
l=0 # Automatic line break counter
|
| 162 |
163 |
nl=1
|
| 163 |
164 |
while(i<nb)
|
| 164 |
|
#Get next character
|
| 165 |
|
c=s[i]
|
| 166 |
|
o=c #o=ord(c)
|
| 167 |
|
if(o==10)
|
| 168 |
|
#Explicit line break
|
|
165 |
case s[i]
|
|
166 |
when 0x00 .. 0x09, 0x0b .. 0x7f # UTF-8 1byte ASCII
|
|
167 |
ascii=true
|
|
168 |
n=1
|
|
169 |
l+=cw[s[i].chr] || 0
|
|
170 |
if(s[i].chr==' ')
|
|
171 |
sep=i
|
|
172 |
end
|
|
173 |
when 0x0a # Explicit line break "\n"
|
| 169 |
174 |
Cell(w,h,s[j,i-j],b,2,align,fill)
|
| 170 |
175 |
i+=1
|
| 171 |
176 |
sep=-1
|
| ... | ... | |
| 174 |
179 |
nl+=1
|
| 175 |
180 |
if(border and nl==2)
|
| 176 |
181 |
b=b2
|
| 177 |
|
end
|
|
182 |
end
|
| 178 |
183 |
next
|
| 179 |
|
end
|
| 180 |
|
if(o<128)
|
| 181 |
|
#ASCII
|
| 182 |
|
l+=cw[c.chr]
|
| 183 |
|
n=1
|
| 184 |
|
if(o==32)
|
| 185 |
|
sep=i
|
| 186 |
|
end
|
| 187 |
|
elsif(o>=161 and o<=223)
|
| 188 |
|
#Half-width katakana
|
|
184 |
when 0xc0 .. 0xdf # UTF-8 2byte
|
|
185 |
n=2
|
| 189 |
186 |
l+=500
|
| 190 |
|
n=1
|
| 191 |
187 |
sep=i
|
| 192 |
|
else
|
| 193 |
|
#Full-width character
|
|
188 |
when 0xe0 .. 0xee # UTF-8 3byte
|
|
189 |
n=3
|
|
190 |
l+=1000 # Full-width character
|
|
191 |
sep=i
|
|
192 |
when 0xef # UTF-8 3byte
|
|
193 |
n=3
|
|
194 |
if((s[i+1]==0xbd and (s[i+2]>=0xa1 and s[i+2]<=0xbf)) or (s[i+1]==0xbe and(s[i+2]>=0x80 and s[i+2]<=0x9f)))
|
|
195 |
l+=500 # Half-width katakana (UTF-8: EFBDA1 - EFBDBF, EFBE80 - EFBE9F)
|
|
196 |
else
|
|
197 |
l+=1000 # Full-width character
|
|
198 |
end
|
|
199 |
sep=i
|
|
200 |
when 0xf0 .. 0xf7 # UTF-8 4byte
|
|
201 |
n=4
|
|
202 |
l+=1000
|
|
203 |
sep=i
|
|
204 |
when 0xf8 .. 0xfb # UTF-8 5byte
|
|
205 |
n=5
|
|
206 |
l+=1000
|
|
207 |
sep=i
|
|
208 |
when 0xfc .. 0xfd # UTF-8 6byte
|
|
209 |
n=6
|
| 194 |
210 |
l+=1000
|
| 195 |
|
n=2
|
| 196 |
211 |
sep=i
|
|
212 |
else
|
|
213 |
i+=1
|
|
214 |
next
|
| 197 |
215 |
end
|
|
216 |
|
| 198 |
217 |
if(l>wmax)
|
| 199 |
218 |
#Automatic line break
|
| 200 |
219 |
if(sep==-1 or i==j)
|
| 201 |
220 |
if(i==j)
|
| 202 |
221 |
i+=n
|
| 203 |
|
end
|
|
222 |
end
|
| 204 |
223 |
Cell(w,h,s[j,i-j],b,2,align,fill)
|
| 205 |
224 |
else
|
| 206 |
225 |
Cell(w,h,s[j,sep-j],b,2,align,fill)
|
| ... | ... | |
| 212 |
231 |
nl+=1
|
| 213 |
232 |
if(border and nl==2)
|
| 214 |
233 |
b=b2
|
| 215 |
|
end
|
|
234 |
end
|
| 216 |
235 |
else
|
| 217 |
236 |
i+=n
|
| 218 |
|
if(o>=128)
|
|
237 |
if(!ascii)
|
| 219 |
238 |
sep=i
|
| 220 |
239 |
end
|
| 221 |
240 |
end
|