| 116 | 116 |   		MBMultiCell(w,h,txt,border,align,fill)
 | 
  | 117 | 117 |   	else
 | 
  | 118 | 118 |   		super(w,h,txt,border,align,fill)
 | 
  | 119 |  |     end
 | 
  |  | 119 |   	end  
 | 
  | 120 | 120 |   end
 | 
  | 121 | 121 | 
 | 
  | 122 | 122 |   def MBMultiCell(w,h,txt,border=0,align='L',fill=0)
 | 
  | 123 |  |   	#Multi-byte version of MultiCell()
 | 
  |  | 123 |   	#Multi-byte version of MultiCell() for UTF-8
 | 
  |  | 124 |   	#Output text with automatic or explicit line breaks
 | 
  | 124 | 125 |   	cw=@CurrentFont['cw']
 | 
  | 125 | 126 |   	if(w==0)
 | 
  | 126 | 127 |   		w=@w-@rMargin-@x
 | 
  | 127 |  |     end
 | 
  |  | 128 |   	end  
 | 
  | 128 | 129 |   	wmax=(w-2*@cMargin)*1000/@FontSize
 | 
  | 129 | 130 |   	s=txt.gsub("\r",'')
 | 
  | 130 | 131 |   	nb=s.length
 | 
  | 131 | 132 |   	if(nb>0 and s[nb-1]=="\n")
 | 
  | 132 | 133 |   		nb-=1
 | 
  | 133 |  |     end
 | 
  |  | 134 |   	end  
 | 
  | 134 | 135 |   	b=0
 | 
  | 135 | 136 |   	if(border)
 | 
  | 136 | 137 |   		if(border==1)
 | 
  | ... | ... |  | 
  | 139 | 140 |   			b2='LR'
 | 
  | 140 | 141 |   		else
 | 
  | 141 | 142 |   			b2=''
 | 
  | 142 |  |   			if(border.to_s.index('L').nil?)
 | 
  |  | 143 |   			if(border.to_s.index('L'))
 | 
  | 143 | 144 |   				b2+='L'
 | 
  | 144 |  |         end
 | 
  | 145 |  |   			if(border.to_s.index('R').nil?)
 | 
  |  | 145 |   			end
 | 
  |  | 146 |   			if(border.to_s.index('R'))
 | 
  | 146 | 147 |   				b2+='R'
 | 
  | 147 |  |         end
 | 
  | 148 |  |   			b=border.to_s.index('T').nil? ? b2+'T' : b2
 | 
  |  | 148 |   			end
 | 
  |  | 149 |   			b=border.to_s.index('T') ? b2+'T' : b2
 | 
  | 149 | 150 |   		end
 | 
  | 150 | 151 |   	end
 | 
  | 151 | 152 |   	sep=-1
 | 
  | 152 | 153 |   	i=0
 | 
  | 153 | 154 |   	j=0
 | 
  | 154 |  |   	l=0
 | 
  |  | 155 |   	l=0    # Automatic line break counter
 | 
  | 155 | 156 |   	nl=1
 | 
  | 156 | 157 |   	while(i<nb)
 | 
  | 157 |  |   		#Get next character
 | 
  | 158 |  |   		c=s[i]
 | 
  | 159 |  |   		#Check if ASCII or MB
 | 
  | 160 |  |   		ascii=(c<128)
 | 
  | 161 |  |   		if(c=="\n")
 | 
  | 162 |  |   			#Explicit line break
 | 
  |  | 158 |   		case s[i]
 | 
  |  | 159 |   		when 0x00 .. 0x09, 0x0b .. 0x7f	# UTF-8 1byte ASCII
 | 
  |  | 160 |   			ascii=true
 | 
  |  | 161 | 	  		n=1
 | 
  |  | 162 |   			l+=cw[s[i].chr] || 0
 | 
  |  | 163 |   			if(s[i].chr==' ')
 | 
  |  | 164 |   				sep=i
 | 
  |  | 165 |   			end
 | 
  |  | 166 |   		when 0x0a	# Explicit line break "\n"
 | 
  | 163 | 167 |   			Cell(w,h,s[j,i-j],b,2,align,fill)
 | 
  | 164 | 168 |   			i+=1
 | 
  | 165 | 169 |   			sep=-1
 | 
  | ... | ... |  | 
  | 168 | 172 |   			nl+=1
 | 
  | 169 | 173 |   			if(border and nl==2)
 | 
  | 170 | 174 |   				b=b2
 | 
  | 171 |  |         end
 | 
  |  | 175 |   			end
 | 
  | 172 | 176 |   			next
 | 
  | 173 |  |   		end
 | 
  | 174 |  |   		if(!ascii)
 | 
  |  | 177 |   		when 0xc0 .. 0xdf	# UTF-8 2byte
 | 
  |  | 178 |   			n=2
 | 
  |  | 179 |   			l+=500
 | 
  | 175 | 180 |   			sep=i
 | 
  | 176 |  |   			ls=l
 | 
  | 177 |  |   		elsif(c==' ')
 | 
  |  | 181 |   		when 0xe0 .. 0xee	# UTF-8 3byte
 | 
  |  | 182 |   			n=3
 | 
  |  | 183 |   			l+=1000		# Full-width character
 | 
  | 178 | 184 |   			sep=i
 | 
  | 179 |  |   			ls=l
 | 
  |  | 185 |   		when 0xef		# UTF-8 3byte
 | 
  |  | 186 |   			n=3
 | 
  |  | 187 |   			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)))
 | 
  |  | 188 |   				l+=500	# Half-width katakana (UTF-8: EFBDA1 - EFBDBF, EFBE80 - EFBE9F)
 | 
  |  | 189 |   			else
 | 
  |  | 190 |   				l+=1000	# Full-width character
 | 
  |  | 191 |   			end
 | 
  |  | 192 |   			sep=i
 | 
  |  | 193 |   		when 0xf0 .. 0xf7	# UTF-8 4byte
 | 
  |  | 194 |   			n=4
 | 
  |  | 195 |   			l+=1000
 | 
  |  | 196 |   			sep=i
 | 
  |  | 197 |   		when 0xf8 .. 0xfb	# UTF-8 5byte
 | 
  |  | 198 |   			n=5
 | 
  |  | 199 |   			l+=1000
 | 
  |  | 200 |   			sep=i
 | 
  |  | 201 |   		when 0xfc .. 0xfd	# UTF-8 6byte
 | 
  |  | 202 |   			n=6
 | 
  |  | 203 |   			l+=1000
 | 
  |  | 204 |   			sep=i
 | 
  |  | 205 |   		else
 | 
  |  | 206 | 	  		i+=1
 | 
  |  | 207 |   			next
 | 
  | 180 | 208 |   		end
 | 
  | 181 |  |   		l+=(ascii ? cw[c.chr] : 1000) || 0
 | 
  |  | 209 | 
 | 
  | 182 | 210 |   		if(l>wmax)
 | 
  | 183 | 211 |   			#Automatic line break
 | 
  | 184 | 212 |   			if(sep==-1 or i==j)
 | 
  | 185 | 213 |   				if(i==j)
 | 
  | 186 |  |   					i+=ascii ? 1 : 2
 | 
  | 187 |  |           end
 | 
  |  | 214 |   					i+=n
 | 
  |  | 215 |   				end
 | 
  | 188 | 216 |   				Cell(w,h,s[j,i-j],b,2,align,fill)
 | 
  | 189 | 217 |   			else
 | 
  | 190 | 218 |   				Cell(w,h,s[j,sep-j],b,2,align,fill)
 | 
  | ... | ... |  | 
  | 196 | 224 |   			nl+=1
 | 
  | 197 | 225 |   			if(border and nl==2)
 | 
  | 198 | 226 |   				b=b2
 | 
  | 199 |  |         end
 | 
  |  | 227 |   			end
 | 
  | 200 | 228 |   		else
 | 
  | 201 |  |   			i+=ascii ? 1 : 2
 | 
  | 202 |  |       end
 | 
  |  | 229 |   			i+=n
 | 
  |  | 230 |   			if(!ascii)
 | 
  |  | 231 |   				sep=i
 | 
  |  | 232 |   			end
 | 
  |  | 233 |   		end
 | 
  | 203 | 234 |   	end
 | 
  | 204 | 235 |   	#Last chunk
 | 
  | 205 | 236 |   	if(border and not border.to_s.index('B').nil?)
 | 
  | 206 | 237 |   		b+='B'
 | 
  | 207 |  |     end
 | 
  |  | 238 |   	end  
 | 
  | 208 | 239 |   	Cell(w,h,s[j,i-j],b,2,align,fill)
 | 
  | 209 | 240 |   	@x=@lMargin
 | 
  | 210 | 241 |   end
 |