mirror of
https://github.com/wallabag/wallabag.git
synced 2025-09-15 18:57:05 +00:00
add pdf and mobi libraries
This commit is contained in:
parent
2b58426b2d
commit
4188f38ad5
297 changed files with 126557 additions and 7 deletions
1965
inc/3rdparty/libraries/mpdf/classes/barcode.php
vendored
Normal file
1965
inc/3rdparty/libraries/mpdf/classes/barcode.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
248
inc/3rdparty/libraries/mpdf/classes/bmp.php
vendored
Normal file
248
inc/3rdparty/libraries/mpdf/classes/bmp.php
vendored
Normal file
|
@ -0,0 +1,248 @@
|
|||
<?php
|
||||
|
||||
class bmp {
|
||||
|
||||
var $mpdf = null;
|
||||
|
||||
function bmp(&$mpdf) {
|
||||
$this->mpdf = $mpdf;
|
||||
}
|
||||
|
||||
|
||||
function _getBMPimage($data, $file) {
|
||||
$info = array();
|
||||
// Adapted from script by Valentin Schmidt
|
||||
// http://staff.dasdeck.de/valentin/fpdf/fpdf_bmp/
|
||||
$bfOffBits=$this->_fourbytes2int_le(substr($data,10,4));
|
||||
$width=$this->_fourbytes2int_le(substr($data,18,4));
|
||||
$height=$this->_fourbytes2int_le(substr($data,22,4));
|
||||
$flip = ($height<0);
|
||||
if ($flip) $height =-$height;
|
||||
$biBitCount=$this->_twobytes2int_le(substr($data,28,2));
|
||||
$biCompression=$this->_fourbytes2int_le(substr($data,30,4));
|
||||
$info = array('w'=>$width, 'h'=>$height);
|
||||
if ($biBitCount<16){
|
||||
$info['cs'] = 'Indexed';
|
||||
$info['bpc'] = $biBitCount;
|
||||
$palStr = substr($data,54,($bfOffBits-54));
|
||||
$pal = '';
|
||||
$cnt = strlen($palStr)/4;
|
||||
for ($i=0;$i<$cnt;$i++){
|
||||
$n = 4*$i;
|
||||
$pal .= $palStr[$n+2].$palStr[$n+1].$palStr[$n];
|
||||
}
|
||||
$info['pal'] = $pal;
|
||||
}
|
||||
else{
|
||||
$info['cs'] = 'DeviceRGB';
|
||||
$info['bpc'] = 8;
|
||||
}
|
||||
|
||||
if ($this->mpdf->restrictColorSpace==1 || $this->mpdf->PDFX || $this->mpdf->restrictColorSpace==3) {
|
||||
if (($this->mpdf->PDFA && !$this->mpdf->PDFAauto) || ($this->mpdf->PDFX && !$this->mpdf->PDFXauto)) { $this->mpdf->PDFAXwarnings[] = "Image cannot be converted to suitable colour space for PDFA or PDFX file - ".$file." - (Image replaced by 'no-image'.)"; }
|
||||
return array('error' => "BMP Image cannot be converted to suitable colour space - ".$file." - (Image replaced by 'no-image'.)");
|
||||
}
|
||||
|
||||
$biXPelsPerMeter=$this->_fourbytes2int_le(substr($data,38,4)); // horizontal pixels per meter, usually set to zero
|
||||
//$biYPelsPerMeter=$this->_fourbytes2int_le(substr($data,42,4)); // vertical pixels per meter, usually set to zero
|
||||
$biXPelsPerMeter=round($biXPelsPerMeter/1000 *25.4);
|
||||
//$biYPelsPerMeter=round($biYPelsPerMeter/1000 *25.4);
|
||||
$info['set-dpi'] = $biXPelsPerMeter;
|
||||
|
||||
switch ($biCompression){
|
||||
case 0:
|
||||
$str = substr($data,$bfOffBits);
|
||||
break;
|
||||
case 1: # BI_RLE8
|
||||
$str = $this->rle8_decode(substr($data,$bfOffBits), $width);
|
||||
break;
|
||||
case 2: # BI_RLE4
|
||||
$str = $this->rle4_decode(substr($data,$bfOffBits), $width);
|
||||
break;
|
||||
}
|
||||
$bmpdata = '';
|
||||
$padCnt = (4-ceil(($width/(8/$biBitCount)))%4)%4;
|
||||
switch ($biBitCount){
|
||||
case 1:
|
||||
case 4:
|
||||
case 8:
|
||||
$w = floor($width/(8/$biBitCount)) + ($width%(8/$biBitCount)?1:0);
|
||||
$w_row = $w + $padCnt;
|
||||
if ($flip){
|
||||
for ($y=0;$y<$height;$y++){
|
||||
$y0 = $y*$w_row;
|
||||
for ($x=0;$x<$w;$x++)
|
||||
$bmpdata .= $str[$y0+$x];
|
||||
}
|
||||
}else{
|
||||
for ($y=$height-1;$y>=0;$y--){
|
||||
$y0 = $y*$w_row;
|
||||
for ($x=0;$x<$w;$x++)
|
||||
$bmpdata .= $str[$y0+$x];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 16:
|
||||
$w_row = $width*2 + $padCnt;
|
||||
if ($flip){
|
||||
for ($y=0;$y<$height;$y++){
|
||||
$y0 = $y*$w_row;
|
||||
for ($x=0;$x<$width;$x++){
|
||||
$n = (ord( $str[$y0 + 2*$x + 1])*256 + ord( $str[$y0 + 2*$x]));
|
||||
$b = ($n & 31)<<3; $g = ($n & 992)>>2; $r = ($n & 31744)>>7128;
|
||||
$bmpdata .= chr($r) . chr($g) . chr($b);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
for ($y=$height-1;$y>=0;$y--){
|
||||
$y0 = $y*$w_row;
|
||||
for ($x=0;$x<$width;$x++){
|
||||
$n = (ord( $str[$y0 + 2*$x + 1])*256 + ord( $str[$y0 + 2*$x]));
|
||||
$b = ($n & 31)<<3; $g = ($n & 992)>>2; $r = ($n & 31744)>>7;
|
||||
$bmpdata .= chr($r) . chr($g) . chr($b);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 24:
|
||||
case 32:
|
||||
$byteCnt = $biBitCount/8;
|
||||
$w_row = $width*$byteCnt + $padCnt;
|
||||
|
||||
if ($flip){
|
||||
for ($y=0;$y<$height;$y++){
|
||||
$y0 = $y*$w_row;
|
||||
for ($x=0;$x<$width;$x++){
|
||||
$i = $y0 + $x*$byteCnt ; # + 1
|
||||
$bmpdata .= $str[$i+2].$str[$i+1].$str[$i];
|
||||
}
|
||||
}
|
||||
}else{
|
||||
for ($y=$height-1;$y>=0;$y--){
|
||||
$y0 = $y*$w_row;
|
||||
for ($x=0;$x<$width;$x++){
|
||||
$i = $y0 + $x*$byteCnt ; # + 1
|
||||
$bmpdata .= $str[$i+2].$str[$i+1].$str[$i];
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return array('error' => 'Error parsing BMP image - Unsupported image biBitCount');
|
||||
}
|
||||
if ($this->mpdf->compress) {
|
||||
$bmpdata=gzcompress($bmpdata);
|
||||
$info['f']='FlateDecode';
|
||||
}
|
||||
$info['data']=$bmpdata;
|
||||
$info['type']='bmp';
|
||||
return $info;
|
||||
}
|
||||
|
||||
function _fourbytes2int_le($s) {
|
||||
//Read a 4-byte integer from string
|
||||
return (ord($s[3])<<24) + (ord($s[2])<<16) + (ord($s[1])<<8) + ord($s[0]);
|
||||
}
|
||||
|
||||
function _twobytes2int_le($s) {
|
||||
//Read a 2-byte integer from string
|
||||
return (ord(substr($s, 1, 1))<<8) + ord(substr($s, 0, 1));
|
||||
}
|
||||
|
||||
|
||||
# Decoder for RLE8 compression in windows bitmaps
|
||||
# see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp
|
||||
function rle8_decode ($str, $width){
|
||||
$lineWidth = $width + (3 - ($width-1) % 4);
|
||||
$out = '';
|
||||
$cnt = strlen($str);
|
||||
for ($i=0;$i<$cnt;$i++){
|
||||
$o = ord($str[$i]);
|
||||
switch ($o){
|
||||
case 0: # ESCAPE
|
||||
$i++;
|
||||
switch (ord($str[$i])){
|
||||
case 0: # NEW LINE
|
||||
$padCnt = $lineWidth - strlen($out)%$lineWidth;
|
||||
if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line
|
||||
break;
|
||||
case 1: # END OF FILE
|
||||
$padCnt = $lineWidth - strlen($out)%$lineWidth;
|
||||
if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line
|
||||
break 3;
|
||||
case 2: # DELTA
|
||||
$i += 2;
|
||||
break;
|
||||
default: # ABSOLUTE MODE
|
||||
$num = ord($str[$i]);
|
||||
for ($j=0;$j<$num;$j++)
|
||||
$out .= $str[++$i];
|
||||
if ($num % 2) $i++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$out .= str_repeat($str[++$i], $o);
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
# Decoder for RLE4 compression in windows bitmaps
|
||||
# see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp
|
||||
function rle4_decode ($str, $width){
|
||||
$w = floor($width/2) + ($width % 2);
|
||||
$lineWidth = $w + (3 - ( ($width-1) / 2) % 4);
|
||||
$pixels = array();
|
||||
$cnt = strlen($str);
|
||||
for ($i=0;$i<$cnt;$i++){
|
||||
$o = ord($str[$i]);
|
||||
switch ($o){
|
||||
case 0: # ESCAPE
|
||||
$i++;
|
||||
switch (ord($str[$i])){
|
||||
case 0: # NEW LINE
|
||||
while (count($pixels)%$lineWidth!=0)
|
||||
$pixels[]=0;
|
||||
break;
|
||||
case 1: # END OF FILE
|
||||
while (count($pixels)%$lineWidth!=0)
|
||||
$pixels[]=0;
|
||||
break 3;
|
||||
case 2: # DELTA
|
||||
$i += 2;
|
||||
break;
|
||||
default: # ABSOLUTE MODE
|
||||
$num = ord($str[$i]);
|
||||
for ($j=0;$j<$num;$j++){
|
||||
if ($j%2==0){
|
||||
$c = ord($str[++$i]);
|
||||
$pixels[] = ($c & 240)>>4;
|
||||
} else
|
||||
$pixels[] = $c & 15;
|
||||
}
|
||||
if ($num % 2) $i++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$c = ord($str[++$i]);
|
||||
for ($j=0;$j<$o;$j++)
|
||||
$pixels[] = ($j%2==0 ? ($c & 240)>>4 : $c & 15);
|
||||
}
|
||||
}
|
||||
|
||||
$out = '';
|
||||
if (count($pixels)%2) $pixels[]=0;
|
||||
$cnt = count($pixels)/2;
|
||||
for ($i=0;$i<$cnt;$i++)
|
||||
$out .= chr(16*$pixels[2*$i] + $pixels[2*$i+1]);
|
||||
return $out;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
1566
inc/3rdparty/libraries/mpdf/classes/cssmgr.php
vendored
Normal file
1566
inc/3rdparty/libraries/mpdf/classes/cssmgr.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
408
inc/3rdparty/libraries/mpdf/classes/directw.php
vendored
Normal file
408
inc/3rdparty/libraries/mpdf/classes/directw.php
vendored
Normal file
|
@ -0,0 +1,408 @@
|
|||
<?php
|
||||
|
||||
class directw {
|
||||
|
||||
var $mpdf = null;
|
||||
|
||||
function directw(&$mpdf) {
|
||||
$this->mpdf = $mpdf;
|
||||
}
|
||||
|
||||
|
||||
function Write($h,$txt,$currentx=0,$link='',$directionality='ltr',$align='') {
|
||||
if (!$align) {
|
||||
if ($directionality=='rtl') { $align = 'R'; }
|
||||
else { $align = 'L'; }
|
||||
}
|
||||
if ($h == 0) { $this->mpdf->SetLineHeight(); $h = $this->mpdf->lineheight; }
|
||||
//Output text in flowing mode
|
||||
$w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x;
|
||||
|
||||
$wmax = ($w - ($this->mpdf->cMarginL+$this->mpdf->cMarginR));
|
||||
$s=str_replace("\r",'',$txt);
|
||||
if ($this->mpdf->usingCoreFont) { $nb=strlen($s); }
|
||||
else {
|
||||
$nb=mb_strlen($s, $this->mpdf->mb_enc );
|
||||
// handle single space character
|
||||
if(($nb==1) && $s == " ") {
|
||||
$this->mpdf->x += $this->mpdf->GetStringWidth($s);
|
||||
return;
|
||||
}
|
||||
}
|
||||
$sep=-1;
|
||||
$i=0;
|
||||
$j=0;
|
||||
$l=0;
|
||||
$nl=1;
|
||||
if (!$this->mpdf->usingCoreFont) {
|
||||
if (preg_match("/([".$this->mpdf->pregRTLchars."])/u", $txt)) { $this->mpdf->biDirectional = true; } // *RTL*
|
||||
$checkCursive=false;
|
||||
if ($this->mpdf->biDirectional) { $checkCursive=true; } // *RTL*
|
||||
else if (isset($this->mpdf->CurrentFont['indic']) && $this->mpdf->CurrentFont['indic']) { $checkCursive=true; } // *INDIC*
|
||||
while($i<$nb) {
|
||||
//Get next character
|
||||
$c = mb_substr($s,$i,1,$this->mpdf->mb_enc );
|
||||
if($c == "\n") {
|
||||
// WORD SPACING
|
||||
$this->mpdf->ResetSpacing();
|
||||
//Explicit line break
|
||||
$tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mpdf->mb_enc));
|
||||
if ($directionality == 'rtl' && $align == 'J') { $align = 'R'; } // *RTL*
|
||||
$this->mpdf->magic_reverse_dir($tmp, true, $directionality); // *RTL*
|
||||
$this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link);
|
||||
$i++;
|
||||
$sep = -1;
|
||||
$j = $i;
|
||||
$l = 0;
|
||||
if($nl == 1) {
|
||||
if ($currentx != 0) $this->mpdf->x=$currentx;
|
||||
else $this->mpdf->x=$this->mpdf->lMargin;
|
||||
$w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x;
|
||||
$wmax = ($w - ($this->mpdf->cMarginL+$this->mpdf->cMarginR));
|
||||
}
|
||||
$nl++;
|
||||
continue;
|
||||
}
|
||||
if($c == " ") { $sep= $i; }
|
||||
$l += $this->mpdf->GetCharWidthNonCore($c); // mPDF 5.3.04
|
||||
if($l > $wmax) {
|
||||
//Automatic line break (word wrapping)
|
||||
if($sep == -1) {
|
||||
// WORD SPACING
|
||||
$this->mpdf->ResetSpacing();
|
||||
if($this->mpdf->x > $this->mpdf->lMargin) {
|
||||
//Move to next line
|
||||
if ($currentx != 0) $this->mpdf->x=$currentx;
|
||||
else $this->mpdf->x=$this->mpdf->lMargin;
|
||||
$this->mpdf->y+=$h;
|
||||
$w=$this->mpdf->w-$this->mpdf->rMargin-$this->mpdf->x;
|
||||
$wmax = ($w - ($this->mpdf->cMarginL+$this->mpdf->cMarginR));
|
||||
$i++;
|
||||
$nl++;
|
||||
continue;
|
||||
}
|
||||
if($i==$j) { $i++; }
|
||||
$tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mpdf->mb_enc));
|
||||
if ($directionality == 'rtl' && $align == 'J') { $align = 'R'; } // *RTL*
|
||||
$this->mpdf->magic_reverse_dir($tmp, true, $directionality); // *RTL*
|
||||
$this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link);
|
||||
}
|
||||
else {
|
||||
$tmp = rtrim(mb_substr($s,$j,$sep-$j,$this->mpdf->mb_enc));
|
||||
if ($directionality == 'rtl' && $align == 'J') { $align = 'R'; } // *RTL*
|
||||
$this->mpdf->magic_reverse_dir($tmp, true, $directionality); // *RTL*
|
||||
|
||||
if($align=='J') {
|
||||
//////////////////////////////////////////
|
||||
// JUSTIFY J using Unicode fonts (Word spacing doesn't work)
|
||||
// WORD SPACING
|
||||
// Change NON_BREAKING SPACE to spaces so they are 'spaced' properly
|
||||
$tmp = str_replace(chr(194).chr(160),chr(32),$tmp );
|
||||
$len_ligne = $this->mpdf->GetStringWidth($tmp );
|
||||
$nb_carac = mb_strlen( $tmp , $this->mpdf->mb_enc ) ;
|
||||
$nb_spaces = mb_substr_count( $tmp ,' ', $this->mpdf->mb_enc ) ;
|
||||
$inclCursive=false;
|
||||
if ($checkCursive) {
|
||||
if (preg_match("/([".$this->mpdf->pregRTLchars."])/u", $tmp)) { $inclCursive = true; } // *RTL*
|
||||
if (preg_match("/([".$this->mpdf->pregHIchars.$this->mpdf->pregBNchars.$this->mpdf->pregPAchars."])/u", $tmp)) { $inclCursive = true; } // *INDIC*
|
||||
}
|
||||
list($charspacing,$ws) = $this->mpdf->GetJspacing($nb_carac,$nb_spaces,((($w-2) - $len_ligne) * _MPDFK),$inclCursive);
|
||||
$this->mpdf->SetSpacing($charspacing,$ws);
|
||||
//////////////////////////////////////////
|
||||
}
|
||||
$this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link);
|
||||
$i=$sep+1;
|
||||
}
|
||||
$sep = -1;
|
||||
$j = $i;
|
||||
$l = 0;
|
||||
if($nl==1) {
|
||||
if ($currentx != 0) $this->mpdf->x=$currentx;
|
||||
else $this->mpdf->x=$this->mpdf->lMargin;
|
||||
$w=$this->mpdf->w-$this->mpdf->rMargin-$this->mpdf->x;
|
||||
$wmax = ($w - ($this->mpdf->cMarginL+$this->mpdf->cMarginR));
|
||||
}
|
||||
$nl++;
|
||||
}
|
||||
else { $i++; }
|
||||
}
|
||||
//Last chunk
|
||||
// WORD SPACING
|
||||
$this->mpdf->ResetSpacing();
|
||||
}
|
||||
else {
|
||||
while($i<$nb) {
|
||||
//Get next character
|
||||
$c=$s[$i];
|
||||
if($c == "\n") {
|
||||
//Explicit line break
|
||||
// WORD SPACING
|
||||
$this->mpdf->ResetSpacing();
|
||||
$this->mpdf->Cell($w, $h, substr($s, $j, $i-$j), 0, 2, $align, $fill, $link);
|
||||
$i++;
|
||||
$sep = -1;
|
||||
$j = $i;
|
||||
$l = 0;
|
||||
if($nl == 1) {
|
||||
if ($currentx != 0) $this->mpdf->x=$currentx;
|
||||
else $this->mpdf->x=$this->mpdf->lMargin;
|
||||
$w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x;
|
||||
$wmax=$w-($this->mpdf->cMarginL+$this->mpdf->cMarginR);
|
||||
}
|
||||
$nl++;
|
||||
continue;
|
||||
}
|
||||
if($c == " ") { $sep= $i; }
|
||||
$l += $this->mpdf->GetCharWidthCore($c); // mPDF 5.3.04
|
||||
if($l > $wmax) {
|
||||
//Automatic line break (word wrapping)
|
||||
if($sep == -1) {
|
||||
// WORD SPACING
|
||||
$this->mpdf->ResetSpacing();
|
||||
if($this->mpdf->x > $this->mpdf->lMargin) {
|
||||
//Move to next line
|
||||
if ($currentx != 0) $this->mpdf->x=$currentx;
|
||||
else $this->mpdf->x=$this->mpdf->lMargin;
|
||||
$this->mpdf->y+=$h;
|
||||
$w=$this->mpdf->w-$this->mpdf->rMargin-$this->mpdf->x;
|
||||
$wmax=$w-($this->mpdf->cMarginL+$this->mpdf->cMarginR);
|
||||
$i++;
|
||||
$nl++;
|
||||
continue;
|
||||
}
|
||||
if($i==$j) { $i++; }
|
||||
$this->mpdf->Cell($w, $h, substr($s, $j, $i-$j), 0, 2, $align, $fill, $link);
|
||||
}
|
||||
else {
|
||||
$tmp = substr($s, $j, $sep-$j);
|
||||
if($align=='J') {
|
||||
//////////////////////////////////////////
|
||||
// JUSTIFY J using Unicode fonts (Word spacing doesn't work)
|
||||
// WORD SPACING
|
||||
// Change NON_BREAKING SPACE to spaces so they are 'spaced' properly
|
||||
$tmp = str_replace(chr(160),chr(32),$tmp );
|
||||
$len_ligne = $this->mpdf->GetStringWidth($tmp );
|
||||
$nb_carac = strlen( $tmp ) ;
|
||||
$nb_spaces = substr_count( $tmp ,' ' ) ;
|
||||
list($charspacing,$ws) = $this->mpdf->GetJspacing($nb_carac,$nb_spaces,((($w-2) - $len_ligne) * _MPDFK),$false);
|
||||
$this->mpdf->SetSpacing($charspacing,$ws);
|
||||
//////////////////////////////////////////
|
||||
}
|
||||
$this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link);
|
||||
$i=$sep+1;
|
||||
}
|
||||
$sep = -1;
|
||||
$j = $i;
|
||||
$l = 0;
|
||||
if($nl==1) {
|
||||
if ($currentx != 0) $this->mpdf->x=$currentx;
|
||||
else $this->mpdf->x=$this->mpdf->lMargin;
|
||||
$w=$this->mpdf->w-$this->mpdf->rMargin-$this->mpdf->x;
|
||||
$wmax=$w-($this->mpdf->cMarginL+$this->mpdf->cMarginR);
|
||||
}
|
||||
$nl++;
|
||||
}
|
||||
else {
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
// WORD SPACING
|
||||
$this->mpdf->ResetSpacing();
|
||||
}
|
||||
//Last chunk
|
||||
if($i!=$j) {
|
||||
if ($currentx != 0) $this->mpdf->x=$currentx;
|
||||
else $this->mpdf->x=$this->mpdf->lMargin;
|
||||
if ($this->mpdf->usingCoreFont) { $tmp = substr($s,$j,$i-$j); }
|
||||
else {
|
||||
$tmp = mb_substr($s,$j,$i-$j,$this->mpdf->mb_enc);
|
||||
if ($directionality == 'rtl' && $align == 'J') { $align = 'R'; } // *RTL*
|
||||
$this->mpdf->magic_reverse_dir($tmp, true, $directionality); // *RTL*
|
||||
}
|
||||
$this->mpdf->Cell($w,$h,$tmp,0,0,$align,$fill,$link);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function CircularText($x, $y, $r, $text, $align='top', $fontfamily='', $fontsizePt=0, $fontstyle='', $kerning=120, $fontwidth=100, $divider='') { // mPDF 5.5.23
|
||||
if ($font || $fontstyle || $fontsizePt) $this->mpdf->SetFont($fontfamily,$fontstyle,$fontsizePt);
|
||||
$kerning/=100;
|
||||
$fontwidth/=100;
|
||||
if($kerning==0) $this->mpdf->Error('Please use values unequal to zero for kerning (CircularText)');
|
||||
if($fontwidth==0) $this->mpdf->Error('Please use values unequal to zero for font width (CircularText)');
|
||||
$text=str_replace("\r",'',$text);
|
||||
//circumference
|
||||
$u=($r*2)*M_PI;
|
||||
// mPDF 5.5.23
|
||||
$checking = true;
|
||||
$autoset = false;
|
||||
while($checking) {
|
||||
$t=0;
|
||||
$w = array();
|
||||
if ($this->mpdf->usingCoreFont) {
|
||||
$nb=strlen($text);
|
||||
for($i=0; $i<$nb; $i++){
|
||||
$w[$i]=$this->mpdf->GetStringWidth($text[$i]);
|
||||
$w[$i]*=$kerning*$fontwidth;
|
||||
$t+=$w[$i];
|
||||
}
|
||||
}
|
||||
else {
|
||||
$nb=mb_strlen($text, $this->mpdf->mb_enc );
|
||||
$lastchar = '';
|
||||
$unicode = $this->mpdf->UTF8StringToArray($text);
|
||||
for($i=0; $i<$nb; $i++){
|
||||
$c = mb_substr($text,$i,1,$this->mpdf->mb_enc );
|
||||
$w[$i]=$this->mpdf->GetStringWidth($c);
|
||||
$w[$i]*=$kerning*$fontwidth;
|
||||
$char = $unicode[$i];
|
||||
if ($this->mpdf->useKerning && $lastchar) {
|
||||
if (isset($this->mpdf->CurrentFont['kerninfo'][$lastchar][$char])) {
|
||||
$tk = $this->mpdf->CurrentFont['kerninfo'][$lastchar][$char] * ($this->mpdf->FontSize/ 1000) * $kerning * $fontwidth;
|
||||
$w[$i] += $tk/2;
|
||||
$w[$i-1] += $tk/2;
|
||||
$t+=$tk;
|
||||
}
|
||||
}
|
||||
$lastchar = $char;
|
||||
$t+=$w[$i];
|
||||
}
|
||||
}
|
||||
if ($fontsizePt>=0 || $autoset) { $checking = false; }
|
||||
else {
|
||||
$t+=$this->mpdf->GetStringWidth(' ');
|
||||
if ($divider)
|
||||
$t+=$this->mpdf->GetStringWidth(' ');
|
||||
if ($fontsizePt==-2)
|
||||
$fontsizePt = $this->mpdf->FontSizePt * 0.5 * $u/$t;
|
||||
else
|
||||
$fontsizePt = $this->mpdf->FontSizePt * $u/$t;
|
||||
$this->mpdf->SetFontSize($fontsizePt);
|
||||
$autoset = true;
|
||||
}
|
||||
}
|
||||
|
||||
//total width of string in degrees
|
||||
$d=($t/$u)*360;
|
||||
|
||||
$this->mpdf->StartTransform();
|
||||
// rotate matrix for the first letter to center the text
|
||||
// (half of total degrees)
|
||||
if($align=='top'){
|
||||
$this->mpdf->transformRotate(-$d/2, $x, $y);
|
||||
}
|
||||
else{
|
||||
$this->mpdf->transformRotate($d/2, $x, $y);
|
||||
}
|
||||
//run through the string
|
||||
for($i=0; $i<$nb; $i++){
|
||||
if($align=='top'){
|
||||
//rotate matrix half of the width of current letter + half of the width of preceding letter
|
||||
if($i==0){
|
||||
$this->mpdf->transformRotate((($w[$i]/2)/$u)*360, $x, $y);
|
||||
}
|
||||
else{
|
||||
$this->mpdf->transformRotate((($w[$i]/2+$w[$i-1]/2)/$u)*360, $x, $y);
|
||||
}
|
||||
if($fontwidth!=1){
|
||||
$this->mpdf->StartTransform();
|
||||
$this->mpdf->transformScale($fontwidth*100, 100, $x, $y);
|
||||
}
|
||||
$this->mpdf->SetXY($x-$w[$i]/2, $y-$r);
|
||||
}
|
||||
else{
|
||||
//rotate matrix half of the width of current letter + half of the width of preceding letter
|
||||
if($i==0){
|
||||
$this->mpdf->transformRotate(-(($w[$i]/2)/$u)*360, $x, $y);
|
||||
}
|
||||
else{
|
||||
$this->mpdf->transformRotate(-(($w[$i]/2+$w[$i-1]/2)/$u)*360, $x, $y);
|
||||
}
|
||||
if($fontwidth!=1){
|
||||
$this->mpdf->StartTransform();
|
||||
$this->mpdf->transformScale($fontwidth*100, 100, $x, $y);
|
||||
}
|
||||
$this->mpdf->SetXY($x-$w[$i]/2, $y+$r-($this->mpdf->FontSize));
|
||||
}
|
||||
if ($this->mpdf->usingCoreFont) { $c=$text[$i]; }
|
||||
else { $c = mb_substr($text,$i,1,$this->mpdf->mb_enc ); }
|
||||
$this->mpdf->Cell(($w[$i]),$this->mpdf->FontSize,$c,0,0,'C'); // mPDF 5.3.53
|
||||
if($fontwidth!=1){
|
||||
$this->mpdf->StopTransform();
|
||||
}
|
||||
}
|
||||
$this->mpdf->StopTransform();
|
||||
|
||||
// mPDF 5.5.23
|
||||
if($align=='top' && $divider!=''){
|
||||
$wc=$this->mpdf->GetStringWidth($divider);
|
||||
$wc*=$kerning*$fontwidth;
|
||||
|
||||
$this->mpdf->StartTransform();
|
||||
$this->mpdf->transformRotate(90, $x, $y);
|
||||
$this->mpdf->SetXY($x-$wc/2, $y-$r);
|
||||
$this->mpdf->Cell(($wc),$this->mpdf->FontSize,$divider,0,0,'C');
|
||||
$this->mpdf->StopTransform();
|
||||
|
||||
$this->mpdf->StartTransform();
|
||||
$this->mpdf->transformRotate(-90, $x, $y);
|
||||
$this->mpdf->SetXY($x-$wc/2, $y-$r);
|
||||
$this->mpdf->Cell(($wc),$this->mpdf->FontSize,$divider,0,0,'C');
|
||||
$this->mpdf->StopTransform();
|
||||
}
|
||||
}
|
||||
|
||||
function Shaded_box( $text,$font='',$fontstyle='B',$szfont='',$width='70%',$style='DF',$radius=2.5,$fill='#FFFFFF',$color='#000000',$pad=2 )
|
||||
{
|
||||
// F (shading - no line),S (line, no shading),DF (both)
|
||||
if (!$font) { $font= $this->mpdf->default_font; }
|
||||
if (!$szfont) { $szfont = ($this->mpdf->default_font_size * 1.8); }
|
||||
|
||||
$text = $this->mpdf->purify_utf8_text($text);
|
||||
if ($this->mpdf->text_input_as_HTML) {
|
||||
$text = $this->mpdf->all_entities_to_utf8($text);
|
||||
}
|
||||
if ($this->mpdf->usingCoreFont) { $text = mb_convert_encoding($text,$this->mpdf->mb_enc,'UTF-8'); }
|
||||
// DIRECTIONALITY
|
||||
$this->mpdf->magic_reverse_dir($text, true, $this->mpdf->directionality); // *RTL*
|
||||
// Font-specific ligature substitution for Indic fonts
|
||||
if (isset($this->mpdf->CurrentFont['indic']) && $this->mpdf->CurrentFont['indic']) $this->mpdf->ConvertIndic($text); // *INDIC*
|
||||
$text = ' '.$text.' ';
|
||||
if (!$width) { $width = $this->mpdf->pgwidth; } else { $width=$this->mpdf->ConvertSize($width,$this->mpdf->pgwidth); }
|
||||
$midpt = $this->mpdf->lMargin+($this->mpdf->pgwidth/2);
|
||||
$r1 = $midpt-($width/2); //($this->mpdf->w / 2) - 40;
|
||||
$r2 = $r1 + $width; //$r1 + 80;
|
||||
$y1 = $this->mpdf->y;
|
||||
|
||||
|
||||
$mid = ($r1 + $r2 ) / 2;
|
||||
$loop = 0;
|
||||
|
||||
while ( $loop == 0 )
|
||||
{
|
||||
$this->mpdf->SetFont( $font, $fontstyle, $szfont );
|
||||
$sz = $this->mpdf->GetStringWidth( $text );
|
||||
if ( ($r1+$sz) > $r2 )
|
||||
$szfont --;
|
||||
else
|
||||
$loop ++;
|
||||
}
|
||||
|
||||
$y2 = $this->mpdf->FontSize+($pad*2);
|
||||
|
||||
$this->mpdf->SetLineWidth(0.1);
|
||||
$fc = $this->mpdf->ConvertColor($fill);
|
||||
$tc = $this->mpdf->ConvertColor($color);
|
||||
$this->mpdf->SetFColor($fc);
|
||||
$this->mpdf->SetTColor($tc);
|
||||
$this->mpdf->RoundedRect($r1, $y1, ($r2 - $r1), $y2, $radius, $style);
|
||||
$this->mpdf->SetX( $r1);
|
||||
$this->mpdf->Cell($r2-$r1, $y2, $text, 0, 1, "C" );
|
||||
$this->mpdf->SetY($y1+$y2+2); // +2 = mm margin below shaded box
|
||||
$this->mpdf->Reset();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
1498
inc/3rdparty/libraries/mpdf/classes/form.php
vendored
Normal file
1498
inc/3rdparty/libraries/mpdf/classes/form.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
700
inc/3rdparty/libraries/mpdf/classes/gif.php
vendored
Normal file
700
inc/3rdparty/libraries/mpdf/classes/gif.php
vendored
Normal file
|
@ -0,0 +1,700 @@
|
|||
<?php
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// 2009-12-22 Adapted for mPDF 4.2
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// GIF Util - (C) 2003 Yamasoft (S/C)
|
||||
// http://www.yamasoft.com
|
||||
// All Rights Reserved
|
||||
// This file can be freely copied, distributed, modified, updated by anyone under the only
|
||||
// condition to leave the original address (Yamasoft, http://www.yamasoft.com) and this header.
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// 2009-12-22 Adapted INB
|
||||
// Functions calling functionname($x, $len = 0) were not working on PHP5.1.5 as pass by reference
|
||||
// All edited to $len = 0; then call function.
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class CGIFLZW
|
||||
{
|
||||
var $MAX_LZW_BITS;
|
||||
var $Fresh, $CodeSize, $SetCodeSize, $MaxCode, $MaxCodeSize, $FirstCode, $OldCode;
|
||||
var $ClearCode, $EndCode, $Next, $Vals, $Stack, $sp, $Buf, $CurBit, $LastBit, $Done, $LastByte;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// CONSTRUCTOR
|
||||
function CGIFLZW()
|
||||
{
|
||||
$this->MAX_LZW_BITS = 12;
|
||||
unSet($this->Next);
|
||||
unSet($this->Vals);
|
||||
unSet($this->Stack);
|
||||
unSet($this->Buf);
|
||||
|
||||
$this->Next = range(0, (1 << $this->MAX_LZW_BITS) - 1);
|
||||
$this->Vals = range(0, (1 << $this->MAX_LZW_BITS) - 1);
|
||||
$this->Stack = range(0, (1 << ($this->MAX_LZW_BITS + 1)) - 1);
|
||||
$this->Buf = range(0, 279);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function deCompress($data, &$datLen)
|
||||
{
|
||||
$stLen = strlen($data);
|
||||
$datLen = 0;
|
||||
$ret = "";
|
||||
$dp = 0; // data pointer
|
||||
|
||||
// INITIALIZATION
|
||||
$this->LZWCommandInit($data, $dp);
|
||||
|
||||
while(($iIndex = $this->LZWCommand($data, $dp)) >= 0) {
|
||||
$ret .= chr($iIndex);
|
||||
}
|
||||
|
||||
$datLen = $dp;
|
||||
|
||||
if($iIndex != -2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
function LZWCommandInit(&$data, &$dp)
|
||||
{
|
||||
$this->SetCodeSize = ord($data[0]);
|
||||
$dp += 1;
|
||||
|
||||
$this->CodeSize = $this->SetCodeSize + 1;
|
||||
$this->ClearCode = 1 << $this->SetCodeSize;
|
||||
$this->EndCode = $this->ClearCode + 1;
|
||||
$this->MaxCode = $this->ClearCode + 2;
|
||||
$this->MaxCodeSize = $this->ClearCode << 1;
|
||||
|
||||
$this->GetCodeInit($data, $dp);
|
||||
|
||||
$this->Fresh = 1;
|
||||
for($i = 0; $i < $this->ClearCode; $i++) {
|
||||
$this->Next[$i] = 0;
|
||||
$this->Vals[$i] = $i;
|
||||
}
|
||||
|
||||
for(; $i < (1 << $this->MAX_LZW_BITS); $i++) {
|
||||
$this->Next[$i] = 0;
|
||||
$this->Vals[$i] = 0;
|
||||
}
|
||||
|
||||
$this->sp = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
function LZWCommand(&$data, &$dp)
|
||||
{
|
||||
if($this->Fresh) {
|
||||
$this->Fresh = 0;
|
||||
do {
|
||||
$this->FirstCode = $this->GetCode($data, $dp);
|
||||
$this->OldCode = $this->FirstCode;
|
||||
}
|
||||
while($this->FirstCode == $this->ClearCode);
|
||||
|
||||
return $this->FirstCode;
|
||||
}
|
||||
|
||||
if($this->sp > 0) {
|
||||
$this->sp--;
|
||||
return $this->Stack[$this->sp];
|
||||
}
|
||||
|
||||
while(($Code = $this->GetCode($data, $dp)) >= 0) {
|
||||
if($Code == $this->ClearCode) {
|
||||
for($i = 0; $i < $this->ClearCode; $i++) {
|
||||
$this->Next[$i] = 0;
|
||||
$this->Vals[$i] = $i;
|
||||
}
|
||||
|
||||
for(; $i < (1 << $this->MAX_LZW_BITS); $i++) {
|
||||
$this->Next[$i] = 0;
|
||||
$this->Vals[$i] = 0;
|
||||
}
|
||||
|
||||
$this->CodeSize = $this->SetCodeSize + 1;
|
||||
$this->MaxCodeSize = $this->ClearCode << 1;
|
||||
$this->MaxCode = $this->ClearCode + 2;
|
||||
$this->sp = 0;
|
||||
$this->FirstCode = $this->GetCode($data, $dp);
|
||||
$this->OldCode = $this->FirstCode;
|
||||
|
||||
return $this->FirstCode;
|
||||
}
|
||||
|
||||
if($Code == $this->EndCode) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
$InCode = $Code;
|
||||
if($Code >= $this->MaxCode) {
|
||||
$this->Stack[$this->sp++] = $this->FirstCode;
|
||||
$Code = $this->OldCode;
|
||||
}
|
||||
|
||||
while($Code >= $this->ClearCode) {
|
||||
$this->Stack[$this->sp++] = $this->Vals[$Code];
|
||||
|
||||
if($Code == $this->Next[$Code]) // Circular table entry, big GIF Error!
|
||||
return -1;
|
||||
|
||||
$Code = $this->Next[$Code];
|
||||
}
|
||||
|
||||
$this->FirstCode = $this->Vals[$Code];
|
||||
$this->Stack[$this->sp++] = $this->FirstCode;
|
||||
|
||||
if(($Code = $this->MaxCode) < (1 << $this->MAX_LZW_BITS)) {
|
||||
$this->Next[$Code] = $this->OldCode;
|
||||
$this->Vals[$Code] = $this->FirstCode;
|
||||
$this->MaxCode++;
|
||||
|
||||
if(($this->MaxCode >= $this->MaxCodeSize) && ($this->MaxCodeSize < (1 << $this->MAX_LZW_BITS))) {
|
||||
$this->MaxCodeSize *= 2;
|
||||
$this->CodeSize++;
|
||||
}
|
||||
}
|
||||
|
||||
$this->OldCode = $InCode;
|
||||
if($this->sp > 0) {
|
||||
$this->sp--;
|
||||
return $this->Stack[$this->sp];
|
||||
}
|
||||
}
|
||||
|
||||
return $Code;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function GetCodeInit(&$data, &$dp)
|
||||
{
|
||||
$this->CurBit = 0;
|
||||
$this->LastBit = 0;
|
||||
$this->Done = 0;
|
||||
$this->LastByte = 2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
function GetCode(&$data, &$dp)
|
||||
{
|
||||
if(($this->CurBit + $this->CodeSize) >= $this->LastBit) {
|
||||
if($this->Done) {
|
||||
if($this->CurBit >= $this->LastBit) {
|
||||
// Ran off the end of my bits
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
$this->Buf[0] = $this->Buf[$this->LastByte - 2];
|
||||
$this->Buf[1] = $this->Buf[$this->LastByte - 1];
|
||||
|
||||
$Count = ord($data[$dp]);
|
||||
$dp += 1;
|
||||
|
||||
if($Count) {
|
||||
for($i = 0; $i < $Count; $i++) {
|
||||
$this->Buf[2 + $i] = ord($data[$dp+$i]);
|
||||
}
|
||||
$dp += $Count;
|
||||
}
|
||||
else {
|
||||
$this->Done = 1;
|
||||
}
|
||||
|
||||
$this->LastByte = 2 + $Count;
|
||||
$this->CurBit = ($this->CurBit - $this->LastBit) + 16;
|
||||
$this->LastBit = (2 + $Count) << 3;
|
||||
}
|
||||
|
||||
$iRet = 0;
|
||||
for($i = $this->CurBit, $j = 0; $j < $this->CodeSize; $i++, $j++) {
|
||||
$iRet |= (($this->Buf[intval($i / 8)] & (1 << ($i % 8))) != 0) << $j;
|
||||
}
|
||||
|
||||
$this->CurBit += $this->CodeSize;
|
||||
return $iRet;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class CGIFCOLORTABLE
|
||||
{
|
||||
var $m_nColors;
|
||||
var $m_arColors;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// CONSTRUCTOR
|
||||
function CGIFCOLORTABLE()
|
||||
{
|
||||
unSet($this->m_nColors);
|
||||
unSet($this->m_arColors);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function load($lpData, $num)
|
||||
{
|
||||
$this->m_nColors = 0;
|
||||
$this->m_arColors = array();
|
||||
|
||||
for($i = 0; $i < $num; $i++) {
|
||||
$rgb = substr($lpData, $i * 3, 3);
|
||||
if(strlen($rgb) < 3) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->m_arColors[] = (ord($rgb[2]) << 16) + (ord($rgb[1]) << 8) + ord($rgb[0]);
|
||||
$this->m_nColors++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function toString()
|
||||
{
|
||||
$ret = "";
|
||||
|
||||
for($i = 0; $i < $this->m_nColors; $i++) {
|
||||
$ret .=
|
||||
chr(($this->m_arColors[$i] & 0x000000FF)) . // R
|
||||
chr(($this->m_arColors[$i] & 0x0000FF00) >> 8) . // G
|
||||
chr(($this->m_arColors[$i] & 0x00FF0000) >> 16); // B
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function colorIndex($rgb)
|
||||
{
|
||||
$rgb = intval($rgb) & 0xFFFFFF;
|
||||
$r1 = ($rgb & 0x0000FF);
|
||||
$g1 = ($rgb & 0x00FF00) >> 8;
|
||||
$b1 = ($rgb & 0xFF0000) >> 16;
|
||||
$idx = -1;
|
||||
|
||||
for($i = 0; $i < $this->m_nColors; $i++) {
|
||||
$r2 = ($this->m_arColors[$i] & 0x000000FF);
|
||||
$g2 = ($this->m_arColors[$i] & 0x0000FF00) >> 8;
|
||||
$b2 = ($this->m_arColors[$i] & 0x00FF0000) >> 16;
|
||||
$d = abs($r2 - $r1) + abs($g2 - $g1) + abs($b2 - $b1);
|
||||
|
||||
if(($idx == -1) || ($d < $dif)) {
|
||||
$idx = $i;
|
||||
$dif = $d;
|
||||
}
|
||||
}
|
||||
|
||||
return $idx;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class CGIFFILEHEADER
|
||||
{
|
||||
var $m_lpVer;
|
||||
var $m_nWidth;
|
||||
var $m_nHeight;
|
||||
var $m_bGlobalClr;
|
||||
var $m_nColorRes;
|
||||
var $m_bSorted;
|
||||
var $m_nTableSize;
|
||||
var $m_nBgColor;
|
||||
var $m_nPixelRatio;
|
||||
var $m_colorTable;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// CONSTRUCTOR
|
||||
function CGIFFILEHEADER()
|
||||
{
|
||||
unSet($this->m_lpVer);
|
||||
unSet($this->m_nWidth);
|
||||
unSet($this->m_nHeight);
|
||||
unSet($this->m_bGlobalClr);
|
||||
unSet($this->m_nColorRes);
|
||||
unSet($this->m_bSorted);
|
||||
unSet($this->m_nTableSize);
|
||||
unSet($this->m_nBgColor);
|
||||
unSet($this->m_nPixelRatio);
|
||||
unSet($this->m_colorTable);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function load($lpData, &$hdrLen)
|
||||
{
|
||||
$hdrLen = 0;
|
||||
|
||||
$this->m_lpVer = substr($lpData, 0, 6);
|
||||
if(($this->m_lpVer <> "GIF87a") && ($this->m_lpVer <> "GIF89a")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->m_nWidth = $this->w2i(substr($lpData, 6, 2));
|
||||
$this->m_nHeight = $this->w2i(substr($lpData, 8, 2));
|
||||
if(!$this->m_nWidth || !$this->m_nHeight) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$b = ord(substr($lpData, 10, 1));
|
||||
$this->m_bGlobalClr = ($b & 0x80) ? true : false;
|
||||
$this->m_nColorRes = ($b & 0x70) >> 4;
|
||||
$this->m_bSorted = ($b & 0x08) ? true : false;
|
||||
$this->m_nTableSize = 2 << ($b & 0x07);
|
||||
$this->m_nBgColor = ord(substr($lpData, 11, 1));
|
||||
$this->m_nPixelRatio = ord(substr($lpData, 12, 1));
|
||||
$hdrLen = 13;
|
||||
|
||||
if($this->m_bGlobalClr) {
|
||||
$this->m_colorTable = new CGIFCOLORTABLE();
|
||||
if(!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) {
|
||||
return false;
|
||||
}
|
||||
$hdrLen += 3 * $this->m_nTableSize;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function w2i($str)
|
||||
{
|
||||
return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class CGIFIMAGEHEADER
|
||||
{
|
||||
var $m_nLeft;
|
||||
var $m_nTop;
|
||||
var $m_nWidth;
|
||||
var $m_nHeight;
|
||||
var $m_bLocalClr;
|
||||
var $m_bInterlace;
|
||||
var $m_bSorted;
|
||||
var $m_nTableSize;
|
||||
var $m_colorTable;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// CONSTRUCTOR
|
||||
function CGIFIMAGEHEADER()
|
||||
{
|
||||
unSet($this->m_nLeft);
|
||||
unSet($this->m_nTop);
|
||||
unSet($this->m_nWidth);
|
||||
unSet($this->m_nHeight);
|
||||
unSet($this->m_bLocalClr);
|
||||
unSet($this->m_bInterlace);
|
||||
unSet($this->m_bSorted);
|
||||
unSet($this->m_nTableSize);
|
||||
unSet($this->m_colorTable);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function load($lpData, &$hdrLen)
|
||||
{
|
||||
$hdrLen = 0;
|
||||
|
||||
$this->m_nLeft = $this->w2i(substr($lpData, 0, 2));
|
||||
$this->m_nTop = $this->w2i(substr($lpData, 2, 2));
|
||||
$this->m_nWidth = $this->w2i(substr($lpData, 4, 2));
|
||||
$this->m_nHeight = $this->w2i(substr($lpData, 6, 2));
|
||||
|
||||
if(!$this->m_nWidth || !$this->m_nHeight) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$b = ord($lpData{8});
|
||||
$this->m_bLocalClr = ($b & 0x80) ? true : false;
|
||||
$this->m_bInterlace = ($b & 0x40) ? true : false;
|
||||
$this->m_bSorted = ($b & 0x20) ? true : false;
|
||||
$this->m_nTableSize = 2 << ($b & 0x07);
|
||||
$hdrLen = 9;
|
||||
|
||||
if($this->m_bLocalClr) {
|
||||
$this->m_colorTable = new CGIFCOLORTABLE();
|
||||
if(!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) {
|
||||
return false;
|
||||
}
|
||||
$hdrLen += 3 * $this->m_nTableSize;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function w2i($str)
|
||||
{
|
||||
return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class CGIFIMAGE
|
||||
{
|
||||
var $m_disp;
|
||||
var $m_bUser;
|
||||
var $m_bTrans;
|
||||
var $m_nDelay;
|
||||
var $m_nTrans;
|
||||
var $m_lpComm;
|
||||
var $m_gih;
|
||||
var $m_data;
|
||||
var $m_lzw;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function CGIFIMAGE()
|
||||
{
|
||||
unSet($this->m_disp);
|
||||
unSet($this->m_bUser);
|
||||
unSet($this->m_bTrans);
|
||||
unSet($this->m_nDelay);
|
||||
unSet($this->m_nTrans);
|
||||
unSet($this->m_lpComm);
|
||||
unSet($this->m_data);
|
||||
$this->m_gih = new CGIFIMAGEHEADER();
|
||||
$this->m_lzw = new CGIFLZW();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function load($data, &$datLen)
|
||||
{
|
||||
$datLen = 0;
|
||||
|
||||
while(true) {
|
||||
$b = ord($data[0]);
|
||||
$data = substr($data, 1);
|
||||
$datLen++;
|
||||
|
||||
switch($b) {
|
||||
case 0x21: // Extension
|
||||
$len = 0;
|
||||
if(!$this->skipExt($data, $len)) {
|
||||
return false;
|
||||
}
|
||||
$datLen += $len;
|
||||
break;
|
||||
|
||||
case 0x2C: // Image
|
||||
// LOAD HEADER & COLOR TABLE
|
||||
$len = 0;
|
||||
if(!$this->m_gih->load($data, $len)) {
|
||||
return false;
|
||||
}
|
||||
$data = substr($data, $len);
|
||||
$datLen += $len;
|
||||
|
||||
// ALLOC BUFFER
|
||||
$len = 0;
|
||||
|
||||
if(!($this->m_data = $this->m_lzw->deCompress($data, $len))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$data = substr($data, $len);
|
||||
$datLen += $len;
|
||||
|
||||
if($this->m_gih->m_bInterlace) {
|
||||
$this->deInterlace();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
case 0x3B: // EOF
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function skipExt(&$data, &$extLen)
|
||||
{
|
||||
$extLen = 0;
|
||||
|
||||
$b = ord($data[0]);
|
||||
$data = substr($data, 1);
|
||||
$extLen++;
|
||||
|
||||
switch($b) {
|
||||
case 0xF9: // Graphic Control
|
||||
$b = ord($data[1]);
|
||||
$this->m_disp = ($b & 0x1C) >> 2;
|
||||
$this->m_bUser = ($b & 0x02) ? true : false;
|
||||
$this->m_bTrans = ($b & 0x01) ? true : false;
|
||||
$this->m_nDelay = $this->w2i(substr($data, 2, 2));
|
||||
$this->m_nTrans = ord($data[4]);
|
||||
break;
|
||||
|
||||
case 0xFE: // Comment
|
||||
$this->m_lpComm = substr($data, 1, ord($data[0]));
|
||||
break;
|
||||
|
||||
case 0x01: // Plain text
|
||||
break;
|
||||
|
||||
case 0xFF: // Application
|
||||
break;
|
||||
}
|
||||
|
||||
// SKIP DEFAULT AS DEFS MAY CHANGE
|
||||
$b = ord($data[0]);
|
||||
$data = substr($data, 1);
|
||||
$extLen++;
|
||||
while($b > 0) {
|
||||
$data = substr($data, $b);
|
||||
$extLen += $b;
|
||||
$b = ord($data[0]);
|
||||
$data = substr($data, 1);
|
||||
$extLen++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function w2i($str)
|
||||
{
|
||||
return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function deInterlace()
|
||||
{
|
||||
$data = $this->m_data;
|
||||
|
||||
for($i = 0; $i < 4; $i++) {
|
||||
switch($i) {
|
||||
case 0:
|
||||
$s = 8;
|
||||
$y = 0;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
$s = 8;
|
||||
$y = 4;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
$s = 4;
|
||||
$y = 2;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
$s = 2;
|
||||
$y = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
for(; $y < $this->m_gih->m_nHeight; $y += $s) {
|
||||
$lne = substr($this->m_data, 0, $this->m_gih->m_nWidth);
|
||||
$this->m_data = substr($this->m_data, $this->m_gih->m_nWidth);
|
||||
|
||||
$data =
|
||||
substr($data, 0, $y * $this->m_gih->m_nWidth) .
|
||||
$lne .
|
||||
substr($data, ($y + 1) * $this->m_gih->m_nWidth);
|
||||
}
|
||||
}
|
||||
|
||||
$this->m_data = $data;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class CGIF
|
||||
{
|
||||
var $m_gfh;
|
||||
var $m_lpData;
|
||||
var $m_img;
|
||||
var $m_bLoaded;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// CONSTRUCTOR
|
||||
function CGIF()
|
||||
{
|
||||
$this->m_gfh = new CGIFFILEHEADER();
|
||||
$this->m_img = new CGIFIMAGE();
|
||||
$this->m_lpData = "";
|
||||
$this->m_bLoaded = false;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
function ClearData() {
|
||||
$this->m_lpData = '';
|
||||
unSet($this->m_img->m_data);
|
||||
unSet($this->m_img->m_lzw->Next);
|
||||
unSet($this->m_img->m_lzw->Vals);
|
||||
unSet($this->m_img->m_lzw->Stack);
|
||||
unSet($this->m_img->m_lzw->Buf);
|
||||
}
|
||||
|
||||
function loadFile(&$data, $iIndex)
|
||||
{
|
||||
if($iIndex < 0) {
|
||||
return false;
|
||||
}
|
||||
$this->m_lpData = $data;
|
||||
|
||||
// GET FILE HEADER
|
||||
$len = 0;
|
||||
if(!$this->m_gfh->load($this->m_lpData, $len)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->m_lpData = substr($this->m_lpData, $len);
|
||||
|
||||
do {
|
||||
$imgLen = 0;
|
||||
if(!$this->m_img->load($this->m_lpData, $imgLen)) {
|
||||
return false;
|
||||
}
|
||||
$this->m_lpData = substr($this->m_lpData, $imgLen);
|
||||
}
|
||||
while($iIndex-- > 0);
|
||||
|
||||
$this->m_bLoaded = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
?>
|
723
inc/3rdparty/libraries/mpdf/classes/grad.php
vendored
Normal file
723
inc/3rdparty/libraries/mpdf/classes/grad.php
vendored
Normal file
|
@ -0,0 +1,723 @@
|
|||
<?php
|
||||
|
||||
class grad {
|
||||
|
||||
var $mpdf = null;
|
||||
|
||||
function grad(&$mpdf) {
|
||||
$this->mpdf = $mpdf;
|
||||
}
|
||||
|
||||
// mPDF 5.3.A1
|
||||
function CoonsPatchMesh($x, $y, $w, $h, $patch_array=array(), $x_min=0, $x_max=1, $y_min=0, $y_max=1, $colspace='RGB', $return=false){
|
||||
$s=' q ';
|
||||
$s.=sprintf(' %.3F %.3F %.3F %.3F re W n ', $x*_MPDFK, ($this->mpdf->h-$y)*_MPDFK, $w*_MPDFK, -$h*_MPDFK);
|
||||
$s.=sprintf(' %.3F 0 0 %.3F %.3F %.3F cm ', $w*_MPDFK, $h*_MPDFK, $x*_MPDFK, ($this->mpdf->h-($y+$h))*_MPDFK);
|
||||
$n = count($this->mpdf->gradients)+1;
|
||||
$this->mpdf->gradients[$n]['type'] = 6; //coons patch mesh
|
||||
$this->mpdf->gradients[$n]['colorspace'] = $colspace; //coons patch mesh
|
||||
$bpcd=65535; //16 BitsPerCoordinate
|
||||
$trans = false;
|
||||
$this->mpdf->gradients[$n]['stream']='';
|
||||
for($i=0;$i<count($patch_array);$i++){
|
||||
$this->mpdf->gradients[$n]['stream'].=chr($patch_array[$i]['f']); //start with the edge flag as 8 bit
|
||||
for($j=0;$j<count($patch_array[$i]['points']);$j++){
|
||||
//each point as 16 bit
|
||||
if (($j % 2) == 1) { // Y coordinate (adjusted as input is From top left)
|
||||
$patch_array[$i]['points'][$j]=(($patch_array[$i]['points'][$j]-$y_min)/($y_max-$y_min))*$bpcd;
|
||||
$patch_array[$i]['points'][$j]=$bpcd-$patch_array[$i]['points'][$j];
|
||||
}
|
||||
else {
|
||||
$patch_array[$i]['points'][$j]=(($patch_array[$i]['points'][$j]-$x_min)/($x_max-$x_min))*$bpcd;
|
||||
}
|
||||
if($patch_array[$i]['points'][$j]<0) $patch_array[$i]['points'][$j]=0;
|
||||
if($patch_array[$i]['points'][$j]>$bpcd) $patch_array[$i]['points'][$j]=$bpcd;
|
||||
$this->mpdf->gradients[$n]['stream'].=chr(floor($patch_array[$i]['points'][$j]/256));
|
||||
$this->mpdf->gradients[$n]['stream'].=chr(floor($patch_array[$i]['points'][$j]%256));
|
||||
}
|
||||
for($j=0;$j<count($patch_array[$i]['colors']);$j++){
|
||||
//each color component as 8 bit
|
||||
if ($colspace=='RGB') {
|
||||
$this->mpdf->gradients[$n]['stream'].=($patch_array[$i]['colors'][$j][1]);
|
||||
$this->mpdf->gradients[$n]['stream'].=($patch_array[$i]['colors'][$j][2]);
|
||||
$this->mpdf->gradients[$n]['stream'].=($patch_array[$i]['colors'][$j][3]);
|
||||
if (isset($patch_array[$i]['colors'][$j][4]) && ord($patch_array[$i]['colors'][$j][4])<100) { $trans = true; }
|
||||
}
|
||||
else if ($colspace=='CMYK') {
|
||||
$this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][1])*2.55);
|
||||
$this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][2])*2.55);
|
||||
$this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][3])*2.55);
|
||||
$this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][4])*2.55);
|
||||
if (isset($patch_array[$i]['colors'][$j][5]) && ord($patch_array[$i]['colors'][$j][5])<100) { $trans = true; }
|
||||
}
|
||||
else if ($colspace=='Gray') {
|
||||
$this->mpdf->gradients[$n]['stream'].=($patch_array[$i]['colors'][$j][1]);
|
||||
if ($patch_array[$i]['colors'][$j][2]==1) { $trans = true; } // transparency converted from rgba or cmyka()
|
||||
}
|
||||
}
|
||||
}
|
||||
// TRANSPARENCY
|
||||
if ($trans) {
|
||||
$this->mpdf->gradients[$n]['stream_trans']='';
|
||||
for($i=0;$i<count($patch_array);$i++){
|
||||
$this->mpdf->gradients[$n]['stream_trans'].=chr($patch_array[$i]['f']);
|
||||
for($j=0;$j<count($patch_array[$i]['points']);$j++){
|
||||
//each point as 16 bit
|
||||
$this->mpdf->gradients[$n]['stream_trans'].=chr(floor($patch_array[$i]['points'][$j]/256));
|
||||
$this->mpdf->gradients[$n]['stream_trans'].=chr(floor($patch_array[$i]['points'][$j]%256));
|
||||
}
|
||||
for($j=0;$j<count($patch_array[$i]['colors']);$j++){
|
||||
//each color component as 8 bit // OPACITY
|
||||
if ($colspace=='RGB') {
|
||||
$this->mpdf->gradients[$n]['stream_trans'].=chr(intval(ord($patch_array[$i]['colors'][$j][4])*2.55));
|
||||
}
|
||||
else if ($colspace=='CMYK') {
|
||||
$this->mpdf->gradients[$n]['stream_trans'].=chr(intval(ord($patch_array[$i]['colors'][$j][5])*2.55));
|
||||
}
|
||||
else if ($colspace=='Gray') {
|
||||
$this->mpdf->gradients[$n]['stream_trans'].=chr(intval(ord($patch_array[$i]['colors'][$j][3])*2.55));
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->mpdf->gradients[$n]['trans'] = true;
|
||||
$s .= ' /TGS'.$n.' gs ';
|
||||
}
|
||||
//paint the gradient
|
||||
$s .= '/Sh'.$n.' sh'."\n";
|
||||
//restore previous Graphic State
|
||||
$s .= 'Q'."\n";
|
||||
if ($return) { return $s; }
|
||||
else { $this->mpdf->_out($s); }
|
||||
}
|
||||
|
||||
|
||||
// type = linear:2; radial: 3;
|
||||
// Linear: $coords - array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg).
|
||||
// The default value is from left to right (x1=0, y1=0, x2=1, y2=0).
|
||||
// Radial: $coords - array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1,
|
||||
// (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg).
|
||||
// (fx, fy) should be inside the circle, otherwise some areas will not be defined
|
||||
// $col = array(R,G,B/255); or array(G/255); or array(C,M,Y,K/100)
|
||||
// $stops = array('col'=>$col [, 'opacity'=>0-1] [, 'offset'=>0-1])
|
||||
function Gradient($x, $y, $w, $h, $type, $stops=array(), $colorspace='RGB', $coords='', $extend='', $return=false, $is_mask=false) {
|
||||
if (strtoupper(substr($type,0,1)) == 'L') { $type = 2; } // linear
|
||||
else if (strtoupper(substr($type,0,1)) == 'R') { $type = 3; } // radial
|
||||
if ($colorspace != 'CMYK' && $colorspace != 'Gray') {
|
||||
$colorspace = 'RGB';
|
||||
}
|
||||
$bboxw = $w;
|
||||
$bboxh = $h;
|
||||
$usex = $x;
|
||||
$usey = $y;
|
||||
$usew = $bboxw;
|
||||
$useh = $bboxh;
|
||||
if ($type < 1) { $type = 2; }
|
||||
if ($coords[0]!==false && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$coords[0],$m)) {
|
||||
$tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false);
|
||||
if ($tmp) { $coords[0] = $tmp/$w; }
|
||||
}
|
||||
if ($coords[1]!==false && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$coords[1],$m)) {
|
||||
$tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false);
|
||||
if ($tmp) { $coords[1] = 1-($tmp/$h); }
|
||||
}
|
||||
// LINEAR
|
||||
if ($type == 2) {
|
||||
$angle = $coords[4];
|
||||
$repeat = $coords[5];
|
||||
// ALL POINTS SET (default for custom mPDF linear gradient) - no -moz
|
||||
if ($coords[0]!==false && $coords[1]!==false && $coords[2]!==false && $coords[3]!==false) {
|
||||
// do nothing - coords used as they are
|
||||
}
|
||||
|
||||
// If both a <point> and <angle> are defined, the gradient axis starts from the point and runs along the angle. The end point is
|
||||
// defined as before - in this case start points may not be in corners, and axis may not correctly fall in the right quadrant.
|
||||
// NO end points (Angle defined & Start points)
|
||||
else if ($angle!==false && $coords[0]!==false && $coords[1]!==false && $coords[2]===false && $coords[3]===false) {
|
||||
if ($angle==0 || $angle==360) { $coords[3]=$coords[1]; if ($coords[0]==1) $coords[2]=2; else $coords[2]=1; }
|
||||
else if ($angle==90) { $coords[2]=$coords[0]; $coords[3]=1; if ($coords[1]==1) $coords[3]=2; else $coords[3]=1; }
|
||||
else if ($angle==180) { if ($coords[4]==0) $coords[2]=-1; else $coords[2]=0; $coords[3]=$coords[1]; }
|
||||
else if ($angle==270) { $coords[2]=$coords[0]; if ($coords[1]==0) $coords[3]=-1; else $coords[3]=0; }
|
||||
else {
|
||||
$endx=1; $endy=1;
|
||||
if ($angle <=90) {
|
||||
if ($angle <=45) { $endy=tan(deg2rad($angle)); }
|
||||
else { $endx=tan(deg2rad(90-$angle)); }
|
||||
$b = atan2(($endy*$bboxh), ($endx*$bboxw));
|
||||
$ny = 1 - $coords[1] - (tan($b) * (1-$coords[0]));
|
||||
$tx = sin($b) * cos($b) * $ny;
|
||||
$ty = cos($b) * cos($b) * $ny;
|
||||
$coords[2] = 1+$tx; $coords[3] = 1-$ty;
|
||||
}
|
||||
else if ($angle <=180) {
|
||||
if ($angle <=135) { $endx=tan(deg2rad($angle-90)); }
|
||||
else { $endy=tan(deg2rad(180-$angle)); }
|
||||
$b = atan2(($endy*$bboxh), ($endx*$bboxw));
|
||||
$ny = 1 - $coords[1] - (tan($b) * ($coords[0]));
|
||||
$tx = sin($b) * cos($b) * $ny;
|
||||
$ty = cos($b) * cos($b) * $ny;
|
||||
$coords[2] = -$tx; $coords[3] = 1-$ty;
|
||||
}
|
||||
else if ($angle <=270) {
|
||||
if ($angle <=225) { $endy=tan(deg2rad($angle-180)); }
|
||||
else { $endx=tan(deg2rad(270-$angle)); }
|
||||
$b = atan2(($endy*$bboxh), ($endx*$bboxw));
|
||||
$ny = $coords[1] - (tan($b) * ($coords[0]));
|
||||
$tx = sin($b) * cos($b) * $ny;
|
||||
$ty = cos($b) * cos($b) * $ny;
|
||||
$coords[2] = -$tx; $coords[3] = $ty;
|
||||
}
|
||||
else {
|
||||
if ($angle <=315) { $endx=tan(deg2rad($angle-270)); }
|
||||
else { $endy=tan(deg2rad(360-$angle)); }
|
||||
$b = atan2(($endy*$bboxh), ($endx*$bboxw));
|
||||
$ny = $coords[1] - (tan($b) * (1-$coords[0]));
|
||||
$tx = sin($b) * cos($b) * $ny;
|
||||
$ty = cos($b) * cos($b) * $ny;
|
||||
$coords[2] = 1+$tx; $coords[3] = $ty;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -moz If the first parameter is only an <angle>, the gradient axis starts from the box's corner that would ensure the
|
||||
// axis goes through the box. The axis runs along the specified angle. The end point of the axis is defined such that the
|
||||
// farthest corner of the box from the starting point is perpendicular to the gradient axis at that point.
|
||||
// NO end points or Start points (Angle defined)
|
||||
else if ($angle!==false && $coords[0]===false && $coords[1]===false) {
|
||||
if ($angle==0 || $angle==360) { $coords[0]=0; $coords[1]=0; $coords[2]=1; $coords[3]=0; }
|
||||
else if ($angle==90) { $coords[0]=0; $coords[1]=0; $coords[2]=0; $coords[3]=1; }
|
||||
else if ($angle==180) { $coords[0]=1; $coords[1]=0; $coords[2]=0; $coords[3]=0; }
|
||||
else if ($angle==270) { $coords[0]=0; $coords[1]=1; $coords[2]=0; $coords[3]=0; }
|
||||
else {
|
||||
if ($angle <=90) {
|
||||
$coords[0]=0; $coords[1]=0;
|
||||
if ($angle <=45) { $endx=1; $endy=tan(deg2rad($angle)); }
|
||||
else { $endx=tan(deg2rad(90-$angle)); $endy=1; }
|
||||
}
|
||||
else if ($angle <=180) {
|
||||
$coords[0]=1; $coords[1]=0;
|
||||
if ($angle <=135) { $endx=tan(deg2rad($angle-90)); $endy=1; }
|
||||
else { $endx=1; $endy=tan(deg2rad(180-$angle)); }
|
||||
}
|
||||
else if ($angle <=270) {
|
||||
$coords[0]=1; $coords[1]=1;
|
||||
if ($angle <=225) { $endx=1; $endy=tan(deg2rad($angle-180)); }
|
||||
else { $endx=tan(deg2rad(270-$angle)); $endy=1; }
|
||||
}
|
||||
else {
|
||||
$coords[0]=0; $coords[1]=1;
|
||||
if ($angle <=315) { $endx=tan(deg2rad($angle-270)); $endy=1; }
|
||||
else { $endx=1; $endy=tan(deg2rad(360-$angle)); }
|
||||
}
|
||||
$b = atan2(($endy*$bboxh), ($endx*$bboxw));
|
||||
$h2 = $bboxh - ($bboxh * tan($b));
|
||||
$px = $bboxh + ($h2 * sin($b) * cos($b));
|
||||
$py = ($bboxh * tan($b)) + ($h2 * sin($b) * sin($b));
|
||||
$x1 = $px / $bboxh;
|
||||
$y1 = $py / $bboxh;
|
||||
if ($angle <=90) { $coords[2] = $x1; $coords[3] = $y1; }
|
||||
else if ($angle <=180) { $coords[2] = 1-$x1; $coords[3] = $y1; }
|
||||
else if ($angle <=270) { $coords[2] = 1-$x1; $coords[3] = 1-$y1; }
|
||||
else { $coords[2] = $x1; $coords[3] = 1-$y1; }
|
||||
}
|
||||
}
|
||||
// -moz If the first parameter to the gradient function is only a <point>, the gradient axis starts from the specified point,
|
||||
// and ends at the point you would get if you rotated the starting point by 180 degrees about the center of the box that the
|
||||
// gradient is to be applied to.
|
||||
// NO angle and NO end points (Start points defined)
|
||||
else if ((!isset($angle) || $angle===false) && $coords[0]!==false && $coords[1]!==false) { // should have start and end defined
|
||||
$coords[2] = 1-$coords[0]; $coords[3] = 1-$coords[1];
|
||||
$angle = rad2deg(atan2($coords[3]-$coords[1],$coords[2]-$coords[0]));
|
||||
if ($angle < 0) { $angle += 360; }
|
||||
else if ($angle > 360) { $angle -= 360; }
|
||||
if ($angle!=0 && $angle!=360 && $angle!=90 && $angle!=180 && $angle!=270) {
|
||||
if ($w >= $h) {
|
||||
$coords[1] *= $h/$w ;
|
||||
$coords[3] *= $h/$w ;
|
||||
$usew = $useh = $bboxw;
|
||||
$usey -= ($w-$h);
|
||||
}
|
||||
else {
|
||||
$coords[0] *= $w/$h ;
|
||||
$coords[2] *= $w/$h ;
|
||||
$usew = $useh = $bboxh;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -moz If neither a <point> or <angle> is specified, i.e. the entire function consists of only <stop> values, the gradient
|
||||
// axis starts from the top of the box and runs vertically downwards, ending at the bottom of the box.
|
||||
else { // default values T2B
|
||||
// All values are set in parseMozGradient - so won't appear here
|
||||
$coords = array(0,0,1,0); // default for original linear gradient (L2R)
|
||||
}
|
||||
$s = ' q';
|
||||
$s .= sprintf(' %.3F %.3F %.3F %.3F re W n', $x*_MPDFK, ($this->mpdf->h-$y)*_MPDFK, $w*_MPDFK, -$h*_MPDFK)."\n";
|
||||
$s .= sprintf(' %.3F 0 0 %.3F %.3F %.3F cm', $usew*_MPDFK, $useh*_MPDFK, $usex*_MPDFK, ($this->mpdf->h-($usey+$useh))*_MPDFK)."\n";
|
||||
}
|
||||
|
||||
// RADIAL
|
||||
else if ($type == 3) {
|
||||
$radius = $coords[4];
|
||||
$angle = $coords[5]; // ?? no effect
|
||||
$shape = $coords[6];
|
||||
$size = $coords[7];
|
||||
$repeat = $coords[8];
|
||||
// ALL POINTS AND RADIUS SET (default for custom mPDF radial gradient) - no -moz
|
||||
if ($coords[0]!==false && $coords[1]!==false && $coords[2]!==false && $coords[3]!==false && $coords[4]!==false) {
|
||||
// do nothing - coords used as they are
|
||||
}
|
||||
// If a <point> is defined
|
||||
else if ($shape!==false && $size!==false) {
|
||||
if ($coords[2]==false) { $coords[2] = $coords[0]; }
|
||||
if ($coords[3]==false) { $coords[3] = $coords[1]; }
|
||||
// ELLIPSE
|
||||
if ($shape=='ellipse') {
|
||||
$corner1 = sqrt(pow($coords[0],2) + pow($coords[1],2));
|
||||
$corner2 = sqrt(pow($coords[0],2) + pow((1-$coords[1]),2));
|
||||
$corner3 = sqrt(pow((1-$coords[0]),2) + pow($coords[1],2));
|
||||
$corner4 = sqrt(pow((1-$coords[0]),2) + pow((1-$coords[1]),2));
|
||||
if ($size=='closest-side') { $radius = min($coords[0], $coords[1], (1-$coords[0]), (1-$coords[1])); }
|
||||
else if ($size=='closest-corner') { $radius = min($corner1, $corner2, $corner3, $corner4); }
|
||||
else if ($size=='farthest-side') { $radius = max($coords[0], $coords[1], (1-$coords[0]), (1-$coords[1])); }
|
||||
else { $radius = max($corner1, $corner2, $corner3, $corner4); } // farthest corner (default)
|
||||
}
|
||||
// CIRCLE
|
||||
else if ($shape=='circle') {
|
||||
if ($w >= $h) {
|
||||
$coords[1] = $coords[3] = ($coords[1] * $h/$w) ;
|
||||
$corner1 = sqrt(pow($coords[0],2) + pow($coords[1],2));
|
||||
$corner2 = sqrt(pow($coords[0],2) + pow((($h/$w)-$coords[1]),2));
|
||||
$corner3 = sqrt(pow((1-$coords[0]),2) + pow($coords[1],2));
|
||||
$corner4 = sqrt(pow((1-$coords[0]),2) + pow((($h/$w)-$coords[1]),2));
|
||||
if ($size=='closest-side') { $radius = min($coords[0], $coords[1], (1-$coords[0]), (($h/$w)-$coords[1])); }
|
||||
else if ($size=='closest-corner') { $radius = min($corner1, $corner2, $corner3, $corner4); }
|
||||
else if ($size=='farthest-side') { $radius = max($coords[0], $coords[1], (1-$coords[0]), (($h/$w)-$coords[1])); }
|
||||
else if ($size=='farthest-corner') { $radius = max($corner1, $corner2, $corner3, $corner4); } // farthest corner (default)
|
||||
$usew = $useh = $bboxw;
|
||||
$usey -= ($w-$h);
|
||||
}
|
||||
else {
|
||||
$coords[0] = $coords[2] = ($coords[0] * $w/$h) ;
|
||||
$corner1 = sqrt(pow($coords[0],2) + pow($coords[1],2));
|
||||
$corner2 = sqrt(pow($coords[0],2) + pow((1-$coords[1]),2));
|
||||
$corner3 = sqrt(pow((($w/$h)-$coords[0]),2) + pow($coords[1],2));
|
||||
$corner4 = sqrt(pow((($w/$h)-$coords[0]),2) + pow((1-$coords[1]),2));
|
||||
if ($size=='closest-side') { $radius = min($coords[0], $coords[1], (($w/$h)-$coords[0]), (1-$coords[1])); }
|
||||
else if ($size=='closest-corner') { $radius = min($corner1, $corner2, $corner3, $corner4); }
|
||||
else if ($size=='farthest-side') { $radius = max($coords[0], $coords[1], (($w/$h)-$coords[0]), (1-$coords[1])); }
|
||||
else if ($size=='farthest-corner') { $radius = max($corner1, $corner2, $corner3, $corner4); } // farthest corner (default)
|
||||
$usew = $useh = $bboxh;
|
||||
}
|
||||
}
|
||||
if ($radius==0) { $radius=0.001; } // to prevent error
|
||||
$coords[4] = $radius;
|
||||
}
|
||||
|
||||
// -moz If entire function consists of only <stop> values
|
||||
else { // default values
|
||||
// All values are set in parseMozGradient - so won't appear here
|
||||
$coords = array(0.5,0.5,0.5,0.5); // default for radial gradient (centred)
|
||||
}
|
||||
$s = ' q';
|
||||
$s .= sprintf(' %.3F %.3F %.3F %.3F re W n', $x*_MPDFK, ($this->mpdf->h-$y)*_MPDFK, $w*_MPDFK, -$h*_MPDFK)."\n";
|
||||
$s .= sprintf(' %.3F 0 0 %.3F %.3F %.3F cm', $usew*_MPDFK, $useh*_MPDFK, $usex*_MPDFK, ($this->mpdf->h-($usey+$useh))*_MPDFK)."\n";
|
||||
}
|
||||
|
||||
$n = count($this->mpdf->gradients) + 1;
|
||||
$this->mpdf->gradients[$n]['type'] = $type;
|
||||
$this->mpdf->gradients[$n]['colorspace'] = $colorspace;
|
||||
$trans = false;
|
||||
$this->mpdf->gradients[$n]['is_mask'] = $is_mask;
|
||||
if ($is_mask) { $trans = true; }
|
||||
if (count($stops) == 1) { $stops[1] = $stops[0]; }
|
||||
if (!isset($stops[0]['offset'])) { $stops[0]['offset'] = 0; }
|
||||
if (!isset($stops[(count($stops)-1)]['offset'])) { $stops[(count($stops)-1)]['offset'] = 1; }
|
||||
|
||||
// Fix stop-offsets set as absolute lengths
|
||||
if ($type==2) {
|
||||
$axisx = ($coords[2]-$coords[0])*$usew;
|
||||
$axisy = ($coords[3]-$coords[1])*$useh;
|
||||
$axis_length = sqrt(pow($axisx,2) + pow($axisy,2));
|
||||
}
|
||||
else { $axis_length = $coords[4]*$usew; } // Absolute lengths are meaningless for an ellipse - Firefox uses Width as reference
|
||||
|
||||
for($i=0;$i<count($stops);$i++) {
|
||||
if (isset($stops[$i]['offset']) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$stops[$i]['offset'],$m)) {
|
||||
$tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false);
|
||||
$stops[$i]['offset'] = $tmp/$axis_length;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (isset($stops[0]['offset']) && $stops[0]['offset']>0) {
|
||||
$firststop = $stops[0];
|
||||
$firststop['offset'] = 0;
|
||||
array_unshift($stops, $firststop);
|
||||
}
|
||||
if (!$repeat && isset($stops[(count($stops)-1)]['offset']) && $stops[(count($stops)-1)]['offset']<1) {
|
||||
$endstop = $stops[(count($stops)-1)];
|
||||
$endstop['offset'] = 1;
|
||||
$stops[] = $endstop;
|
||||
}
|
||||
if ($stops[0]['offset'] > $stops[(count($stops)-1)]['offset']) {
|
||||
$stops[0]['offset'] = 0;
|
||||
$stops[(count($stops)-1)]['offset'] = 1;
|
||||
}
|
||||
|
||||
for($i=0;$i<count($stops);$i++) {
|
||||
// mPDF 5.3.74
|
||||
if ($colorspace == 'CMYK') {
|
||||
$this->mpdf->gradients[$n]['stops'][$i]['col'] = sprintf('%.3F %.3F %.3F %.3F', (ord($stops[$i]['col']{1})/100), (ord($stops[$i]['col']{2})/100), (ord($stops[$i]['col']{3})/100), (ord($stops[$i]['col']{4})/100));
|
||||
}
|
||||
else if ($colorspace == 'Gray') {
|
||||
$this->mpdf->gradients[$n]['stops'][$i]['col'] = sprintf('%.3F', (ord($stops[$i]['col']{1})/255));
|
||||
}
|
||||
else {
|
||||
$this->mpdf->gradients[$n]['stops'][$i]['col'] = sprintf('%.3F %.3F %.3F', (ord($stops[$i]['col']{1})/255), (ord($stops[$i]['col']{2})/255), (ord($stops[$i]['col']{3})/255));
|
||||
}
|
||||
if (!isset($stops[$i]['opacity'])) { $stops[$i]['opacity'] = 1; }
|
||||
else if ($stops[$i]['opacity'] > 1 || $stops[$i]['opacity'] < 0) { $stops[$i]['opacity'] = 1; }
|
||||
else if ($stops[$i]['opacity'] < 1) {
|
||||
$trans = true;
|
||||
}
|
||||
$this->mpdf->gradients[$n]['stops'][$i]['opacity'] = $stops[$i]['opacity'];
|
||||
// OFFSET
|
||||
if ($i>0 && $i<(count($stops)-1)) {
|
||||
if (!isset($stops[$i]['offset']) || (isset($stops[$i+1]['offset']) && $stops[$i]['offset']>$stops[$i+1]['offset']) || $stops[$i]['offset']<$stops[$i-1]['offset']) {
|
||||
if (isset($stops[$i-1]['offset']) && isset($stops[$i+1]['offset'])) {
|
||||
$stops[$i]['offset'] = ($stops[$i-1]['offset']+$stops[$i+1]['offset'])/2;
|
||||
}
|
||||
else {
|
||||
for($j=($i+1);$j<count($stops);$j++) {
|
||||
if(isset($stops[$j]['offset'])) { break; }
|
||||
}
|
||||
$int = ($stops[$j]['offset'] - $stops[($i-1)]['offset'])/($j-$i+1);
|
||||
for($f=0;$f<($j-$i-1);$f++) {
|
||||
$stops[($i+$f)]['offset'] = $stops[($i+$f-1)]['offset'] + ($int);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->mpdf->gradients[$n]['stops'][$i]['offset'] = $stops[$i]['offset'];
|
||||
$this->mpdf->gradients[$n]['stops'][$i]['offset'] = $stops[$i]['offset'];
|
||||
}
|
||||
|
||||
if ($repeat) {
|
||||
$ns = count($this->mpdf->gradients[$n]['stops']);
|
||||
$offs = array();
|
||||
for($i=0;$i<$ns;$i++) {
|
||||
$offs[$i] = $this->mpdf->gradients[$n]['stops'][$i]['offset'];
|
||||
}
|
||||
$gp = 0;
|
||||
$inside=true;
|
||||
while($inside) {
|
||||
$gp++;
|
||||
for($i=0;$i<$ns;$i++) {
|
||||
$this->mpdf->gradients[$n]['stops'][(($ns*$gp)+$i)] = $this->mpdf->gradients[$n]['stops'][(($ns*($gp-1))+$i)];
|
||||
$tmp = $this->mpdf->gradients[$n]['stops'][(($ns*($gp-1))+($ns-1))]['offset']+$offs[$i] ;
|
||||
if ($tmp < 1) { $this->mpdf->gradients[$n]['stops'][(($ns*$gp)+$i)]['offset'] = $tmp; }
|
||||
else {
|
||||
$this->mpdf->gradients[$n]['stops'][(($ns*$gp)+$i)]['offset'] = 1;
|
||||
$inside = false;
|
||||
break(2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($trans) {
|
||||
$this->mpdf->gradients[$n]['trans'] = true;
|
||||
$s .= ' /TGS'.$n.' gs ';
|
||||
}
|
||||
if (!is_array($extend) || count($extend) <1) {
|
||||
$extend=array('true', 'true'); // These are supposed to be quoted - appear in PDF file as text
|
||||
}
|
||||
$this->mpdf->gradients[$n]['coords'] = $coords;
|
||||
$this->mpdf->gradients[$n]['extend'] = $extend;
|
||||
//paint the gradient
|
||||
$s .= '/Sh'.$n.' sh '."\n";
|
||||
//restore previous Graphic State
|
||||
$s .= ' Q '."\n";
|
||||
if ($return) { return $s; }
|
||||
else { $this->mpdf->_out($s); }
|
||||
}
|
||||
|
||||
|
||||
function parseMozGradient($bg) {
|
||||
// background[-image]: -moz-linear-gradient(left, #c7Fdde 20%, #FF0000 );
|
||||
// background[-image]: linear-gradient(left, #c7Fdde 20%, #FF0000 ); // CSS3
|
||||
if (preg_match('/repeating-/',$bg)) { $repeat = true; }
|
||||
else { $repeat = false; }
|
||||
if (preg_match('/linear-gradient\((.*)\)/',$bg,$m)) {
|
||||
$g = array();
|
||||
$g['type'] = 2;
|
||||
$g['colorspace'] = 'RGB';
|
||||
$g['extend'] = array('true','true');
|
||||
$v = trim($m[1]);
|
||||
// Change commas inside e.g. rgb(x,x,x)
|
||||
while(preg_match('/(\([^\)]*?),/',$v)) { $v = preg_replace('/(\([^\)]*?),/','\\1@',$v); }
|
||||
// Remove spaces inside e.g. rgb(x, x, x)
|
||||
while(preg_match('/(\([^\)]*?)[ ]/',$v)) { $v = preg_replace('/(\([^\)]*?)[ ]/','\\1',$v); }
|
||||
$bgr = preg_split('/\s*,\s*/',$v);
|
||||
for($i=0;$i<count($bgr);$i++) { $bgr[$i] = preg_replace('/@/', ',', $bgr[$i]); }
|
||||
// Is first part $bgr[0] a valid point/angle?
|
||||
$first = preg_split('/\s+/',trim($bgr[0]));
|
||||
if (preg_match('/(left|center|right|bottom|top|deg|grad|rad)/i',$bgr[0]) && !preg_match('/(<#|rgb|rgba|hsl|hsla)/i',$bgr[0])) {
|
||||
$startStops = 1;
|
||||
}
|
||||
else if (trim($first[(count($first)-1)]) === "0") {
|
||||
$startStops = 1;
|
||||
}
|
||||
else {
|
||||
$check = $this->mpdf->ConvertColor($first[0]);
|
||||
if ($check) $startStops = 0;
|
||||
else $startStops = 1;
|
||||
}
|
||||
// first part a valid point/angle?
|
||||
if ($startStops == 1) { // default values
|
||||
// [<point> || <angle>,] = [<% em px left center right bottom top> || <deg grad rad 0>,]
|
||||
if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad)/i',$bgr[0],$m)) {
|
||||
$angle = $m[1] + 0;
|
||||
if (strtolower($m[2])=='deg') { $angle = $angle; }
|
||||
else if (strtolower($m[2])=='grad') { $angle *= (360/400); }
|
||||
else if (strtolower($m[2])=='rad') { $angle = rad2deg($angle); }
|
||||
while($angle < 0) { $angle += 360; }
|
||||
$angle = ($angle % 360);
|
||||
}
|
||||
else if (trim($first[(count($first)-1)]) === "0") { $angle = 0; }
|
||||
if (preg_match('/left/i',$bgr[0])) { $startx = 0; }
|
||||
else if (preg_match('/right/i',$bgr[0])) { $startx = 1; }
|
||||
if (preg_match('/top/i',$bgr[0])) { $starty = 1; }
|
||||
else if (preg_match('/bottom/i',$bgr[0])) { $starty = 0; }
|
||||
// Check for %? ?% or %%
|
||||
if (preg_match('/(\d+)[%]/i',$first[0],$m)) { $startx = $m[1]/100; }
|
||||
else if (!isset($startx) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$first[0],$m)) {
|
||||
$tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false);
|
||||
if ($tmp) { $startx = $m[1]; }
|
||||
}
|
||||
if (isset($first[1]) && preg_match('/(\d+)[%]/i',$first[1],$m)) { $starty = 1 - ($m[1]/100); }
|
||||
else if (!isset($starty) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$first[1],$m)) {
|
||||
$tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false);
|
||||
if ($tmp) { $starty = $m[1]; }
|
||||
}
|
||||
if (isset($startx) && !isset($starty)) { $starty = 0.5; }
|
||||
if (!isset($startx) && isset($starty)) { $startx = 0.5; }
|
||||
|
||||
}
|
||||
// If neither a <point> or <angle> is specified, i.e. the entire function consists of only <stop> values, the gradient axis starts from the top of the box and runs vertically downwards, ending at the bottom of the box.
|
||||
else { // default values T2B
|
||||
$starty = 1; $startx = 0.5;
|
||||
$endy = 0; $endx = 0.5;
|
||||
}
|
||||
$coords = array();
|
||||
if (!isset($startx)) { $startx = false; }
|
||||
if (!isset($starty)) { $starty = false; }
|
||||
if (!isset($endx)) { $endx = false; }
|
||||
if (!isset($endy)) { $endy = false; }
|
||||
if (!isset($angle)) { $angle = false; }
|
||||
$g['coords'] = array($startx ,$starty ,$endx ,$endy, $angle, $repeat );
|
||||
$g['stops'] = array();
|
||||
for($i=$startStops;$i<count($bgr);$i++) {
|
||||
$stop = array();
|
||||
// parse stops
|
||||
$el = preg_split('/\s+/',trim($bgr[$i]));
|
||||
// mPDF 5.3.74
|
||||
$col = $this->mpdf->ConvertColor($el[0]);
|
||||
if ($col) { $stop['col'] = $col; }
|
||||
else { $stop['col'] = $col = $this->mpdf->ConvertColor(255); }
|
||||
if ($col{0}==1) $g['colorspace'] = 'Gray';
|
||||
else if ($col{0}==4 || $col{0}==6) $g['colorspace'] = 'CMYK';
|
||||
if ($col{0}==5) { $stop['opacity'] = ord($col{4})/100; } // transparency from rgba()
|
||||
else if ($col{0}==6) { $stop['opacity'] = ord($col{5})/100; } // transparency from cmyka()
|
||||
else if ($col{0}==1 && $col{2}==1) { $stop['opacity'] = ord($col{3})/100; } // transparency converted from rgba or cmyka()
|
||||
|
||||
if (isset($el[1]) && preg_match('/(\d+)[%]/',$el[1],$m)) {
|
||||
$stop['offset'] = $m[1]/100;
|
||||
if ($stop['offset']>1) { unset($stop['offset']); }
|
||||
}
|
||||
else if (isset($el[1]) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$el[1],$m)) {
|
||||
$tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false);
|
||||
if ($tmp) { $stop['offset'] = $m[1]; }
|
||||
}
|
||||
$g['stops'][] = $stop;
|
||||
}
|
||||
if (count($g['stops'] )) { return $g; }
|
||||
}
|
||||
else if (preg_match('/radial-gradient\((.*)\)/',$bg,$m)) {
|
||||
$g = array();
|
||||
$g['type'] = 3;
|
||||
$g['colorspace'] = 'RGB';
|
||||
$g['extend'] = array('true','true');
|
||||
$v = trim($m[1]);
|
||||
// Change commas inside e.g. rgb(x,x,x)
|
||||
while(preg_match('/(\([^\)]*?),/',$v)) { $v = preg_replace('/(\([^\)]*?),/','\\1@',$v); }
|
||||
// Remove spaces inside e.g. rgb(x, x, x)
|
||||
while(preg_match('/(\([^\)]*?)[ ]/',$v)) { $v = preg_replace('/(\([^\)]*?)[ ]/','\\1',$v); }
|
||||
$bgr = preg_split('/\s*,\s*/',$v);
|
||||
for($i=0;$i<count($bgr);$i++) { $bgr[$i] = preg_replace('/@/', ',', $bgr[$i]); }
|
||||
|
||||
// Is first part $bgr[0] a valid point/angle?
|
||||
$startStops = 0;
|
||||
$pos_angle = false;
|
||||
$shape_size = false;
|
||||
$first = preg_split('/\s+/',trim($bgr[0]));
|
||||
$checkCol = $this->mpdf->ConvertColor($first[0]);
|
||||
if (preg_match('/(left|center|right|bottom|top|deg|grad|rad)/i',$bgr[0]) && !preg_match('/(<#|rgb|rgba|hsl|hsla)/i',$bgr[0])) {
|
||||
$startStops=1;
|
||||
$pos_angle = $bgr[0];
|
||||
}
|
||||
else if (trim($first[(count($first)-1)]) === "0") {
|
||||
$startStops=1;
|
||||
$pos_angle = $bgr[0];
|
||||
}
|
||||
else if (preg_match('/(circle|ellipse|closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/i',$bgr[0])) {
|
||||
$startStops=1;
|
||||
$shape_size = $bgr[0];
|
||||
}
|
||||
else if (!$checkCol) {
|
||||
$startStops=1;
|
||||
$pos_angle = $bgr[0];
|
||||
}
|
||||
if (preg_match('/(circle|ellipse|closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/i',$bgr[1])) {
|
||||
$startStops=2;
|
||||
$shape_size = $bgr[1];
|
||||
}
|
||||
|
||||
// If valid point/angle?
|
||||
if ($pos_angle) { // default values
|
||||
// [<point> || <angle>,] = [<% em px left center right bottom top> || <deg grad rad 0>,]
|
||||
if (preg_match('/left/i',$pos_angle)) { $startx = 0; }
|
||||
else if (preg_match('/right/i',$pos_angle)) { $startx = 1; }
|
||||
if (preg_match('/top/i',$pos_angle)) { $starty = 1; }
|
||||
else if (preg_match('/bottom/i',$pos_angle)) { $starty = 0; }
|
||||
// Check for %? ?% or %%
|
||||
if (preg_match('/(\d+)[%]/i',$first[0],$m)) { $startx = $m[1]/100; }
|
||||
else if (!isset($startx) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$first[0],$m)) {
|
||||
$tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false);
|
||||
if ($tmp) { $startx = $m[1]; }
|
||||
}
|
||||
if (isset($first[1]) && preg_match('/(\d+)[%]/i',$first[1],$m)) { $starty = 1 - ($m[1]/100); }
|
||||
else if (!isset($starty) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$first[1],$m)) {
|
||||
$tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false);
|
||||
if ($tmp) { $starty = $m[1]; }
|
||||
}
|
||||
|
||||
/*
|
||||
// ?? Angle has no effect in radial gradient (does not exist in CSS3 spec.)
|
||||
if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad)/i',$pos_angle,$m)) {
|
||||
$angle = $m[1] + 0;
|
||||
if (strtolower($m[2])=='deg') { $angle = $angle; }
|
||||
else if (strtolower($m[2])=='grad') { $angle *= (360/400); }
|
||||
else if (strtolower($m[2])=='rad') { $angle = rad2deg($angle); }
|
||||
while($angle < 0) { $angle += 360; }
|
||||
$angle = ($angle % 360);
|
||||
}
|
||||
*/
|
||||
if (!isset($starty)) { $starty = 0.5; }
|
||||
if (!isset($startx)) { $startx = 0.5; }
|
||||
|
||||
}
|
||||
// If neither a <point> or <angle> is specified, i.e. the entire function consists of only <stop> values, the gradient axis starts from the top of the box and runs vertically downwards, ending at the bottom of the box.
|
||||
else { // default values Center
|
||||
$starty = 0.5; $startx = 0.5;
|
||||
$endy = 0.5; $endx = 0.5;
|
||||
}
|
||||
|
||||
// If valid shape/size?
|
||||
$shape = 'ellipse'; // default
|
||||
$size = 'farthest-corner'; // default
|
||||
if ($shape_size) { // default values
|
||||
if (preg_match('/(circle|ellipse)/i',$shape_size, $m)) {
|
||||
$shape = $m[1];
|
||||
}
|
||||
if (preg_match('/(closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/i',$shape_size, $m)) {
|
||||
$size = $m[1];
|
||||
if ($size=='contain') { $size = 'closest-side'; }
|
||||
else if ($size=='cover') { $size = 'farthest-corner'; }
|
||||
}
|
||||
}
|
||||
|
||||
$coords = array();
|
||||
if (!isset($startx)) { $startx = false; }
|
||||
if (!isset($starty)) { $starty = false; }
|
||||
if (!isset($endx)) { $endx = false; }
|
||||
if (!isset($endy)) { $endy = false; }
|
||||
if (!isset($radius)) { $radius = false; }
|
||||
if (!isset($angle)) { $angle = 0; }
|
||||
$g['coords'] = array($startx ,$starty ,$endx ,$endy, $radius, $angle, $shape, $size, $repeat );
|
||||
|
||||
$g['stops'] = array();
|
||||
for($i=$startStops;$i<count($bgr);$i++) {
|
||||
$stop = array();
|
||||
// parse stops
|
||||
$el = preg_split('/\s+/',trim($bgr[$i]));
|
||||
// mPDF 5.3.74
|
||||
$col = $this->mpdf->ConvertColor($el[0]);
|
||||
if ($col) { $stop['col'] = $col; }
|
||||
else { $stop['col'] = $col = $this->mpdf->ConvertColor(255); }
|
||||
if ($col{0}==1) $g['colorspace'] = 'Gray';
|
||||
else if ($col{0}==4 || $col{0}==6) $g['colorspace'] = 'CMYK';
|
||||
if ($col{0}==5) { $stop['opacity'] = ord($col{4})/100; } // transparency from rgba()
|
||||
else if ($col{0}==6) { $stop['opacity'] = ord($col{5})/100; } // transparency from cmyka()
|
||||
else if ($col{0}==1 && $col{2}==1) { $stop['opacity'] = ord($col{3})/100; } // transparency converted from rgba or cmyka()
|
||||
|
||||
if (isset($el[1]) && preg_match('/(\d+)[%]/',$el[1],$m)) {
|
||||
$stop['offset'] = $m[1]/100;
|
||||
if ($stop['offset']>1) { unset($stop['offset']); }
|
||||
}
|
||||
else if (isset($el[1]) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$el[1],$m)) {
|
||||
$tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false);
|
||||
$stop['offset'] = $el[1];
|
||||
}
|
||||
$g['stops'][] = $stop;
|
||||
}
|
||||
if (count($g['stops'] )) { return $g; }
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
function parseBackgroundGradient($bg) {
|
||||
// background-gradient: linear #00FFFF #FFFF00 0 0.5 1 0.5; or
|
||||
// background-gradient: radial #00FFFF #FFFF00 0.5 0.5 1 1 1.2;
|
||||
|
||||
$v = trim($bg);
|
||||
$bgr = preg_split('/\s+/',$v);
|
||||
$g = array();
|
||||
if (count($bgr)> 6) {
|
||||
if (strtoupper(substr($bgr[0],0,1)) == 'L' && count($bgr)==7) { // linear
|
||||
$g['type'] = 2;
|
||||
//$coords = array(0,0,1,1 ); // 0 0 1 0 or 0 1 1 1 is L 2 R; 1,1,0,1 is R2L; 1,1,1,0 is T2B; 1,0,1,1 is B2T
|
||||
// Linear: $coords - array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg).
|
||||
// The default value is from left to right (x1=0, y1=0, x2=1, y2=0).
|
||||
$g['coords'] = array($bgr[3], $bgr[4], $bgr[5], $bgr[6]);
|
||||
}
|
||||
else if (count($bgr)==8) { // radial
|
||||
$g['type'] = 3;
|
||||
// Radial: $coords - array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1,
|
||||
// (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg).
|
||||
// (fx, fy) should be inside the circle, otherwise some areas will not be defined
|
||||
$g['coords'] = array($bgr[3], $bgr[4], $bgr[5], $bgr[6], $bgr[7]);
|
||||
}
|
||||
$g['colorspace'] = 'RGB';
|
||||
// mPDF 5.3.74
|
||||
$cor = $this->mpdf->ConvertColor($bgr[1]);
|
||||
if ($cor{0}==1) $g['colorspace'] = 'Gray';
|
||||
else if ($cor{0}==4 || $cor{0}==6) $g['colorspace'] = 'CMYK';
|
||||
if ($cor) { $g['col'] = $cor; }
|
||||
else { $g['col'] = $this->mpdf->ConvertColor(255); }
|
||||
$cor = $this->mpdf->ConvertColor($bgr[2]);
|
||||
if ($cor) { $g['col2'] = $cor; }
|
||||
else { $g['col2'] = $this->mpdf->ConvertColor(255); }
|
||||
$g['extend'] = array('true','true');
|
||||
$g['stops'] = array(array('col'=>$g['col'], 'opacity'=>1, 'offset'=>0), array('col'=>$g['col2'], 'opacity'=>1, 'offset'=>1));
|
||||
return $g;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
433
inc/3rdparty/libraries/mpdf/classes/indic.php
vendored
Normal file
433
inc/3rdparty/libraries/mpdf/classes/indic.php
vendored
Normal file
|
@ -0,0 +1,433 @@
|
|||
<?php
|
||||
|
||||
class indic {
|
||||
|
||||
function indic() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
function substituteIndic($earr, $lang, $font) {
|
||||
global $voltdata;
|
||||
|
||||
if (!isset($voltdata[$font])) {
|
||||
include_once(_MPDF_PATH.'includes/'.$font.'.volt.php');
|
||||
$voltdata[$font] = $volt;
|
||||
}
|
||||
|
||||
foreach($earr as $eid=>$char) {
|
||||
$earr[$eid] = sprintf("%04s", strtoupper(dechex($char)));
|
||||
}
|
||||
$vstr = "0020 ".implode(" ",$earr)." 0020";
|
||||
//============================
|
||||
// Common Indic Punctuation marks
|
||||
// If NOT devanagari
|
||||
if ($lang!='hi') {
|
||||
$vstr = str_replace('0964','007C', $vstr); // U+0964 replace with "|"
|
||||
$vstr = str_replace('0965','007C 007C', $vstr); // U+0964 replace with "|"
|
||||
}
|
||||
//============================
|
||||
// Tamil numeral for Zero missing Added mPDF 4.2
|
||||
if ($lang=='ta') {
|
||||
$vstr = str_replace('0BE6','0030', $vstr); // U+0BEB replace with "0"
|
||||
}
|
||||
|
||||
//============================
|
||||
// Re-order vowels
|
||||
|
||||
// DEVANAGARI vowel sign matraI[093F] before consonant
|
||||
if ($lang=='hi') {
|
||||
$prebasedvowels = "(093F)";
|
||||
$nukta = "093C";
|
||||
$halant = "094D";
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT == VIRAMA
|
||||
}
|
||||
|
||||
// BENGALI vowels [09BF 09C7 09C8]
|
||||
else if ($lang=='bn') {
|
||||
|
||||
// Khanda Ta 09CE not in font -> replace with 09A4|09CD
|
||||
$vstr = preg_replace('/09CE/','09A4 09CD 200D', $vstr); // mPDF 5.3.09
|
||||
|
||||
// BENGALI double-part vowels [09CB 09C7 09BE][09CC 09C7 09D7]
|
||||
$vstr = str_replace('09CB','09C7 09BE', $vstr); // convert to 2 parts
|
||||
$vstr = str_replace('09CC','09C7 09D7', $vstr); // 09C7 pre-based is then shifted below
|
||||
$prebasedvowels = "(09BF|09C7|09C8)";
|
||||
$nukta = "09BC";
|
||||
$halant = "09CD";
|
||||
// mPDF 5.0.044
|
||||
$bnfullcons = "0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF";
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT
|
||||
// mPDF 5.0.044
|
||||
// .. and shifting left-based vowel further to the left in case 3 consonants together.
|
||||
$vstr = preg_replace('/('.$bnfullcons.') '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr);
|
||||
|
||||
// mPDF 5.0.044
|
||||
// If left-based vowel has now been shifted to left of RA/Halant (09B0/09CD)
|
||||
// Convert here to above-line form (E068) as it would get missed later
|
||||
// e.g. 09B0 09CD 09AD 09C7 would be changed above =>
|
||||
// e.g. 09C7 09B0 09CD 09AD. The 09B0 09CD should => E068
|
||||
// ??? need to add 09BF as well (09BF|09C7|09C8)
|
||||
$vstr = preg_replace('/(09C7|09C8) 09B0 09CD/', '\\1 E068', $vstr);
|
||||
|
||||
}
|
||||
|
||||
// GUJARATI pre-based vowel [0ABF]
|
||||
else if ($lang=='gu') {
|
||||
$prebasedvowels = "(0ABF)";
|
||||
$nukta = "0ABC";
|
||||
$halant = "0ACD";
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT
|
||||
}
|
||||
|
||||
// GURMUKHI/PUNJABI pre-based vowel [0ABF]
|
||||
else if ($lang=='pa') {
|
||||
$prebasedvowels = "(0A3F)";
|
||||
$nukta = "0A3C";
|
||||
$halant = "0A4D";
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT
|
||||
}
|
||||
|
||||
// TAMIL pre-based vowel [0ABF]
|
||||
else if ($lang=='ta') {
|
||||
// Shrii (Shree)
|
||||
$vstr = preg_replace('/0BB6 0BCD 0BB0 0BC0/','E04B', $vstr);
|
||||
|
||||
// TAMIL double-part vowels [0BCA 0BC6 0BBE][0BCB 0BC7 0BBE][0BCC 0BC6 0BD7]
|
||||
$vstr = preg_replace('/0BCA/','0BC6 0BBE', $vstr); // convert to 2 parts
|
||||
$vstr = preg_replace('/0BCB/','0BC7 0BBE', $vstr); // pre-based is then shifted below
|
||||
$vstr = preg_replace('/0BCC/','0BC6 0BD7', $vstr);
|
||||
$prebasedvowels = "(0BC6|0BC7|0BC8)";
|
||||
// No nukta
|
||||
$halant = "0BCD"; // Doesn't seem to move most in front of halanted consonants
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left
|
||||
// ? Only for special case KSS (already moved to left of 0BB7)
|
||||
$vstr = preg_replace('/0B95 '.$halant.' '.$prebasedvowels.' 0BB7/','\\1 0B95 '.$halant.' 0BB7', $vstr);
|
||||
}
|
||||
|
||||
// ORIYA
|
||||
else if ($lang=='or') {
|
||||
// ORIYA double-part vowels []
|
||||
$vstr = str_replace('0B48','0B47 0B56', $vstr); // 2-part Vowel
|
||||
$vstr = str_replace('0B4B','0B47 0B3E', $vstr); // 2-part Vowel
|
||||
$vstr = str_replace('0B4C','0B47 0B57', $vstr); // 2-part Vowel
|
||||
$orprebasedvowels = "(0B47)";
|
||||
// No nukta
|
||||
$halant = "0B4D";
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$orprebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$orprebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$orprebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT
|
||||
}
|
||||
|
||||
// MALAYALAM
|
||||
else if ($lang=='ml') {
|
||||
// Chillus - old forms - remove ZWNJ after
|
||||
// This font Volt rules recognises e.g. "Na Halant(Virama)" as ChilluN
|
||||
$vstr = preg_replace('/(0D23 0D4D|0D28 0D4D|0D30 0D4D|0D32 0D4D|0D33 0D4D) 200D/','\\1', $vstr);
|
||||
// See Chillus in Unicode [http://en.wikipedia.org/wiki/Malayalam_script]
|
||||
$vstr = str_replace('0D7A','0D23 0D4D', $vstr); // [mlymChilluNn]
|
||||
$vstr = str_replace('0D7B','0D28 0D4D', $vstr); // [mlymChilluN]
|
||||
$vstr = str_replace('0D7C','0D30 0D4D', $vstr); // [mlymChilluR]
|
||||
$vstr = str_replace('0D7D','0D32 0D4D', $vstr); // [mlymChilluL]
|
||||
$vstr = str_replace('0D7E','0D33 0D4D', $vstr); // [mlymChilluLl]
|
||||
/*
|
||||
// Chillus - 0D7A-0D7E not in font directly, but as E005-E009
|
||||
$vstr = preg_replace('/0D23 0D4D 200D/','0D7A', $vstr);
|
||||
$vstr = preg_replace('/0D28 0D4D 200D/','0D7B', $vstr);
|
||||
$vstr = preg_replace('/0D30 0D4D 200D/','0D7C', $vstr);
|
||||
$vstr = preg_replace('/0D32 0D4D 200D/','0D7D', $vstr);
|
||||
$vstr = preg_replace('/0D33 0D4D 200D/','0D7E', $vstr);
|
||||
|
||||
$vstr = preg_replace('/0D7F/','E004', $vstr); // [mlymChilluK]
|
||||
$vstr = preg_replace('/0D7A/','E005', $vstr); // [mlymChilluNn]
|
||||
$vstr = preg_replace('/0D7B/','E006', $vstr); // [mlymChilluN]
|
||||
$vstr = preg_replace('/0D7C/','E007', $vstr); // [mlymChilluR]
|
||||
$vstr = preg_replace('/0D7D/','E008', $vstr); // [mlymChilluL]
|
||||
$vstr = preg_replace('/0D7E/','E009', $vstr); // [mlymChilluLl]
|
||||
*/
|
||||
|
||||
// MALAYALAM double-part vowels []
|
||||
$vstr = str_replace('0D4A','0D46 0D3E', $vstr); // 2-part Vowel
|
||||
$vstr = str_replace('0D4B','0D47 0D3E', $vstr); // 2-part Vowel
|
||||
$vstr = str_replace('0D4C','0D46 0D57', $vstr); // 2-part Vowel
|
||||
$mlprebasedvowels = "(0D46|0D47|0D48)";
|
||||
// No nukta
|
||||
$halant = "0D4D";
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$mlprebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$mlprebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT
|
||||
}
|
||||
|
||||
// TELUGU
|
||||
else if ($lang=='te') {
|
||||
// TELUGU double-part vowels [0C48 -> 0C46 0C56]
|
||||
$vstr = str_replace('0C48','0C46 0C56', $vstr); // 2-part Vowel
|
||||
$prebasedvowels = "(0C46)";
|
||||
$abvvowels = "(0C3E|0C3F|0C40|0C46|0C47|0C4A|0C4B|0C4C|0C55)";
|
||||
// No nukta
|
||||
$halant = "0C4D";
|
||||
$tefullforms = "0C15|0C17|0C18|0C1A|0C1B|0C1C|0C1D|0C20|0C21|0C22|0C24|0C25|0C26|0C27|0C28|0C2A|0C2B|0C2D|0C2E|0C2F|0C30|0C33|0C35|0C36|0C37|0C38|0C39|E028|E029|E02A|E02B|E078|E07A|E07B";
|
||||
$vstr = preg_replace('/('.$tefullforms .') '.$halant.' ('.$tefullforms .') '.$abvvowels .'/','\\1 \\3 '.$halant.' \\2', $vstr); // before HALANT
|
||||
}
|
||||
|
||||
|
||||
// KANNADA
|
||||
else if ($lang=='kn') {
|
||||
// KANNADA double-part vowels [0CC8 -> 0CC6 0CD6]
|
||||
$vstr = str_replace('0CC0','0CBF 0CD5', $vstr); // 2-part Vowel
|
||||
$vstr = str_replace('0CC7','0CC6 0CD5', $vstr); // 2-part Vowel
|
||||
$vstr = str_replace('0CC8','0CC6 0CD6', $vstr); // 2-part Vowel AI - no glyph for single
|
||||
$vstr = str_replace('0CCA','0CC6 0CC2', $vstr); // 2-part Vowel
|
||||
$vstr = str_replace('0CCB','0CC6 0CC2 0CD5', $vstr); // 2-part Vowel
|
||||
$prebasedvowels = "(0CBF|0CC6)";
|
||||
$halant = "0CCD";
|
||||
}
|
||||
|
||||
|
||||
//============================
|
||||
|
||||
// SPECIALS
|
||||
|
||||
// DEVANAGARI Ra Halant Ra
|
||||
if ($lang=='hi') {
|
||||
$vstr = str_replace('0930 094D 0930','E05D 0930', $vstr); // Ra Halant Ra => halfRa FullRa
|
||||
}
|
||||
|
||||
// GUJARATI
|
||||
if ($lang=='gu') {
|
||||
$vstr = str_replace('0AB0 0AC2','E02E', $vstr); // Ra VowelUu => SpecialForm RaUu
|
||||
}
|
||||
|
||||
// TELUGU Ra Halant <Consonant> Halant => halfRa Halant<Consonant> Halant
|
||||
if ($lang=='te') {
|
||||
$vstr = preg_replace('/0C30 0C4D ([A-F0-9]{4}) 0C4D/','E021 0C4D \\1 0C4D', $vstr);
|
||||
}
|
||||
|
||||
// KANNADA
|
||||
// Reph at end of word becomes E0CC instead of E00B
|
||||
if ($lang=='kn') {
|
||||
$vstr = str_replace('0CB0 0CCD 0020','E0CC 0020', $vstr); // mPDF 5.3.87
|
||||
}
|
||||
|
||||
|
||||
//============================
|
||||
// MAIN BIT FROM VOLT RULES
|
||||
foreach($voltdata[$font] AS $rid=>$reps) {
|
||||
//echo $rid . ': ' . $vstr.'<br />';
|
||||
$vstr = preg_replace('/'.$reps['match'].'/',$reps['replace'], $vstr);
|
||||
}
|
||||
//echo $vstr.'<br />'; exit;
|
||||
|
||||
|
||||
//============================
|
||||
|
||||
// SPECIALS
|
||||
|
||||
// KANNADA
|
||||
// <Base> <BelowBase1> [<BelowBase2> ] MatraI -> <Base/MatraI ligature> <Belowbase1> etc
|
||||
if ($lang=='kn') {
|
||||
$matraI = "0CBF";
|
||||
$knbase = preg_split('/\|/', "0C95|0C96|0C97|0C98|0C9A|0C9B|0C9C|0C9D|0CA0|0CA1|0CA2|0CA3|0CA4|0CA5|0CA6|0CA7|0CA8|0CAA|0CAB|0CAC|0CAD|0CAE|0CAF|0CB0|0CB2|0CB3|0CB5|0CB6|0CB7|0CB8|0CB9|E0A3|E07D|E07E");
|
||||
$knmatraIligature = preg_split('/\|/', "E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A4|E0A1|E0A2");
|
||||
$belowbase1 = "E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081";
|
||||
$belowbase2 = "E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081";
|
||||
for ($i=0; $i<count($knbase);$i++) {
|
||||
$vstr = preg_replace('/'.$knbase[$i].' ('.$belowbase1.') ('.$belowbase2.') '.$matraI.'/', $knmatraIligature[$i].' \\1 \\2', $vstr);
|
||||
$vstr = preg_replace('/'.$knbase[$i].' ('.$belowbase1.') '.$matraI.'/', $knmatraIligature[$i].' \\1', $vstr);
|
||||
}
|
||||
}
|
||||
|
||||
// KANNADA
|
||||
// [KanTtaFull] [matraI] => [KanTtaPartial] [matraI]
|
||||
if ($lang=='kn') {
|
||||
$vstr = preg_replace('/0C9F '.$matraI.'/', 'E015 '.$matraI, $vstr);
|
||||
}
|
||||
|
||||
// ORIYA
|
||||
if ($lang=='or') {
|
||||
// SpecialCase Ra[0B30] Halant still left before [oryaFullNnNna] => E00F
|
||||
$vstr = preg_replace('/0B30 '.$halant.' E00F/','E00F E069', $vstr); // convert to Reph
|
||||
}
|
||||
|
||||
//============================
|
||||
// SHIFT REPH
|
||||
|
||||
// DEVANAGARI Shift Reph [E015]
|
||||
if ($lang=='hi') {
|
||||
// FIRSTLY - halfRa = E05D - Change this to Reph [E015]
|
||||
$himatchhalfforms = "E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E0D3|E0D4|E0D5|E0D6|E0D7|E0D8|E0D9|E0DA|E0DB|E0DC|E0DD|E0DE|E0DF|E0E0|E0E1|E0E2|E0E3|E0E4|E0E5|E0E6|E0E7|E0E8|E0E9|E0EA|E0EB|E0EC|E0ED|E0EE|E0EF|E0F0|E0F1|E0F2|E0F3|E0F4|E0F5|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145";
|
||||
$himatchfullforms = "0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029|0958|0959|095A|E02A|E02B|E02C|E02D|095B|E02E|E02F|E030|E031|095C|095D|E032|E033|E034|E035|E036|0929|E037|095E|E038|E039|E03A|095F|0931|E03B|0934|E03C|E03D|E03E|E03F|E040|E041|E042|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E129|E12A|E12B|E12C|E12D|E12E|E12F|E130|E131|E132|E133";
|
||||
$vstr = preg_replace('/E05D ('.$himatchhalfforms.'|'.$himatchfullforms.')/', 'E015 \\1', $vstr);
|
||||
|
||||
// Reph = E015 - Shift Right to just after end of syllable
|
||||
// FullAllForms + HalfAllForms + 093E matraA
|
||||
while(preg_match('/E015 ('.$himatchhalfforms.')/', $vstr)) {
|
||||
$vstr = preg_replace('/E015 ('.$himatchhalfforms.')/', '\\1 E015', $vstr);
|
||||
}
|
||||
$vstr = preg_replace('/E015 ('.$himatchfullforms.')/', '\\1 E015', $vstr);
|
||||
|
||||
// Now shift it beyond post-based vowels // ??? Need to add others e.g. 0949,094A,094B,094C + presentation forms like E198
|
||||
$vstr = str_replace('E015 093E', '093E E015', $vstr);
|
||||
$vstr = preg_replace('/E015 (0940|E194|E195|E196|E197|E198)/', '\\1 E014', $vstr); // (Small) reph [E014] to Right of matraI
|
||||
$vstr = str_replace('E015 0947', '0947 E014', $vstr); // (Small) reph [E014] to Right of matraI
|
||||
}
|
||||
|
||||
// BENGALI Shift Reph [E068]
|
||||
else if ($lang=='bn') {
|
||||
$bnfullconjuncts = "E002|E003|E004|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E0D3|E0D4|E0D5|E0D6|E0D7|E0D8|E0D9|E0DA|E0DB|E0DC|E0DD|E0DE|E0DF|E0E0|E0E1|E0E2|E0E3|E0E4|E0E5|E0E6|E0E7|E0E8|E0E9|E0EA|E0EB|E0EC|E0ED|E0EE|E0EF|E0F0|E0F1|E0F2|E0F3|E0F4|E0F5|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E129|E12A|E12B|E12C|E12D|E12E|E12F|E130|E131|E132|E133|E134|E135|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E|E15F|E160|E161|E162|E163|E164|E165|E166|E167|E168|E169|E16A|E16B|E16C|E16D|E16E|E16F|E170|E171|E172|E173|E174|E175|E176|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E183|E184|E185|E186|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E18F|E190|E191|E192|E193|E194|E195|E196|E197|E198|E199|E19A";
|
||||
// $bnfullcons - set above;
|
||||
$vstr = preg_replace('/E068 ('.$bnfullconjuncts.'|'.$bnfullcons.')/', '\\1 E068', $vstr);
|
||||
// ? Need to shift it beyond post-base vowels 09BE, 09C0, 09D7 haven't found so can't test??
|
||||
$vstr = preg_replace('/E068 (09BE|09C0|09D7)/', '\\1 E068', $vstr);
|
||||
}
|
||||
|
||||
// GUJARATI Shift Reph [E032]
|
||||
else if ($lang=='gu') {
|
||||
$gufullforms = "0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5";
|
||||
$vstr = preg_replace('/E032 ('.$gufullforms.')/', '\\1 E032', $vstr);
|
||||
// Now shift it beyond post-based vowels // ??? Need to add others e.g. 0949,094A,094B,094C + presentation forms like E198
|
||||
// ? Need to shift it beyond post-base vowels 0ABE, 0AC0 haven't found so can't test??
|
||||
$vstr = preg_replace('/E032 (0ABE|0AC0)/', '\\1 E032', $vstr);
|
||||
}
|
||||
|
||||
|
||||
// TELUGU Shift Reph to LEFT [E046|E069|E077] [TelRaSmallOne] => E046 [TelRaSmallTwo] => E069 [TelRaSmallThree] => E077
|
||||
else if ($lang=='te') {
|
||||
// tefullforms defined earlier
|
||||
$tepartialforms = "E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E07C|E07D|E07E";
|
||||
$matraligs = "E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF";
|
||||
$tevowels = "0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C"
|
||||
."|0C41|0C42|0C43|0C44"; // post matras
|
||||
$vstr = preg_replace('/('.$tevowels.') (E046|E069|E077)/', '\\2 \\1', $vstr);
|
||||
while(preg_match('/('.$tepartialforms.') (E046|E069|E077)/', $vstr)) {
|
||||
$vstr = preg_replace('/('.$tepartialforms.') (E046|E069|E077)/', '\\2 \\1', $vstr);
|
||||
}
|
||||
$vstr = preg_replace('/('.$tefullforms .'|'.$matraligs.') (E046|E069|E077)/', '\\2 \\1', $vstr);
|
||||
}
|
||||
|
||||
|
||||
// KANNADA Shift Reph to RIGHT [E00B]
|
||||
else if ($lang=='kn') {
|
||||
$knfullforms = "0C95|0C96|0C97|0C98|0C99|0C9A|0C9B|0C9C|0C9D|0C9E|0C9F|0CA0|0CA1|0CA2|0CA3|0CA4|0CA5|0CA6|0CA7|0CA8|0CAA|0CAB|0CAC|0CAD|0CAE|0CAF|0CB0|0CB1|0CB2|0CB3|0CB5|0CB6|0CB7|0CB8|0CB9|E07D|E07E|E0A3";
|
||||
$knpartialforms = "E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|0C9E|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E07F";
|
||||
while(preg_match('/E00B ('.$knpartialforms.')/', $vstr)) {
|
||||
$vstr = preg_replace('/E00B ('.$knpartialforms.')/', '\\1 E00B', $vstr);
|
||||
}
|
||||
// mPDF 5.3.47 Also move Reph to right of matraIligatures
|
||||
$knfullforms .= "|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A4|E0A1|E0A2";
|
||||
$vstr = preg_replace('/E00B ('.$knfullforms.')/', '\\1 E00B', $vstr);
|
||||
|
||||
// ? Need to shift it beyond base or below-base forms - haven't found so can't test??
|
||||
// mPDF 5.3.87
|
||||
// E004 added to list (which is a transformed version of 0CBE)
|
||||
$knvowels = "0CBE|0CC0|0CC1|0CC2|0CC3|0CC4|0CC7|0CC8|0CCA|0CCB|0CD5|0CD6|E004";
|
||||
$vstr = preg_replace('/E00B ('.$knvowels.')/', '\\1 E00B', $vstr);
|
||||
}
|
||||
|
||||
|
||||
// ORIYA Shift Reph to RIGHT [E069|E06A|E06B|E06C]
|
||||
else if ($lang=='or') {
|
||||
$orrephs = "E069|E06A|E06B|E06C";
|
||||
$orfullforms = "0B15|0B16|0B17|0B18|0B19|0B1A|0B1B|0B1C|0B1D|0B1E|0B1F|0B20|0B21|0B22|0B23|0B24|0B25|0B26|0B27|0B28|0B29|0B2A|0B2B|0B2C|0B2D|0B2E|0B2F|0B30|0B31|0B32|0B33|0B34|0B35|0B36|0B37|0B38|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037";
|
||||
// E123 - E147 FullHalant forms ? add to FullForms
|
||||
$orpartialforms = "E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E0D3|E0D4|E0D5|E0D6|E0D7|E0D8|E0D9|E0DA|E0DB|E0DC|E0DD|E0DE|E0DF|E0E0|E0E1|E0E2|E0E3|E0E4|E0E5|E0E6|E0E7|E0E8|E0E9|E0EA|E0EB|E0EC|E0ED|E0EE|E0EF|E0F0|E0F1|E0F2|E0F3|E0F4|E0F5";
|
||||
|
||||
// Combined MatraIReph[E06D] split [0B3F & E069] to allow reph to be shifted forwards
|
||||
$vstr = preg_replace('/('.$orfullforms.') E06D ('.$orfullforms.') 0B3E/', '\\1 0B3F E069 \\2 0B3E', $vstr);
|
||||
|
||||
|
||||
while(preg_match('/('.$orrephs.') ('.$orpartialforms.')/', $vstr)) {
|
||||
$vstr = preg_replace('/('.$orrephs.') ('.$orpartialforms.')/', '\\2 \\1', $vstr);
|
||||
}
|
||||
$vstr = preg_replace('/('.$orrephs.') ('.$orfullforms.')/', '\\2 \\1', $vstr);
|
||||
|
||||
|
||||
// Combine Reph and MatraI
|
||||
$vstr = str_replace('E069 0B3F', 'E06D', $vstr); // Reph and MatraI -> MatraIReph
|
||||
$vstr = str_replace('E06A 0B3F', 'E06E', $vstr); // Reph and MatraI -> MatraIReph
|
||||
$vstr = str_replace('E06B 0B3F', 'E06F', $vstr); // Reph and MatraI -> MatraIReph
|
||||
}
|
||||
|
||||
|
||||
// MALAYALAM Shift Reph to LEFT [E00E] (mlylmRaVattu)
|
||||
else if ($lang=='ml') {
|
||||
$halant = "0D4D";
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' 0D30/','E00E \\1', $vstr); // 0D30 = Ra
|
||||
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$mlprebasedvowels .' 0D30/','\\2 E00E \\1', $vstr); // 0D30 = Ra
|
||||
|
||||
$mlfullforms = "0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39"
|
||||
."|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D";
|
||||
// = FullConsonants + FullConjuncts
|
||||
|
||||
// = Add Chillu characters // mPDF 5.0.024
|
||||
$mlfullforms .= "|E004|E005|E006|E007|E008|E009";
|
||||
while(preg_match('/('.$mlfullforms.') E00E/', $vstr))
|
||||
$vstr = preg_replace('/('.$mlfullforms.') E00E/', 'E00E \\1', $vstr);
|
||||
}
|
||||
|
||||
//============================
|
||||
|
||||
// SHIFT post-based vowels to Left of SmallForms (NOT to left of full forms)
|
||||
|
||||
// TELUGU Shift
|
||||
if ($lang=='te') {
|
||||
// NB $tevowels defined above
|
||||
// NB $tefullforms defined above
|
||||
$tebelowbase1 = "E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E"; //'Small1KaToHa'
|
||||
$tebelowbase2 = "E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071"; // 'Small2KaToHa'
|
||||
$vstr = preg_replace('/('.$tebelowbase2.') ('.$tevowels.')/', '\\2 \\1', $vstr);
|
||||
$vstr = preg_replace('/('.$tebelowbase1.') ('.$tevowels.')/', '\\2 \\1', $vstr);
|
||||
}
|
||||
|
||||
|
||||
// KANNADA Shift
|
||||
else if ($lang=='kn') {
|
||||
$knvowels = "0CBE|0CC0|0CC1|0CC2|0CC3|0CC4|0CC7|0CC8|0CCA|0CCB|0CD5|0CD6"
|
||||
// mPDF 5.3.87 Shouldn't swop E082 and E047 (belowbase1) below
|
||||
// E082 is a matraIligature
|
||||
// ."|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB"
|
||||
."|E004|E007|E008|E009|E00A";
|
||||
|
||||
|
||||
// NB $knvowels defined above
|
||||
// NB $fullforms defined above
|
||||
// $belowbase1/2 defined above
|
||||
$vstr = preg_replace('/('.$belowbase2.') ('.$knvowels.')/', '\\2 \\1', $vstr);
|
||||
// mPDF 5.3.87
|
||||
$vstr = preg_replace('/('.$belowbase1.') ('.$knvowels.')/', '\\2 \\1', $vstr);
|
||||
|
||||
//$vstr = preg_replace('/('.$fullforms.') ('.$knvowels.')/', '\\2 \\1', $vstr);
|
||||
}
|
||||
|
||||
//============================
|
||||
// Clear unwanted ZWJ, ZWNJ
|
||||
// MALAYALAM
|
||||
if ($lang=='ml') {
|
||||
$vstr = preg_replace('/(200C|200D) /','', $vstr);
|
||||
}
|
||||
|
||||
//============================
|
||||
// END & PUT IT BACK TOGETHER
|
||||
$vstr = preg_replace('/^0020 (.*) 0020$/', '\\1', $vstr);
|
||||
|
||||
$varr = explode(" ",$vstr);
|
||||
$e = '';
|
||||
foreach($varr AS $v) {
|
||||
$e.=code2utf(hexdec($v));
|
||||
}
|
||||
//============================
|
||||
|
||||
return $e;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
224
inc/3rdparty/libraries/mpdf/classes/meter.php
vendored
Normal file
224
inc/3rdparty/libraries/mpdf/classes/meter.php
vendored
Normal file
|
@ -0,0 +1,224 @@
|
|||
<?php
|
||||
|
||||
class meter {
|
||||
|
||||
|
||||
function __construct() {
|
||||
|
||||
}
|
||||
|
||||
function makeSVG($tag, $type, $value, $max, $min, $optimum, $low, $high) {
|
||||
$svg = '';
|
||||
if ($tag == 'meter') {
|
||||
|
||||
if ($type=='2') {
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
///////// CUSTOM <meter type="2">
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
$h = 10;
|
||||
$w = 160;
|
||||
$border_radius = 0.143; // Factor of Height
|
||||
|
||||
$svg = '<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="'.$w.'px" height="'.$h.'px" viewBox="0 0 '.$w.' '.$h.'" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ><g>
|
||||
|
||||
|
||||
<defs>
|
||||
<linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox">
|
||||
<stop offset="0%" stop-color="rgb(222, 222, 222)" />
|
||||
<stop offset="20%" stop-color="rgb(232, 232, 232)" />
|
||||
<stop offset="25%" stop-color="rgb(232, 232, 232)" />
|
||||
<stop offset="100%" stop-color="rgb(182, 182, 182)" />
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
';
|
||||
$svg .= '<rect x="0" y="0" width="'.$w.'" height="'.$h.'" fill="#f4f4f4" stroke="none" />';
|
||||
|
||||
// LOW to HIGH region
|
||||
//if ($low && $high && ($low != $min || $high != $max)) {
|
||||
if ($low && $high) {
|
||||
$barx = (($low-$min) / ($max-$min) ) * $w;
|
||||
$barw = (($high-$low) / ($max-$min) ) * $w;
|
||||
$svg .= '<rect x="'.$barx.'" y="0" width="'.$barw.'" height="'.$h.'" fill="url(#GrGRAY)" stroke="#888888" stroke-width="0.5px" />';
|
||||
}
|
||||
|
||||
// OPTIMUM Marker (? AVERAGE)
|
||||
if ($optimum) {
|
||||
$barx = (($optimum-$min) / ($max-$min) ) * $w;
|
||||
$barw = $h/2;
|
||||
$barcol = '#888888';
|
||||
$svg .= '<rect x="'.$barx.'" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="'.$barcol.'" stroke="none" />';
|
||||
}
|
||||
|
||||
// VALUE Marker
|
||||
if ($value) {
|
||||
if ($min != $low && $value < $low) { $col = 'orange'; }
|
||||
else if ($max != $high && $value > $high) { $col = 'orange'; }
|
||||
else { $col = '#008800'; }
|
||||
$cx = (($value-$min) / ($max-$min) ) * $w;
|
||||
$cy = $h/2;
|
||||
$rx = $h/3.5;
|
||||
$ry = $h/2.2;
|
||||
$svg .= '<ellipse fill="'.$col.'" stroke="#000000" stroke-width="0.5px" cx="'.$cx.'" cy="'.$cy.'" rx="'.$rx.'" ry="'.$ry.'"/>';
|
||||
}
|
||||
|
||||
// BoRDER
|
||||
$svg .= '<rect x="0" y="0" width="'.$w.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />';
|
||||
|
||||
$svg .= '</g></svg>';
|
||||
}
|
||||
else {
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
///////// DEFAULT <meter>
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
$h = 10;
|
||||
$w = 50;
|
||||
$border_radius = 0.143; // Factor of Height
|
||||
|
||||
$svg = '<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="'.$w.'px" height="'.$h.'px" viewBox="0 0 '.$w.' '.$h.'" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ><g>
|
||||
|
||||
<defs>
|
||||
<linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox">
|
||||
<stop offset="0%" stop-color="rgb(222, 222, 222)" />
|
||||
<stop offset="20%" stop-color="rgb(232, 232, 232)" />
|
||||
<stop offset="25%" stop-color="rgb(232, 232, 232)" />
|
||||
<stop offset="100%" stop-color="rgb(182, 182, 182)" />
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="GrRED" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox">
|
||||
<stop offset="0%" stop-color="rgb(255, 162, 162)" />
|
||||
<stop offset="20%" stop-color="rgb(255, 218, 218)" />
|
||||
<stop offset="25%" stop-color="rgb(255, 218, 218)" />
|
||||
<stop offset="100%" stop-color="rgb(255, 0, 0)" />
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="GrGREEN" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox">
|
||||
<stop offset="0%" stop-color="rgb(102, 230, 102)" />
|
||||
<stop offset="20%" stop-color="rgb(218, 255, 218)" />
|
||||
<stop offset="25%" stop-color="rgb(218, 255, 218)" />
|
||||
<stop offset="100%" stop-color="rgb(0, 148, 0)" />
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="GrBLUE" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox">
|
||||
<stop offset="0%" stop-color="rgb(102, 102, 230)" />
|
||||
<stop offset="20%" stop-color="rgb(238, 238, 238)" />
|
||||
<stop offset="25%" stop-color="rgb(238, 238, 238)" />
|
||||
<stop offset="100%" stop-color="rgb(0, 0, 128)" />
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="GrORANGE" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox">
|
||||
<stop offset="0%" stop-color="rgb(255, 186, 0)" />
|
||||
<stop offset="20%" stop-color="rgb(255, 238, 168)" />
|
||||
<stop offset="25%" stop-color="rgb(255, 238, 168)" />
|
||||
<stop offset="100%" stop-color="rgb(255, 155, 0)" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$w.'" height="'.$h.'" fill="url(#GrGRAY)" stroke="none" />
|
||||
';
|
||||
|
||||
if ($value) {
|
||||
$barw = (($value-$min) / ($max-$min) ) * $w;
|
||||
if ($optimum < $low) {
|
||||
if ($value < $low) { $barcol = 'url(#GrGREEN)'; }
|
||||
else if ($value > $high) { $barcol = 'url(#GrRED)'; }
|
||||
else { $barcol = 'url(#GrORANGE)'; }
|
||||
}
|
||||
else if ($optimum > $high) {
|
||||
if ($value < $low) { $barcol = 'url(#GrRED)'; }
|
||||
else if ($value > $high) { $barcol = 'url(#GrGREEN)'; }
|
||||
else { $barcol = 'url(#GrORANGE)'; }
|
||||
}
|
||||
else {
|
||||
if ($value < $low) { $barcol = 'url(#GrORANGE)'; }
|
||||
else if ($value > $high) { $barcol = 'url(#GrORANGE)'; }
|
||||
else { $barcol = 'url(#GrGREEN)'; }
|
||||
}
|
||||
$svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="'.$barcol.'" stroke="none" />';
|
||||
}
|
||||
|
||||
|
||||
// Borders
|
||||
//$svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$w.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />';
|
||||
if ($value) {
|
||||
// $svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />';
|
||||
}
|
||||
|
||||
|
||||
$svg .= '</g></svg>';
|
||||
}
|
||||
}
|
||||
else { // $tag == 'progress'
|
||||
|
||||
if ($type=='2') {
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
///////// CUSTOM <progress type="2">
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
}
|
||||
else {
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
///////// DEFAULT <progress>
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
$h = 10;
|
||||
$w = 100;
|
||||
$border_radius = 0.143; // Factor of Height
|
||||
|
||||
if ($value or $value==='0') {
|
||||
$fill = 'url(#GrGRAY)';
|
||||
}
|
||||
else {
|
||||
$fill = '#f8f8f8';
|
||||
}
|
||||
|
||||
$svg = '<svg width="'.$w.'px" height="'.$h.'px" viewBox="0 0 '.$w.' '.$h.'"><g>
|
||||
|
||||
<defs>
|
||||
<linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox">
|
||||
<stop offset="0%" stop-color="rgb(222, 222, 222)" />
|
||||
<stop offset="20%" stop-color="rgb(232, 232, 232)" />
|
||||
<stop offset="25%" stop-color="rgb(232, 232, 232)" />
|
||||
<stop offset="100%" stop-color="rgb(182, 182, 182)" />
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="GrGREEN" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox">
|
||||
<stop offset="0%" stop-color="rgb(102, 230, 102)" />
|
||||
<stop offset="20%" stop-color="rgb(218, 255, 218)" />
|
||||
<stop offset="25%" stop-color="rgb(218, 255, 218)" />
|
||||
<stop offset="100%" stop-color="rgb(0, 148, 0)" />
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$w.'" height="'.$h.'" fill="'.$fill.'" stroke="none" />
|
||||
';
|
||||
|
||||
if ($value) {
|
||||
$barw = (($value-$min) / ($max-$min) ) * $w;
|
||||
$barcol = 'url(#GrGREEN)';
|
||||
$svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="'.$barcol.'" stroke="none" />';
|
||||
}
|
||||
|
||||
|
||||
// Borders
|
||||
$svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$w.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />';
|
||||
if ($value) {
|
||||
// $svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />';
|
||||
}
|
||||
|
||||
|
||||
$svg .= '</g></svg>';
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return $svg;
|
||||
}
|
||||
|
||||
|
||||
} // end of class
|
||||
|
||||
?>
|
2600
inc/3rdparty/libraries/mpdf/classes/svg.php
vendored
Normal file
2600
inc/3rdparty/libraries/mpdf/classes/svg.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
468
inc/3rdparty/libraries/mpdf/classes/tocontents.php
vendored
Normal file
468
inc/3rdparty/libraries/mpdf/classes/tocontents.php
vendored
Normal file
|
@ -0,0 +1,468 @@
|
|||
<?php
|
||||
|
||||
class tocontents {
|
||||
|
||||
var $mpdf = null;
|
||||
var $_toc;
|
||||
var $TOCmark;
|
||||
var $TOCoutdent; // mPDF 5.6.31
|
||||
var $TOCpreHTML;
|
||||
var $TOCpostHTML;
|
||||
var $TOCbookmarkText;
|
||||
var $TOCusePaging;
|
||||
var $TOCuseLinking;
|
||||
var $TOCorientation;
|
||||
var $TOC_margin_left;
|
||||
var $TOC_margin_right;
|
||||
var $TOC_margin_top;
|
||||
var $TOC_margin_bottom;
|
||||
var $TOC_margin_header;
|
||||
var $TOC_margin_footer;
|
||||
var $TOC_odd_header_name;
|
||||
var $TOC_even_header_name;
|
||||
var $TOC_odd_footer_name;
|
||||
var $TOC_even_footer_name;
|
||||
var $TOC_odd_header_value;
|
||||
var $TOC_even_header_value;
|
||||
var $TOC_odd_footer_value;
|
||||
var $TOC_even_footer_value;
|
||||
var $TOC_page_selector;
|
||||
var $m_TOC;
|
||||
|
||||
function tocontents(&$mpdf) {
|
||||
$this->mpdf = $mpdf;
|
||||
$this->_toc=array();
|
||||
$this->TOCmark = 0;
|
||||
$this->m_TOC=array();
|
||||
}
|
||||
|
||||
function TOCpagebreak($tocfont='', $tocfontsize='', $tocindent='', $TOCusePaging=true, $TOCuseLinking='', $toc_orientation='', $toc_mgl='',$toc_mgr='',$toc_mgt='',$toc_mgb='',$toc_mgh='',$toc_mgf='',$toc_ohname='',$toc_ehname='',$toc_ofname='',$toc_efname='',$toc_ohvalue=0,$toc_ehvalue=0,$toc_ofvalue=0, $toc_efvalue=0, $toc_preHTML='', $toc_postHTML='', $toc_bookmarkText='', $resetpagenum='', $pagenumstyle='', $suppress='', $orientation='', $mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0, $toc_id=0, $pagesel='', $toc_pagesel='', $sheetsize='', $toc_sheetsize='', $tocoutdent='') { // mPDF 5.6.19
|
||||
if (strtoupper($toc_id)=='ALL') { $toc_id = '_mpdf_all'; }
|
||||
else if (!$toc_id) { $toc_id = 0; }
|
||||
else { $toc_id = strtolower($toc_id); }
|
||||
|
||||
if ($TOCusePaging === false || strtolower($TOCusePaging) == "off" || $TOCusePaging === 0 || $TOCusePaging === "0" || $TOCusePaging === "") { $TOCusePaging = false; }
|
||||
else { $TOCusePaging = true; }
|
||||
if (!$TOCuseLinking) { $TOCuseLinking = false; }
|
||||
if ($toc_id) {
|
||||
$this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page;
|
||||
$this->m_TOC[$toc_id]['TOCoutdent'] = $tocoutdent;
|
||||
$this->m_TOC[$toc_id]['TOCorientation'] = $toc_orientation;
|
||||
$this->m_TOC[$toc_id]['TOCuseLinking'] = $TOCuseLinking;
|
||||
$this->m_TOC[$toc_id]['TOCusePaging'] = $TOCusePaging;
|
||||
|
||||
if ($toc_preHTML) { $this->m_TOC[$toc_id]['TOCpreHTML'] = $toc_preHTML; }
|
||||
if ($toc_postHTML) { $this->m_TOC[$toc_id]['TOCpostHTML'] = $toc_postHTML; }
|
||||
if ($toc_bookmarkText) { $this->m_TOC[$toc_id]['TOCbookmarkText'] = $toc_bookmarkText; }
|
||||
|
||||
$this->m_TOC[$toc_id]['TOC_margin_left'] = $toc_mgl;
|
||||
$this->m_TOC[$toc_id]['TOC_margin_right'] = $toc_mgr;
|
||||
$this->m_TOC[$toc_id]['TOC_margin_top'] = $toc_mgt;
|
||||
$this->m_TOC[$toc_id]['TOC_margin_bottom'] = $toc_mgb;
|
||||
$this->m_TOC[$toc_id]['TOC_margin_header'] = $toc_mgh;
|
||||
$this->m_TOC[$toc_id]['TOC_margin_footer'] = $toc_mgf;
|
||||
$this->m_TOC[$toc_id]['TOC_odd_header_name'] = $toc_ohname;
|
||||
$this->m_TOC[$toc_id]['TOC_even_header_name'] = $toc_ehname;
|
||||
$this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $toc_ofname;
|
||||
$this->m_TOC[$toc_id]['TOC_even_footer_name'] = $toc_efname;
|
||||
$this->m_TOC[$toc_id]['TOC_odd_header_value'] = $toc_ohvalue;
|
||||
$this->m_TOC[$toc_id]['TOC_even_header_value'] = $toc_ehvalue;
|
||||
$this->m_TOC[$toc_id]['TOC_odd_footer_value'] = $toc_ofvalue;
|
||||
$this->m_TOC[$toc_id]['TOC_even_footer_value'] = $toc_efvalue;
|
||||
$this->m_TOC[$toc_id]['TOC_page_selector'] = $toc_pagesel;
|
||||
$this->m_TOC[$toc_id]['TOCsheetsize'] = $toc_sheetsize;
|
||||
}
|
||||
else {
|
||||
$this->TOCmark = $this->mpdf->page;
|
||||
$this->TOCoutdent = $tocoutdent;
|
||||
$this->TOCorientation = $toc_orientation;
|
||||
$this->TOCuseLinking = $TOCuseLinking;
|
||||
$this->TOCusePaging = $TOCusePaging;
|
||||
|
||||
if ($toc_preHTML) { $this->TOCpreHTML = $toc_preHTML; }
|
||||
if ($toc_postHTML) { $this->TOCpostHTML = $toc_postHTML; }
|
||||
if ($toc_bookmarkText) { $this->TOCbookmarkText = $toc_bookmarkText; }
|
||||
|
||||
$this->TOC_margin_left = $toc_mgl;
|
||||
$this->TOC_margin_right = $toc_mgr;
|
||||
$this->TOC_margin_top = $toc_mgt;
|
||||
$this->TOC_margin_bottom = $toc_mgb;
|
||||
$this->TOC_margin_header = $toc_mgh;
|
||||
$this->TOC_margin_footer = $toc_mgf;
|
||||
$this->TOC_odd_header_name = $toc_ohname;
|
||||
$this->TOC_even_header_name = $toc_ehname;
|
||||
$this->TOC_odd_footer_name = $toc_ofname;
|
||||
$this->TOC_even_footer_name = $toc_efname;
|
||||
$this->TOC_odd_header_value = $toc_ohvalue;
|
||||
$this->TOC_even_header_value = $toc_ehvalue;
|
||||
$this->TOC_odd_footer_value = $toc_ofvalue;
|
||||
$this->TOC_even_footer_value = $toc_efvalue;
|
||||
$this->TOC_page_selector = $toc_pagesel;
|
||||
$this->TOCsheetsize = $toc_sheetsize;
|
||||
}
|
||||
}
|
||||
|
||||
// Initiate, and Mark a place for the Table of Contents to be inserted
|
||||
function TOC($tocfont='', $tocfontsize=0, $tocindent=0, $resetpagenum='', $pagenumstyle='', $suppress='', $toc_orientation='', $TOCusePaging=true, $TOCuseLinking=false, $toc_id=0, $tocoutdent='') { // mPDF 5.6.19) {
|
||||
if (strtoupper($toc_id)=='ALL') { $toc_id = '_mpdf_all'; }
|
||||
else if (!$toc_id) { $toc_id = 0; }
|
||||
else { $toc_id = strtolower($toc_id); }
|
||||
// To use odd and even pages
|
||||
// Cannot start table of contents on an even page
|
||||
if (($this->mpdf->mirrorMargins) && (($this->mpdf->page)%2==0)) { // EVEN
|
||||
if ($this->mpdf->ColActive) {
|
||||
if (count($this->mpdf->columnbuffer)) { $this->mpdf->printcolumnbuffer(); }
|
||||
}
|
||||
$this->mpdf->AddPage($this->mpdf->CurOrientation,'',$resetpagenum, $pagenumstyle, $suppress);
|
||||
}
|
||||
else {
|
||||
$this->mpdf->PageNumSubstitutions[] = array('from'=>$this->mpdf->page, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=>$suppress);
|
||||
}
|
||||
if ($toc_id) {
|
||||
$this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page;
|
||||
$this->m_TOC[$toc_id]['TOCoutdent'] = $tocoutdent;
|
||||
$this->m_TOC[$toc_id]['TOCorientation'] = $toc_orientation;
|
||||
$this->m_TOC[$toc_id]['TOCuseLinking'] = $TOCuseLinking;
|
||||
$this->m_TOC[$toc_id]['TOCusePaging'] = $TOCusePaging;
|
||||
}
|
||||
else {
|
||||
$this->TOCmark = $this->mpdf->page;
|
||||
$this->TOCoutdent = $tocoutdent;
|
||||
$this->TOCorientation = $toc_orientation;
|
||||
$this->TOCuseLinking = $TOCuseLinking;
|
||||
$this->TOCusePaging = $TOCusePaging;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function insertTOC() {
|
||||
$notocs = 0;
|
||||
if ($this->TOCmark) { $notocs = 1; }
|
||||
$notocs += count($this->m_TOC);
|
||||
|
||||
if ($notocs==0) { return; }
|
||||
|
||||
if (count($this->m_TOC)) { reset($this->m_TOC); }
|
||||
$added_toc_pages = 0;
|
||||
|
||||
if ($this->mpdf->ColActive) { $this->mpdf->SetColumns(0); }
|
||||
if (($this->mpdf->mirrorMargins) && (($this->mpdf->page)%2==1)) { // ODD
|
||||
$this->mpdf->AddPage($this->mpdf->CurOrientation);
|
||||
$extrapage = true;
|
||||
}
|
||||
else { $extrapage = false; }
|
||||
|
||||
for ($toci = 0; $toci<$notocs; $toci++) {
|
||||
if ($toci==0 && $this->TOCmark) {
|
||||
$toc_id = 0;
|
||||
$toc_page = $this->TOCmark;
|
||||
$tocoutdent = $this->TOCoutdent;
|
||||
$toc_orientation = $this->TOCorientation;
|
||||
$TOCuseLinking = $this->TOCuseLinking;
|
||||
$TOCusePaging = $this->TOCusePaging;
|
||||
$toc_preHTML = $this->TOCpreHTML;
|
||||
$toc_postHTML = $this->TOCpostHTML;
|
||||
$toc_bookmarkText = $this->TOCbookmarkText;
|
||||
$toc_mgl = $this->TOC_margin_left;
|
||||
$toc_mgr = $this->TOC_margin_right;
|
||||
$toc_mgt = $this->TOC_margin_top;
|
||||
$toc_mgb = $this->TOC_margin_bottom;
|
||||
$toc_mgh = $this->TOC_margin_header;
|
||||
$toc_mgf = $this->TOC_margin_footer;
|
||||
$toc_ohname = $this->TOC_odd_header_name;
|
||||
$toc_ehname = $this->TOC_even_header_name;
|
||||
$toc_ofname = $this->TOC_odd_footer_name;
|
||||
$toc_efname = $this->TOC_even_footer_name;
|
||||
$toc_ohvalue = $this->TOC_odd_header_value;
|
||||
$toc_ehvalue = $this->TOC_even_header_value;
|
||||
$toc_ofvalue = $this->TOC_odd_footer_value;
|
||||
$toc_efvalue = $this->TOC_even_footer_value;
|
||||
$toc_page_selector = $this->TOC_page_selector;
|
||||
$toc_sheet_size = $this->TOCsheetsize;
|
||||
}
|
||||
else {
|
||||
$arr = current($this->m_TOC);
|
||||
|
||||
$toc_id = key($this->m_TOC);
|
||||
$toc_page = $this->m_TOC[$toc_id]['TOCmark'];
|
||||
$tocoutdent = $this->m_TOC[$toc_id]['TOCoutdent'];
|
||||
$toc_orientation = $this->m_TOC[$toc_id]['TOCorientation'];
|
||||
$TOCuseLinking = $this->m_TOC[$toc_id]['TOCuseLinking'];
|
||||
$TOCusePaging = $this->m_TOC[$toc_id]['TOCusePaging'];
|
||||
if (isset($this->m_TOC[$toc_id]['TOCpreHTML'])) { $toc_preHTML = $this->m_TOC[$toc_id]['TOCpreHTML']; }
|
||||
else { $toc_preHTML = ''; }
|
||||
if (isset($this->m_TOC[$toc_id]['TOCpostHTML'])) { $toc_postHTML = $this->m_TOC[$toc_id]['TOCpostHTML']; }
|
||||
else { $toc_postHTML = ''; }
|
||||
if (isset($this->m_TOC[$toc_id]['TOCbookmarkText'])) { $toc_bookmarkText = $this->m_TOC[$toc_id]['TOCbookmarkText']; }
|
||||
else { $toc_bookmarkText = ''; } // *BOOKMARKS*
|
||||
$toc_mgl = $this->m_TOC[$toc_id]['TOC_margin_left'];
|
||||
$toc_mgr = $this->m_TOC[$toc_id]['TOC_margin_right'];
|
||||
$toc_mgt = $this->m_TOC[$toc_id]['TOC_margin_top'];
|
||||
$toc_mgb = $this->m_TOC[$toc_id]['TOC_margin_bottom'];
|
||||
$toc_mgh = $this->m_TOC[$toc_id]['TOC_margin_header'];
|
||||
$toc_mgf = $this->m_TOC[$toc_id]['TOC_margin_footer'];
|
||||
$toc_ohname = $this->m_TOC[$toc_id]['TOC_odd_header_name'];
|
||||
$toc_ehname = $this->m_TOC[$toc_id]['TOC_even_header_name'];
|
||||
$toc_ofname = $this->m_TOC[$toc_id]['TOC_odd_footer_name'];
|
||||
$toc_efname = $this->m_TOC[$toc_id]['TOC_even_footer_name'];
|
||||
$toc_ohvalue = $this->m_TOC[$toc_id]['TOC_odd_header_value'];
|
||||
$toc_ehvalue = $this->m_TOC[$toc_id]['TOC_even_header_value'];
|
||||
$toc_ofvalue = $this->m_TOC[$toc_id]['TOC_odd_footer_value'];
|
||||
$toc_efvalue = $this->m_TOC[$toc_id]['TOC_even_footer_value'];
|
||||
$toc_page_selector = $this->m_TOC[$toc_id]['TOC_page_selector'];
|
||||
$toc_sheet_size = $this->m_TOC[$toc_id]['TOCsheetsize'];
|
||||
next($this->m_TOC);
|
||||
}
|
||||
|
||||
// mPDF 5.6.31
|
||||
|
||||
if (!$toc_orientation) { $toc_orientation= $this->mpdf->DefOrientation; }
|
||||
$this->mpdf->AddPage($toc_orientation, '', '', '', "on", $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_page_selector, $toc_sheet_size );
|
||||
|
||||
$this->mpdf->writingToC = true; // mPDF 5.6.38
|
||||
// mPDF 5.6.31
|
||||
$tocstart=count($this->mpdf->pages);
|
||||
if ($toc_preHTML) { $this->mpdf->WriteHTML($toc_preHTML); }
|
||||
|
||||
|
||||
// mPDF 5.6.19
|
||||
$html ='<div class="mpdf_toc" id="mpdf_toc_'.$toc_id.'">';
|
||||
foreach($this->_toc as $t) {
|
||||
if ($t['toc_id']==='_mpdf_all' || $t['toc_id']===$toc_id ) {
|
||||
$html .= '<div class="mpdf_toc_level_'.$t['l'].'">';
|
||||
if ($TOCuseLinking) { $html .= '<a class="mpdf_toc_a" href="#__mpdfinternallink_'.$t['link'].'">'; }
|
||||
$html .= '<span class="mpdf_toc_t_level_'.$t['l'].'">'.$t['t'].'</span>';
|
||||
if ($TOCuseLinking) { $html .= '</a>'; }
|
||||
if (!$tocoutdent) { $tocoutdent = '0'; }
|
||||
if ($TOCusePaging) { $html .= ' <dottab outdent="'.$tocoutdent.'" /> ';
|
||||
if ($TOCuseLinking) { $html .= '<a class="mpdf_toc_a" href="#__mpdfinternallink_'.$t['link'].'">'; }
|
||||
$html .= '<span class="mpdf_toc_p_level_'.$t['l'].'">'.$this->mpdf->docPageNum($t['p']).'</span>';
|
||||
if ($TOCuseLinking) { $html .= '</a>'; }
|
||||
}
|
||||
$html .= '</div>';
|
||||
}
|
||||
}
|
||||
$html .= '</div>';
|
||||
$this->mpdf->WriteHTML($html);
|
||||
|
||||
if ($toc_postHTML) { $this->mpdf->WriteHTML($toc_postHTML); }
|
||||
$this->mpdf->writingToC = false; // mPDF 5.6.38
|
||||
$this->mpdf->AddPage($toc_orientation,'E');
|
||||
|
||||
$n_toc = $this->mpdf->page - $tocstart + 1;
|
||||
|
||||
if ($toci==0 && $this->TOCmark) {
|
||||
$TOC_start = $tocstart ;
|
||||
$TOC_end = $this->mpdf->page;
|
||||
$TOC_npages = $n_toc;
|
||||
}
|
||||
else {
|
||||
$this->m_TOC[$toc_id]['start'] = $tocstart ;
|
||||
$this->m_TOC[$toc_id]['end'] = $this->mpdf->page;
|
||||
$this->m_TOC[$toc_id]['npages'] = $n_toc;
|
||||
}
|
||||
}
|
||||
|
||||
$s = '';
|
||||
|
||||
$s .= $this->mpdf->PrintBodyBackgrounds();
|
||||
|
||||
$s .= $this->mpdf->PrintPageBackgrounds();
|
||||
$this->mpdf->pages[$this->mpdf->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', "\n".$s."\n".'\\1', $this->mpdf->pages[$this->mpdf->page]);
|
||||
$this->mpdf->pageBackgrounds = array();
|
||||
|
||||
//Page footer
|
||||
$this->mpdf->InFooter=true;
|
||||
$this->mpdf->Footer();
|
||||
$this->mpdf->InFooter=false;
|
||||
|
||||
// 2nd time through to move pages etc.
|
||||
$added_toc_pages = 0;
|
||||
if (count($this->m_TOC)) { reset($this->m_TOC); }
|
||||
|
||||
for ($toci = 0; $toci<$notocs; $toci++) {
|
||||
if ($toci==0 && $this->TOCmark) {
|
||||
$toc_id = 0;
|
||||
$toc_page = $this->TOCmark + $added_toc_pages;
|
||||
$toc_orientation = $this->TOCorientation;
|
||||
$TOCuseLinking = $this->TOCuseLinking;
|
||||
$TOCusePaging = $this->TOCusePaging;
|
||||
$toc_bookmarkText = $this->TOCbookmarkText; // *BOOKMARKS*
|
||||
|
||||
$tocstart = $TOC_start ;
|
||||
$tocend = $n = $TOC_end;
|
||||
$n_toc = $TOC_npages;
|
||||
}
|
||||
else {
|
||||
$arr = current($this->m_TOC);
|
||||
|
||||
$toc_id = key($this->m_TOC);
|
||||
$toc_page = $this->m_TOC[$toc_id]['TOCmark'] + $added_toc_pages;
|
||||
$toc_orientation = $this->m_TOC[$toc_id]['TOCorientation'];
|
||||
$TOCuseLinking = $this->m_TOC[$toc_id]['TOCuseLinking'];
|
||||
$TOCusePaging = $this->m_TOC[$toc_id]['TOCusePaging'];
|
||||
$toc_bookmarkText = $this->m_TOC[$toc_id]['TOCbookmarkText']; // *BOOKMARKS*
|
||||
|
||||
$tocstart = $this->m_TOC[$toc_id]['start'] ;
|
||||
$tocend = $n = $this->m_TOC[$toc_id]['end'] ;
|
||||
$n_toc = $this->m_TOC[$toc_id]['npages'] ;
|
||||
|
||||
next($this->m_TOC);
|
||||
}
|
||||
|
||||
// Now pages moved
|
||||
$added_toc_pages += $n_toc;
|
||||
|
||||
$this->mpdf->MovePages($toc_page, $tocstart, $tocend) ;
|
||||
$this->mpdf->pgsIns[$toc_page] = $tocend - $tocstart + 1;
|
||||
|
||||
/*-- BOOKMARKS --*/
|
||||
// Insert new Bookmark for Bookmark
|
||||
if ($toc_bookmarkText) {
|
||||
$insert = -1;
|
||||
foreach($this->mpdf->BMoutlines as $i=>$o) {
|
||||
if($o['p']<$toc_page) { // i.e. before point of insertion
|
||||
$insert = $i;
|
||||
}
|
||||
}
|
||||
$txt = $this->mpdf->purify_utf8_text($toc_bookmarkText);
|
||||
if ($this->mpdf->text_input_as_HTML) {
|
||||
$txt = $this->mpdf->all_entities_to_utf8($txt);
|
||||
}
|
||||
$newBookmark[0] = array('t'=>$txt,'l'=>0,'y'=>0,'p'=>$toc_page );
|
||||
array_splice($this->mpdf->BMoutlines,($insert+1),0,$newBookmark);
|
||||
}
|
||||
/*-- END BOOKMARKS --*/
|
||||
|
||||
}
|
||||
|
||||
// Delete empty page that was inserted earlier
|
||||
if ($extrapage) {
|
||||
unset($this->mpdf->pages[count($this->mpdf->pages)]);
|
||||
$this->mpdf->page--; // Reset page pointer
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
function openTagTOC($attr) {
|
||||
if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { $tocoutdent = $attr['OUTDENT']; } else { $tocoutdent = ''; } // mPDF 5.6.19
|
||||
if (isset($attr['RESETPAGENUM']) && $attr['RESETPAGENUM']) { $resetpagenum = $attr['RESETPAGENUM']; } else { $resetpagenum = ''; }
|
||||
if (isset($attr['PAGENUMSTYLE']) && $attr['PAGENUMSTYLE']) { $pagenumstyle = $attr['PAGENUMSTYLE']; } else { $pagenumstyle= ''; }
|
||||
if (isset($attr['SUPPRESS']) && $attr['SUPPRESS']) { $suppress = $attr['SUPPRESS']; } else { $suppress = ''; }
|
||||
if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { $toc_orientation = $attr['TOC-ORIENTATION']; } else { $toc_orientation = ''; }
|
||||
if (isset($attr['PAGING']) && (strtoupper($attr['PAGING'])=='OFF' || $attr['PAGING']==='0')) { $paging = false; }
|
||||
else { $paging = true; }
|
||||
if (isset($attr['LINKS']) && (strtoupper($attr['LINKS'])=='ON' || $attr['LINKS']==1)) { $links = true; }
|
||||
else { $links = false; }
|
||||
if (isset($attr['NAME']) && $attr['NAME']) { $toc_id = strtolower($attr['NAME']); } else { $toc_id = 0; }
|
||||
$this->TOC('',0,0,$resetpagenum, $pagenumstyle, $suppress, $toc_orientation, $paging, $links, $toc_id, $tocoutdent); // mPDF 5.6.19 5.6.31
|
||||
}
|
||||
|
||||
|
||||
function openTagTOCPAGEBREAK($attr) {
|
||||
if (isset($attr['NAME']) && $attr['NAME']) { $toc_id = strtolower($attr['NAME']); } else { $toc_id = 0; }
|
||||
if ($toc_id) {
|
||||
if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { $this->m_TOC[$toc_id]['TOCoutdent'] = $attr['OUTDENT']; } else { $this->m_TOC[$toc_id]['TOCoutdent'] = ''; } // mPDF 5.6.19
|
||||
if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { $this->m_TOC[$toc_id]['TOCorientation'] = $attr['TOC-ORIENTATION']; } else { $this->m_TOC[$toc_id]['TOCorientation'] = ''; }
|
||||
if (isset($attr['PAGING']) && (strtoupper($attr['PAGING'])=='OFF' || $attr['PAGING']==='0')) { $this->m_TOC[$toc_id]['TOCusePaging'] = false; }
|
||||
else { $this->m_TOC[$toc_id]['TOCusePaging'] = true; }
|
||||
if (isset($attr['LINKS']) && (strtoupper($attr['LINKS'])=='ON' || $attr['LINKS']==1)) { $this->m_TOC[$toc_id]['TOCuseLinking'] = true; }
|
||||
else { $this->m_TOC[$toc_id]['TOCuseLinking'] = false; }
|
||||
|
||||
$this->m_TOC[$toc_id]['TOC_margin_left'] = $this->m_TOC[$toc_id]['TOC_margin_right'] = $this->m_TOC[$toc_id]['TOC_margin_top'] = $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $this->m_TOC[$toc_id]['TOC_margin_header'] = $this->m_TOC[$toc_id]['TOC_margin_footer'] = '';
|
||||
if (isset($attr['TOC-MARGIN-RIGHT'])) { $this->m_TOC[$toc_id]['TOC_margin_right'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-RIGHT'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-LEFT'])) { $this->m_TOC[$toc_id]['TOC_margin_left'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-LEFT'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-TOP'])) { $this->m_TOC[$toc_id]['TOC_margin_top'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-TOP'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-BOTTOM'])) { $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-BOTTOM'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-HEADER'])) { $this->m_TOC[$toc_id]['TOC_margin_header'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-HEADER'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-FOOTER'])) { $this->m_TOC[$toc_id]['TOC_margin_footer'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-FOOTER'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
$this->m_TOC[$toc_id]['TOC_odd_header_name'] = $this->m_TOC[$toc_id]['TOC_even_header_name'] = $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $this->m_TOC[$toc_id]['TOC_even_footer_name'] = '';
|
||||
if (isset($attr['TOC-ODD-HEADER-NAME']) && $attr['TOC-ODD-HEADER-NAME']) { $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $attr['TOC-ODD-HEADER-NAME']; }
|
||||
if (isset($attr['TOC-EVEN-HEADER-NAME']) && $attr['TOC-EVEN-HEADER-NAME']) { $this->m_TOC[$toc_id]['TOC_even_header_name'] = $attr['TOC-EVEN-HEADER-NAME']; }
|
||||
if (isset($attr['TOC-ODD-FOOTER-NAME']) && $attr['TOC-ODD-FOOTER-NAME']) { $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $attr['TOC-ODD-FOOTER-NAME']; }
|
||||
if (isset($attr['TOC-EVEN-FOOTER-NAME']) && $attr['TOC-EVEN-FOOTER-NAME']) { $this->m_TOC[$toc_id]['TOC_even_footer_name'] = $attr['TOC-EVEN-FOOTER-NAME']; }
|
||||
$this->m_TOC[$toc_id]['TOC_odd_header_value'] = $this->m_TOC[$toc_id]['TOC_even_header_value'] = $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = $this->m_TOC[$toc_id]['TOC_even_footer_value'] = 0;
|
||||
if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE']=='1' || strtoupper($attr['TOC-ODD-HEADER-VALUE'])=='ON')) { $this->m_TOC[$toc_id]['TOC_odd_header_value'] = 1; }
|
||||
else if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE']=='-1' || strtoupper($attr['TOC-ODD-HEADER-VALUE'])=='OFF')) { $this->m_TOC[$toc_id]['TOC_odd_header_value'] = -1; }
|
||||
if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE']=='1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE'])=='ON')) { $this->m_TOC[$toc_id]['TOC_even_header_value'] = 1; }
|
||||
else if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE']=='-1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE'])=='OFF')) { $this->m_TOC[$toc_id]['TOC_even_header_value'] = -1; }
|
||||
if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE']=='1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE'])=='ON')) { $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = 1; }
|
||||
else if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE']=='-1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE'])=='OFF')) { $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = -1; }
|
||||
if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE']=='1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE'])=='ON')) { $this->m_TOC[$toc_id]['TOC_even_footer_value'] = 1; }
|
||||
else if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE']=='-1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE'])=='OFF')) { $this->m_TOC[$toc_id]['TOC_even_footer_value'] = -1; }
|
||||
if (isset($attr['TOC-PAGE-SELECTOR']) && $attr['TOC-PAGE-SELECTOR']) { $this->m_TOC[$toc_id]['TOC_page_selector'] = $attr['TOC-PAGE-SELECTOR']; }
|
||||
else { $this->m_TOC[$toc_id]['TOC_page_selector'] = ''; }
|
||||
if (isset($attr['TOC-SHEET-SIZE']) && $attr['TOC-SHEET-SIZE']) { $this->m_TOC[$toc_id]['TOCsheetsize'] = $attr['TOC-SHEET-SIZE']; } else { $this->m_TOC[$toc_id]['TOCsheetsize'] = ''; }
|
||||
|
||||
|
||||
if (isset($attr['TOC-PREHTML']) && $attr['TOC-PREHTML']) { $this->m_TOC[$toc_id]['TOCpreHTML'] = htmlspecialchars_decode($attr['TOC-PREHTML'],ENT_QUOTES); }
|
||||
if (isset($attr['TOC-POSTHTML']) && $attr['TOC-POSTHTML']) { $this->m_TOC[$toc_id]['TOCpostHTML'] = htmlspecialchars_decode($attr['TOC-POSTHTML'],ENT_QUOTES); }
|
||||
|
||||
if (isset($attr['TOC-BOOKMARKTEXT']) && $attr['TOC-BOOKMARKTEXT']) { $this->m_TOC[$toc_id]['TOCbookmarkText'] = htmlspecialchars_decode($attr['TOC-BOOKMARKTEXT'],ENT_QUOTES); } // *BOOKMARKS*
|
||||
}
|
||||
else {
|
||||
if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { $this->TOCoutdent = $attr['OUTDENT']; } else { $this->TOCoutdent = ''; } // mPDF 5.6.19
|
||||
if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { $this->TOCorientation = $attr['TOC-ORIENTATION']; } else { $this->TOCorientation = ''; }
|
||||
if (isset($attr['PAGING']) && (strtoupper($attr['PAGING'])=='OFF' || $attr['PAGING']==='0')) { $this->TOCusePaging = false; }
|
||||
else { $this->TOCusePaging = true; }
|
||||
if (isset($attr['LINKS']) && (strtoupper($attr['LINKS'])=='ON' || $attr['LINKS']==1)) { $this->TOCuseLinking = true; }
|
||||
else { $this->TOCuseLinking = false; }
|
||||
|
||||
$this->TOC_margin_left = $this->TOC_margin_right = $this->TOC_margin_top = $this->TOC_margin_bottom = $this->TOC_margin_header = $this->TOC_margin_footer = '';
|
||||
if (isset($attr['TOC-MARGIN-RIGHT'])) { $this->TOC_margin_right = $this->mpdf->ConvertSize($attr['TOC-MARGIN-RIGHT'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-LEFT'])) { $this->TOC_margin_left = $this->mpdf->ConvertSize($attr['TOC-MARGIN-LEFT'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-TOP'])) { $this->TOC_margin_top = $this->mpdf->ConvertSize($attr['TOC-MARGIN-TOP'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-BOTTOM'])) { $this->TOC_margin_bottom = $this->mpdf->ConvertSize($attr['TOC-MARGIN-BOTTOM'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-HEADER'])) { $this->TOC_margin_header = $this->mpdf->ConvertSize($attr['TOC-MARGIN-HEADER'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
if (isset($attr['TOC-MARGIN-FOOTER'])) { $this->TOC_margin_footer = $this->mpdf->ConvertSize($attr['TOC-MARGIN-FOOTER'],$this->mpdf->w,$this->mpdf->FontSize,false); }
|
||||
$this->TOC_odd_header_name = $this->TOC_even_header_name = $this->TOC_odd_footer_name = $this->TOC_even_footer_name = '';
|
||||
if (isset($attr['TOC-ODD-HEADER-NAME']) && $attr['TOC-ODD-HEADER-NAME']) { $this->TOC_odd_header_name = $attr['TOC-ODD-HEADER-NAME']; }
|
||||
if (isset($attr['TOC-EVEN-HEADER-NAME']) && $attr['TOC-EVEN-HEADER-NAME']) { $this->TOC_even_header_name = $attr['TOC-EVEN-HEADER-NAME']; }
|
||||
if (isset($attr['TOC-ODD-FOOTER-NAME']) && $attr['TOC-ODD-FOOTER-NAME']) { $this->TOC_odd_footer_name = $attr['TOC-ODD-FOOTER-NAME']; }
|
||||
if (isset($attr['TOC-EVEN-FOOTER-NAME']) && $attr['TOC-EVEN-FOOTER-NAME']) { $this->TOC_even_footer_name = $attr['TOC-EVEN-FOOTER-NAME']; }
|
||||
$this->TOC_odd_header_value = $this->TOC_even_header_value = $this->TOC_odd_footer_value = $this->TOC_even_footer_value = 0;
|
||||
if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE']=='1' || strtoupper($attr['TOC-ODD-HEADER-VALUE'])=='ON')) { $this->TOC_odd_header_value = 1; }
|
||||
else if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE']=='-1' || strtoupper($attr['TOC-ODD-HEADER-VALUE'])=='OFF')) { $this->TOC_odd_header_value = -1; }
|
||||
if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE']=='1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE'])=='ON')) { $this->TOC_even_header_value = 1; }
|
||||
else if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE']=='-1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE'])=='OFF')) { $this->TOC_even_header_value = -1; }
|
||||
|
||||
if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE']=='1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE'])=='ON')) { $this->TOC_odd_footer_value = 1; }
|
||||
else if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE']=='-1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE'])=='OFF')) { $this->TOC_odd_footer_value = -1; }
|
||||
if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE']=='1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE'])=='ON')) { $this->TOC_even_footer_value = 1; }
|
||||
else if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE']=='-1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE'])=='OFF')) { $this->TOC_even_footer_value = -1; }
|
||||
if (isset($attr['TOC-PAGE-SELECTOR']) && $attr['TOC-PAGE-SELECTOR']) { $this->TOC_page_selector = $attr['TOC-PAGE-SELECTOR']; }
|
||||
else { $this->TOC_page_selector = ''; }
|
||||
if (isset($attr['TOC-SHEET-SIZE']) && $attr['TOC-SHEET-SIZE']) { $this->TOCsheetsize = $attr['TOC-SHEET-SIZE']; } else { $this->TOCsheetsize = ''; }
|
||||
|
||||
if (isset($attr['TOC-PREHTML']) && $attr['TOC-PREHTML']) { $this->TOCpreHTML = htmlspecialchars_decode($attr['TOC-PREHTML'],ENT_QUOTES); }
|
||||
if (isset($attr['TOC-POSTHTML']) && $attr['TOC-POSTHTML']) { $this->TOCpostHTML = htmlspecialchars_decode($attr['TOC-POSTHTML'],ENT_QUOTES); }
|
||||
if (isset($attr['TOC-BOOKMARKTEXT']) && $attr['TOC-BOOKMARKTEXT']) { $this->TOCbookmarkText = htmlspecialchars_decode($attr['TOC-BOOKMARKTEXT'],ENT_QUOTES); }
|
||||
}
|
||||
|
||||
if ($this->mpdf->y == $this->mpdf->tMargin && (!$this->mpdf->mirrorMargins ||($this->mpdf->mirrorMargins && $this->mpdf->page % 2==1))) {
|
||||
if ($toc_id) { $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; }
|
||||
else { $this->TOCmark = $this->mpdf->page; }
|
||||
// Don't add a page
|
||||
if ($this->mpdf->page==1 && count($this->mpdf->PageNumSubstitutions)==0) {
|
||||
$resetpagenum = '';
|
||||
$pagenumstyle = '';
|
||||
$suppress = '';
|
||||
if (isset($attr['RESETPAGENUM'])) { $resetpagenum = $attr['RESETPAGENUM']; }
|
||||
if (isset($attr['PAGENUMSTYLE'])) { $pagenumstyle = $attr['PAGENUMSTYLE']; }
|
||||
if (isset($attr['SUPPRESS'])) { $suppress = $attr['SUPPRESS']; }
|
||||
if (!$suppress) { $suppress = 'off'; }
|
||||
if (!$resetpagenum) { $resetpagenum= 1; }
|
||||
$this->mpdf->PageNumSubstitutions[] = array('from'=>1, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=> $suppress);
|
||||
}
|
||||
return array(true, $toc_id);
|
||||
}
|
||||
// No break - continues as PAGEBREAK...
|
||||
return array(false, $toc_id);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
2065
inc/3rdparty/libraries/mpdf/classes/ttfontsuni.php
vendored
Normal file
2065
inc/3rdparty/libraries/mpdf/classes/ttfontsuni.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
463
inc/3rdparty/libraries/mpdf/classes/ttfontsuni_analysis.php
vendored
Normal file
463
inc/3rdparty/libraries/mpdf/classes/ttfontsuni_analysis.php
vendored
Normal file
|
@ -0,0 +1,463 @@
|
|||
<?php
|
||||
|
||||
require_once(_MPDF_PATH.'classes/ttfontsuni.php');
|
||||
|
||||
class TTFontFile_Analysis EXTENDS TTFontFile {
|
||||
|
||||
// Used to get font information from files in directory
|
||||
function extractCoreInfo($file, $TTCfontID=0) {
|
||||
$this->filename = $file;
|
||||
$this->fh = fopen($file,'rb');
|
||||
if (!$this->fh) { return ('ERROR - Can\'t open file ' . $file); }
|
||||
$this->_pos = 0;
|
||||
$this->charWidths = '';
|
||||
$this->glyphPos = array();
|
||||
$this->charToGlyph = array();
|
||||
$this->tables = array();
|
||||
$this->otables = array();
|
||||
$this->ascent = 0;
|
||||
$this->descent = 0;
|
||||
$this->numTTCFonts = 0;
|
||||
$this->TTCFonts = array();
|
||||
$this->version = $version = $this->read_ulong();
|
||||
$this->panose = array(); // mPDF 5.0
|
||||
if ($version==0x4F54544F)
|
||||
return("ERROR - NOT ADDED as Postscript outlines are not supported - " . $file);
|
||||
if ($version==0x74746366) {
|
||||
if ($TTCfontID > 0) {
|
||||
$this->version = $version = $this->read_ulong(); // TTC Header version now
|
||||
if (!in_array($version, array(0x00010000,0x00020000)))
|
||||
return("ERROR - NOT ADDED as Error parsing TrueType Collection: version=".$version." - " . $file);
|
||||
}
|
||||
else return("ERROR - Error parsing TrueType Collection - " . $file);
|
||||
$this->numTTCFonts = $this->read_ulong();
|
||||
for ($i=1; $i<=$this->numTTCFonts; $i++) {
|
||||
$this->TTCFonts[$i]['offset'] = $this->read_ulong();
|
||||
}
|
||||
$this->seek($this->TTCFonts[$TTCfontID]['offset']);
|
||||
$this->version = $version = $this->read_ulong(); // TTFont version again now
|
||||
$this->readTableDirectory(false);
|
||||
}
|
||||
else {
|
||||
if (!in_array($version, array(0x00010000,0x74727565)))
|
||||
return("ERROR - NOT ADDED as Not a TrueType font: version=".$version." - " . $file);
|
||||
$this->readTableDirectory(false);
|
||||
}
|
||||
|
||||
/* Included for testing...
|
||||
$cmap_offset = $this->seek_table("cmap");
|
||||
$this->skip(2);
|
||||
$cmapTableCount = $this->read_ushort();
|
||||
$unicode_cmap_offset = 0;
|
||||
for ($i=0;$i<$cmapTableCount;$i++) {
|
||||
$x[$i]['platformId'] = $this->read_ushort();
|
||||
$x[$i]['encodingId'] = $this->read_ushort();
|
||||
$x[$i]['offset'] = $this->read_ulong();
|
||||
$save_pos = $this->_pos;
|
||||
$x[$i]['format'] = $this->get_ushort($cmap_offset + $x[$i]['offset'] );
|
||||
$this->seek($save_pos );
|
||||
}
|
||||
print_r($x); exit;
|
||||
*/
|
||||
///////////////////////////////////
|
||||
// name - Naming table
|
||||
///////////////////////////////////
|
||||
|
||||
/* Test purposes - displays table of names
|
||||
$name_offset = $this->seek_table("name");
|
||||
$format = $this->read_ushort();
|
||||
if ($format != 0 && $format != 1) // mPDF 5.3.73
|
||||
die("Unknown name table format ".$format);
|
||||
$numRecords = $this->read_ushort();
|
||||
$string_data_offset = $name_offset + $this->read_ushort();
|
||||
for ($i=0;$i<$numRecords; $i++) {
|
||||
$x[$i]['platformId'] = $this->read_ushort();
|
||||
$x[$i]['encodingId'] = $this->read_ushort();
|
||||
$x[$i]['languageId'] = $this->read_ushort();
|
||||
$x[$i]['nameId'] = $this->read_ushort();
|
||||
$x[$i]['length'] = $this->read_ushort();
|
||||
$x[$i]['offset'] = $this->read_ushort();
|
||||
|
||||
$N = '';
|
||||
if ($x[$i]['platformId'] == 1 && $x[$i]['encodingId'] == 0 && $x[$i]['languageId'] == 0) { // Roman
|
||||
$opos = $this->_pos;
|
||||
$N = $this->get_chunk($string_data_offset + $x[$i]['offset'] , $x[$i]['length'] );
|
||||
$this->_pos = $opos;
|
||||
$this->seek($opos);
|
||||
}
|
||||
else { // Unicode
|
||||
$opos = $this->_pos;
|
||||
$this->seek($string_data_offset + $x[$i]['offset'] );
|
||||
$length = $x[$i]['length'] ;
|
||||
if ($length % 2 != 0)
|
||||
$length -= 1;
|
||||
// die("PostScript name is UTF-16BE string of odd length");
|
||||
$length /= 2;
|
||||
$N = '';
|
||||
while ($length > 0) {
|
||||
$char = $this->read_ushort();
|
||||
$N .= (chr($char));
|
||||
$length -= 1;
|
||||
}
|
||||
$this->_pos = $opos;
|
||||
$this->seek($opos);
|
||||
}
|
||||
$x[$i]['names'][$nameId] = $N;
|
||||
}
|
||||
print_r($x); exit;
|
||||
*/
|
||||
|
||||
$name_offset = $this->seek_table("name");
|
||||
$format = $this->read_ushort();
|
||||
if ($format != 0 && $format != 1) // mPDF 5.3.73
|
||||
return("ERROR - NOT ADDED as Unknown name table format ".$format." - " . $file);
|
||||
$numRecords = $this->read_ushort();
|
||||
$string_data_offset = $name_offset + $this->read_ushort();
|
||||
$names = array(1=>'',2=>'',3=>'',4=>'',6=>'');
|
||||
$K = array_keys($names);
|
||||
$nameCount = count($names);
|
||||
for ($i=0;$i<$numRecords; $i++) {
|
||||
$platformId = $this->read_ushort();
|
||||
$encodingId = $this->read_ushort();
|
||||
$languageId = $this->read_ushort();
|
||||
$nameId = $this->read_ushort();
|
||||
$length = $this->read_ushort();
|
||||
$offset = $this->read_ushort();
|
||||
if (!in_array($nameId,$K)) continue;
|
||||
$N = '';
|
||||
if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { // Microsoft, Unicode, US English, PS Name
|
||||
$opos = $this->_pos;
|
||||
$this->seek($string_data_offset + $offset);
|
||||
if ($length % 2 != 0)
|
||||
$length += 1;
|
||||
$length /= 2;
|
||||
$N = '';
|
||||
while ($length > 0) {
|
||||
$char = $this->read_ushort();
|
||||
$N .= (chr($char));
|
||||
$length -= 1;
|
||||
}
|
||||
$this->_pos = $opos;
|
||||
$this->seek($opos);
|
||||
}
|
||||
else if ($platformId == 1 && $encodingId == 0 && $languageId == 0) { // Macintosh, Roman, English, PS Name
|
||||
$opos = $this->_pos;
|
||||
$N = $this->get_chunk($string_data_offset + $offset, $length);
|
||||
$this->_pos = $opos;
|
||||
$this->seek($opos);
|
||||
}
|
||||
if ($N && $names[$nameId]=='') {
|
||||
$names[$nameId] = $N;
|
||||
$nameCount -= 1;
|
||||
if ($nameCount==0) break;
|
||||
}
|
||||
}
|
||||
if ($names[6])
|
||||
$psName = preg_replace('/ /','-',$names[6]);
|
||||
else if ($names[4])
|
||||
$psName = preg_replace('/ /','-',$names[4]);
|
||||
else if ($names[1])
|
||||
$psName = preg_replace('/ /','-',$names[1]);
|
||||
else
|
||||
$psName = '';
|
||||
if (!$names[1] && !$psName)
|
||||
return("ERROR - NOT ADDED as Could not find valid font name - " . $file);
|
||||
$this->name = $psName;
|
||||
if ($names[1]) { $this->familyName = $names[1]; } else { $this->familyName = $psName; }
|
||||
if ($names[2]) { $this->styleName = $names[2]; } else { $this->styleName = 'Regular'; }
|
||||
|
||||
///////////////////////////////////
|
||||
// head - Font header table
|
||||
///////////////////////////////////
|
||||
$this->seek_table("head");
|
||||
$ver_maj = $this->read_ushort();
|
||||
$ver_min = $this->read_ushort();
|
||||
if ($ver_maj != 1)
|
||||
return('ERROR - NOT ADDED as Unknown head table version '. $ver_maj .'.'. $ver_min." - " . $file);
|
||||
$this->fontRevision = $this->read_ushort() . $this->read_ushort();
|
||||
$this->skip(4);
|
||||
$magic = $this->read_ulong();
|
||||
if ($magic != 0x5F0F3CF5)
|
||||
return('ERROR - NOT ADDED as Invalid head table magic ' .$magic." - " . $file);
|
||||
$this->skip(2);
|
||||
$this->unitsPerEm = $unitsPerEm = $this->read_ushort();
|
||||
$scale = 1000 / $unitsPerEm;
|
||||
$this->skip(24);
|
||||
$macStyle = $this->read_short();
|
||||
$this->skip(4);
|
||||
$indexLocFormat = $this->read_short();
|
||||
|
||||
///////////////////////////////////
|
||||
// OS/2 - OS/2 and Windows metrics table
|
||||
///////////////////////////////////
|
||||
$sFamily = '';
|
||||
$panose = '';
|
||||
$fsSelection = '';
|
||||
if (isset($this->tables["OS/2"])) {
|
||||
$this->seek_table("OS/2");
|
||||
$this->skip(30);
|
||||
$sF = $this->read_short();
|
||||
$sFamily = ($sF >> 8);
|
||||
$this->_pos += 10; //PANOSE = 10 byte length
|
||||
$panose = fread($this->fh,10);
|
||||
$this->panose = array();
|
||||
for ($p=0;$p<strlen($panose);$p++) { $this->panose[] = ord($panose[$p]); }
|
||||
$this->skip(20);
|
||||
$fsSelection = $this->read_short();
|
||||
}
|
||||
|
||||
///////////////////////////////////
|
||||
// post - PostScript table
|
||||
///////////////////////////////////
|
||||
$this->seek_table("post");
|
||||
$this->skip(4);
|
||||
$this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0;
|
||||
$this->skip(4);
|
||||
$isFixedPitch = $this->read_ulong();
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////
|
||||
// cmap - Character to glyph index mapping table
|
||||
///////////////////////////////////
|
||||
$cmap_offset = $this->seek_table("cmap");
|
||||
$this->skip(2);
|
||||
$cmapTableCount = $this->read_ushort();
|
||||
$unicode_cmap_offset = 0;
|
||||
for ($i=0;$i<$cmapTableCount;$i++) {
|
||||
$platformID = $this->read_ushort();
|
||||
$encodingID = $this->read_ushort();
|
||||
$offset = $this->read_ulong();
|
||||
$save_pos = $this->_pos;
|
||||
if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode
|
||||
$format = $this->get_ushort($cmap_offset + $offset);
|
||||
if ($format == 4) {
|
||||
if (!$unicode_cmap_offset) $unicode_cmap_offset = $cmap_offset + $offset;
|
||||
}
|
||||
}
|
||||
else if ((($platformID == 3 && $encodingID == 10) || $platformID == 0)) { // Microsoft, Unicode Format 12 table HKCS
|
||||
$format = $this->get_ushort($cmap_offset + $offset);
|
||||
if ($format == 12) {
|
||||
$unicode_cmap_offset = $cmap_offset + $offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
$this->seek($save_pos );
|
||||
}
|
||||
|
||||
if (!$unicode_cmap_offset)
|
||||
return('ERROR - Font ('.$this->filename .') NOT ADDED as it is not Unicode encoded, and cannot be used by mPDF');
|
||||
|
||||
$rtl = false;
|
||||
$indic = false;
|
||||
$cjk = false;
|
||||
$sip = false;
|
||||
$smp = false;
|
||||
$pua = false;
|
||||
$puaag = false;
|
||||
$glyphToChar = array();
|
||||
$unAGlyphs = '';
|
||||
// Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above
|
||||
if ($format == 12) {
|
||||
$this->seek($unicode_cmap_offset + 4);
|
||||
$length = $this->read_ulong();
|
||||
$limit = $unicode_cmap_offset + $length;
|
||||
$this->skip(4);
|
||||
$nGroups = $this->read_ulong();
|
||||
for($i=0; $i<$nGroups ; $i++) {
|
||||
$startCharCode = $this->read_ulong();
|
||||
$endCharCode = $this->read_ulong();
|
||||
$startGlyphCode = $this->read_ulong();
|
||||
if (($endCharCode > 0x20000 && $endCharCode < 0x2A6DF) || ($endCharCode > 0x2F800 && $endCharCode < 0x2FA1F)) {
|
||||
$sip = true;
|
||||
}
|
||||
if ($endCharCode > 0x10000 && $endCharCode < 0x1FFFF) {
|
||||
$smp = true;
|
||||
}
|
||||
if (($endCharCode > 0x0590 && $endCharCode < 0x077F) || ($endCharCode > 0xFE70 && $endCharCode < 0xFEFF) || ($endCharCode > 0xFB50 && $endCharCode < 0xFDFF)) {
|
||||
$rtl = true;
|
||||
}
|
||||
if ($endCharCode > 0x0900 && $endCharCode < 0x0DFF) {
|
||||
$indic = true;
|
||||
}
|
||||
if ($endCharCode > 0xE000 && $endCharCode < 0xF8FF) {
|
||||
$pua = true;
|
||||
if ($endCharCode > 0xF500 && $endCharCode < 0xF7FF) {
|
||||
$puaag = true;
|
||||
}
|
||||
}
|
||||
if (($endCharCode > 0x2E80 && $endCharCode < 0x4DC0) || ($endCharCode > 0x4E00 && $endCharCode < 0xA4CF) || ($endCharCode > 0xAC00 && $endCharCode < 0xD7AF) || ($endCharCode > 0xF900 && $endCharCode < 0xFAFF) || ($endCharCode > 0xFE30 && $endCharCode < 0xFE4F)) {
|
||||
$cjk = true;
|
||||
}
|
||||
|
||||
$offset = 0;
|
||||
// Get each glyphToChar - only point if going to analyse un-mapped Arabic Glyphs
|
||||
if (isset($this->tables['post'])) {
|
||||
for ($unichar=$startCharCode;$unichar<=$endCharCode;$unichar++) {
|
||||
$glyph = $startGlyphCode + $offset ;
|
||||
$offset++;
|
||||
$glyphToChar[$glyph][] = $unichar;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
else { // Format 4 CMap
|
||||
$this->seek($unicode_cmap_offset + 2);
|
||||
$length = $this->read_ushort();
|
||||
$limit = $unicode_cmap_offset + $length;
|
||||
$this->skip(2);
|
||||
|
||||
$segCount = $this->read_ushort() / 2;
|
||||
$this->skip(6);
|
||||
$endCount = array();
|
||||
for($i=0; $i<$segCount; $i++) { $endCount[] = $this->read_ushort(); }
|
||||
$this->skip(2);
|
||||
$startCount = array();
|
||||
for($i=0; $i<$segCount; $i++) { $startCount[] = $this->read_ushort(); }
|
||||
$idDelta = array();
|
||||
for($i=0; $i<$segCount; $i++) { $idDelta[] = $this->read_short(); }
|
||||
$idRangeOffset_start = $this->_pos;
|
||||
$idRangeOffset = array();
|
||||
for($i=0; $i<$segCount; $i++) { $idRangeOffset[] = $this->read_ushort(); }
|
||||
|
||||
for ($n=0;$n<$segCount;$n++) {
|
||||
if (($endCount[$n] > 0x0590 && $endCount[$n] < 0x077F) || ($endCount[$n] > 0xFE70 && $endCount[$n] < 0xFEFF) || ($endCount[$n] > 0xFB50 && $endCount[$n] < 0xFDFF)) {
|
||||
$rtl = true;
|
||||
}
|
||||
if ($endCount[$n] > 0x0900 && $endCount[$n] < 0x0DFF) {
|
||||
$indic = true;
|
||||
}
|
||||
if (($endCount[$n] > 0x2E80 && $endCount[$n] < 0x4DC0) || ($endCount[$n] > 0x4E00 && $endCount[$n] < 0xA4CF) || ($endCount[$n] > 0xAC00 && $endCount[$n] < 0xD7AF) || ($endCount[$n] > 0xF900 && $endCount[$n] < 0xFAFF) || ($endCount[$n] > 0xFE30 && $endCount[$n] < 0xFE4F)) {
|
||||
$cjk = true;
|
||||
}
|
||||
if ($endCount[$n] > 0xE000 && $endCount[$n] < 0xF8FF) {
|
||||
$pua = true;
|
||||
if ($endCount[$n] > 0xF500 && $endCount[$n] < 0xF7FF) {
|
||||
$puaag = true;
|
||||
}
|
||||
}
|
||||
// Get each glyphToChar - only point if going to analyse un-mapped Arabic Glyphs
|
||||
if (isset($this->tables['post'])) {
|
||||
$endpoint = ($endCount[$n] + 1);
|
||||
for ($unichar=$startCount[$n];$unichar<$endpoint;$unichar++) {
|
||||
if ($idRangeOffset[$n] == 0)
|
||||
$glyph = ($unichar + $idDelta[$n]) & 0xFFFF;
|
||||
else {
|
||||
$offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n];
|
||||
$offset = $idRangeOffset_start + 2 * $n + $offset;
|
||||
if ($offset >= $limit)
|
||||
$glyph = 0;
|
||||
else {
|
||||
$glyph = $this->get_ushort($offset);
|
||||
if ($glyph != 0)
|
||||
$glyph = ($glyph + $idDelta[$n]) & 0xFFFF;
|
||||
}
|
||||
}
|
||||
$glyphToChar[$glyph][] = $unichar;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
// 'POST' table for un-mapped arabic glyphs
|
||||
if (isset($this->tables['post'])) {
|
||||
$this->seek_table("post");
|
||||
// Only works on Format 2.0
|
||||
$formata = $this->read_ushort();
|
||||
$formatb = $this->read_ushort();
|
||||
if ($formata == 2 && $formatb == 0) {
|
||||
$this->skip(28);
|
||||
$nGlyfs = $this->read_ushort();
|
||||
$glyphNameIndex = array();
|
||||
for ($i=0; $i<$nGlyfs; $i++) {
|
||||
$glyphNameIndex[($this->read_ushort())] = $i;
|
||||
}
|
||||
|
||||
$opost = $this->get_table('post');
|
||||
$ptr = 34+($nGlyfs*2);
|
||||
for ($i=0; $i<$nGlyfs; $i++) {
|
||||
$len = ord(substr($opost,$ptr,1));
|
||||
$ptr++;
|
||||
$name = substr($opost,$ptr,$len);
|
||||
$gid = $glyphNameIndex[$i+258];
|
||||
// Select uni0600.xxx(x) - uni06FF.xxx(x)
|
||||
if (preg_match('/^uni(06[0-9a-f]{2})\.(fina|medi|init|fin|med|ini)$/i',$name,$m)) {
|
||||
if (!isset($glyphToChar[$gid]) || (isset($glyphToChar[$gid]) && is_array($glyphToChar[$gid]) && count($glyphToChar[$gid])==1 && $glyphToChar[$gid][0]>57343 && $glyphToChar[$gid][0]<63489)) { // if set in PUA private use area E000-F8FF, or NOT Unicode mapped
|
||||
$uni = hexdec($m[1]);
|
||||
$form = strtoupper(substr($m[2],0,1));
|
||||
// Assign new PUA Unicode between F500 - F7FF
|
||||
$bit = $uni & 0xFF;
|
||||
if ($form == 'I') { $bit += 0xF600; }
|
||||
else if ($form == 'M') { $bit += 0xF700; }
|
||||
else { $bit += 0xF500; }
|
||||
$unAGlyphs .= $gid;
|
||||
$name = 'uni'.strtoupper($m[1]).'.'.strtolower($m[2]);
|
||||
$unAGlyphs .= ' : '.$name;
|
||||
$unihexstr = $m[1];
|
||||
$unAGlyphs .= ' : '.$unihexstr;
|
||||
$unAGlyphs .= ' : '.$uni;
|
||||
$unAGlyphs .= ' : '.$form;
|
||||
// if already set in PUA private use area E000-F8FF
|
||||
if (isset($glyphToChar[$gid]) && $glyphToChar[$gid][0]>57343 && $glyphToChar[$gid][0]<63489) {
|
||||
$unAGlyphs .= ' : '.$glyphToChar[$gid][0].' {'.dechex($glyphToChar[$gid][0]).'}';
|
||||
}
|
||||
//else $unAGlyphs .= ':';
|
||||
$unAGlyphs .= ' : '.strtoupper(dechex($bit));
|
||||
$unAGlyphs .= '<br />';
|
||||
}
|
||||
}
|
||||
$ptr += $len;
|
||||
}
|
||||
if ($unAGlyphs) {
|
||||
$unAGlyphs = 'GID:Name:Unicode base Hex:Dec:Form:PUA Unicode<br />'.$unAGlyphs ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
$bold = false;
|
||||
$italic = false;
|
||||
$ftype = '';
|
||||
if ($macStyle & (1 << 0)) { $bold = true; } // bit 0 bold
|
||||
else if ($fsSelection & (1 << 5)) { $bold = true; } // 5 BOLD Characters are emboldened
|
||||
|
||||
if ($macStyle & (1 << 1)) { $italic = true; } // bit 1 italic
|
||||
else if ($fsSelection & (1 << 0)) { $italic = true; } // 0 ITALIC Font contains Italic characters, otherwise they are upright
|
||||
else if ($this->italicAngle <> 0) { $italic = true; }
|
||||
|
||||
if ($isFixedPitch ) { $ftype = 'mono'; }
|
||||
else if ($sFamily >0 && $sFamily <8) { $ftype = 'serif'; }
|
||||
else if ($sFamily ==8) { $ftype = 'sans'; }
|
||||
else if ($sFamily ==10) { $ftype = 'cursive'; }
|
||||
// Use PANOSE
|
||||
if ($panose) {
|
||||
$bFamilyType=ord($panose[0]);
|
||||
if ($bFamilyType==2) {
|
||||
$bSerifStyle=ord($panose[1]);
|
||||
if (!$ftype) {
|
||||
if ($bSerifStyle>1 && $bSerifStyle<11) { $ftype = 'serif'; }
|
||||
else if ($bSerifStyle>10) { $ftype = 'sans'; }
|
||||
}
|
||||
$bProportion=ord($panose[3]);
|
||||
if ($bProportion==9 || $bProportion==1) { $ftype = 'mono'; } // ==1 i.e. No Fit needed for OCR-a and -b
|
||||
}
|
||||
else if ($bFamilyType==3) {
|
||||
$ftype = 'cursive';
|
||||
}
|
||||
}
|
||||
|
||||
fclose($this->fh);
|
||||
return array($this->familyName, $bold, $italic, $ftype, $TTCfontID, $rtl, $indic, $cjk, $sip, $smp, $puaag, $pua, $unAGlyphs);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
236
inc/3rdparty/libraries/mpdf/classes/wmf.php
vendored
Normal file
236
inc/3rdparty/libraries/mpdf/classes/wmf.php
vendored
Normal file
|
@ -0,0 +1,236 @@
|
|||
<?php
|
||||
|
||||
class wmf {
|
||||
|
||||
var $mpdf = null;
|
||||
var $gdiObjectArray;
|
||||
|
||||
function wmf(&$mpdf) {
|
||||
$this->mpdf = $mpdf;
|
||||
}
|
||||
|
||||
|
||||
function _getWMFimage($data) {
|
||||
$k = _MPDFK;
|
||||
|
||||
$this->gdiObjectArray = array();
|
||||
$a=unpack('stest',"\1\0");
|
||||
if ($a['test']!=1)
|
||||
return array(0, 'Error parsing WMF image - Big-endian architecture not supported');
|
||||
// check for Aldus placeable metafile header
|
||||
$key = unpack('Lmagic', substr($data, 0, 4));
|
||||
$p = 18; // WMF header
|
||||
if ($key['magic'] == (int)0x9AC6CDD7) { $p +=22; } // Aldus header
|
||||
// define some state variables
|
||||
$wo=null; // window origin
|
||||
$we=null; // window extent
|
||||
$polyFillMode = 0;
|
||||
$nullPen = false;
|
||||
$nullBrush = false;
|
||||
$endRecord = false;
|
||||
$wmfdata = '';
|
||||
while ($p < strlen($data) && !$endRecord) {
|
||||
$recordInfo = unpack('Lsize/Sfunc', substr($data, $p, 6)); $p += 6;
|
||||
// size of record given in WORDs (= 2 bytes)
|
||||
$size = $recordInfo['size'];
|
||||
// func is number of GDI function
|
||||
$func = $recordInfo['func'];
|
||||
if ($size > 3) {
|
||||
$parms = substr($data, $p, 2*($size-3)); $p += 2*($size-3);
|
||||
}
|
||||
switch ($func) {
|
||||
case 0x020b: // SetWindowOrg
|
||||
// do not allow window origin to be changed
|
||||
// after drawing has begun
|
||||
if (!$wmfdata)
|
||||
$wo = array_reverse(unpack('s2', $parms));
|
||||
break;
|
||||
case 0x020c: // SetWindowExt
|
||||
// do not allow window extent to be changed
|
||||
// after drawing has begun
|
||||
if (!$wmfdata)
|
||||
$we = array_reverse(unpack('s2', $parms));
|
||||
break;
|
||||
case 0x02fc: // CreateBrushIndirect
|
||||
$brush = unpack('sstyle/Cr/Cg/Cb/Ca/Shatch', $parms);
|
||||
$brush['type'] = 'B';
|
||||
$this->_AddGDIObject($brush);
|
||||
break;
|
||||
case 0x02fa: // CreatePenIndirect
|
||||
$pen = unpack('Sstyle/swidth/sdummy/Cr/Cg/Cb/Ca', $parms);
|
||||
// convert width from twips to user unit
|
||||
$pen['width'] /= (20 * $k);
|
||||
$pen['type'] = 'P';
|
||||
$this->_AddGDIObject($pen);
|
||||
break;
|
||||
|
||||
// MUST create other GDI objects even if we don't handle them
|
||||
case 0x06fe: // CreateBitmap
|
||||
case 0x02fd: // CreateBitmapIndirect
|
||||
case 0x00f8: // CreateBrush
|
||||
case 0x02fb: // CreateFontIndirect
|
||||
case 0x00f7: // CreatePalette
|
||||
case 0x01f9: // CreatePatternBrush
|
||||
case 0x06ff: // CreateRegion
|
||||
case 0x0142: // DibCreatePatternBrush
|
||||
$dummyObject = array('type'=>'D');
|
||||
$this->_AddGDIObject($dummyObject);
|
||||
break;
|
||||
case 0x0106: // SetPolyFillMode
|
||||
$polyFillMode = unpack('smode', $parms);
|
||||
$polyFillMode = $polyFillMode['mode'];
|
||||
break;
|
||||
case 0x01f0: // DeleteObject
|
||||
$idx = unpack('Sidx', $parms);
|
||||
$idx = $idx['idx'];
|
||||
$this->_DeleteGDIObject($idx);
|
||||
break;
|
||||
case 0x012d: // SelectObject
|
||||
$idx = unpack('Sidx', $parms);
|
||||
$idx = $idx['idx'];
|
||||
$obj = $this->_GetGDIObject($idx);
|
||||
switch ($obj['type']) {
|
||||
case 'B':
|
||||
$nullBrush = false;
|
||||
if ($obj['style'] == 1) { $nullBrush = true; }
|
||||
else {
|
||||
$wmfdata .= $this->mpdf->SetFColor($this->mpdf->ConvertColor('rgb('.$obj['r'].','.$obj['g'].','.$obj['b'].')'), true)."\n";
|
||||
}
|
||||
break;
|
||||
case 'P':
|
||||
$nullPen = false;
|
||||
$dashArray = array();
|
||||
// dash parameters are custom
|
||||
switch ($obj['style']) {
|
||||
case 0: // PS_SOLID
|
||||
break;
|
||||
case 1: // PS_DASH
|
||||
$dashArray = array(3,1);
|
||||
break;
|
||||
case 2: // PS_DOT
|
||||
$dashArray = array(0.5,0.5);
|
||||
break;
|
||||
case 3: // PS_DASHDOT
|
||||
$dashArray = array(2,1,0.5,1);
|
||||
break;
|
||||
case 4: // PS_DASHDOTDOT
|
||||
$dashArray = array(2,1,0.5,1,0.5,1);
|
||||
break;
|
||||
case 5: // PS_NULL
|
||||
$nullPen = true;
|
||||
break;
|
||||
}
|
||||
if (!$nullPen) {
|
||||
$wmfdata .= $this->mpdf->SetDColor($this->mpdf->ConvertColor('rgb('.$obj['r'].','.$obj['g'].','.$obj['b'].')'), true)."\n";
|
||||
$wmfdata .= sprintf("%.3F w\n",$obj['width']*$k);
|
||||
}
|
||||
if (!empty($dashArray)) {
|
||||
$s = '[';
|
||||
for ($i=0; $i<count($dashArray);$i++) {
|
||||
$s .= $dashArray[$i] * $k;
|
||||
if ($i != count($dashArray)-1) { $s .= ' '; }
|
||||
}
|
||||
$s .= '] 0 d';
|
||||
$wmfdata .= $s."\n";
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0x0325: // Polyline
|
||||
case 0x0324: // Polygon
|
||||
$coords = unpack('s'.($size-3), $parms);
|
||||
$numpoints = $coords[1];
|
||||
for ($i = $numpoints; $i > 0; $i--) {
|
||||
$px = $coords[2*$i];
|
||||
$py = $coords[2*$i+1];
|
||||
|
||||
if ($i < $numpoints) { $wmfdata .= $this->_LineTo($px, $py); }
|
||||
else { $wmfdata .= $this->_MoveTo($px, $py); }
|
||||
}
|
||||
if ($func == 0x0325) { $op = 's'; }
|
||||
else if ($func == 0x0324) {
|
||||
if ($nullPen) {
|
||||
if ($nullBrush) { $op = 'n'; } // no op
|
||||
else { $op = 'f'; } // fill
|
||||
}
|
||||
else {
|
||||
if ($nullBrush) { $op = 's'; } // stroke
|
||||
else { $op = 'b'; } // stroke and fill
|
||||
}
|
||||
if ($polyFillMode==1 && ($op=='b' || $op=='f')) { $op .= '*'; } // use even-odd fill rule
|
||||
}
|
||||
$wmfdata .= $op."\n";
|
||||
break;
|
||||
case 0x0538: // PolyPolygon
|
||||
$coords = unpack('s'.($size-3), $parms);
|
||||
$numpolygons = $coords[1];
|
||||
$adjustment = $numpolygons;
|
||||
for ($j = 1; $j <= $numpolygons; $j++) {
|
||||
$numpoints = $coords[$j + 1];
|
||||
for ($i = $numpoints; $i > 0; $i--) {
|
||||
$px = $coords[2*$i + $adjustment];
|
||||
$py = $coords[2*$i+1 + $adjustment];
|
||||
if ($i == $numpoints) { $wmfdata .= $this->_MoveTo($px, $py); }
|
||||
else { $wmfdata .= $this->_LineTo($px, $py); }
|
||||
}
|
||||
$adjustment += $numpoints * 2;
|
||||
}
|
||||
|
||||
if ($nullPen) {
|
||||
if ($nullBrush) { $op = 'n'; } // no op
|
||||
else { $op = 'f'; } // fill
|
||||
}
|
||||
else {
|
||||
if ($nullBrush) { $op = 's'; } // stroke
|
||||
else { $op = 'b'; } // stroke and fill
|
||||
}
|
||||
if ($polyFillMode==1 && ($op=='b' || $op=='f')) { $op .= '*'; } // use even-odd fill rule
|
||||
$wmfdata .= $op."\n";
|
||||
break;
|
||||
case 0x0000:
|
||||
$endRecord = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return array(1,$wmfdata,$wo,$we);
|
||||
}
|
||||
|
||||
|
||||
function _MoveTo($x, $y) {
|
||||
return "$x $y m\n";
|
||||
}
|
||||
|
||||
// a line must have been started using _MoveTo() first
|
||||
function _LineTo($x, $y) {
|
||||
return "$x $y l\n";
|
||||
}
|
||||
|
||||
function _AddGDIObject($obj) {
|
||||
// find next available slot
|
||||
$idx = 0;
|
||||
if (!empty($this->gdiObjectArray)) {
|
||||
$empty = false;
|
||||
$i = 0;
|
||||
while (!$empty) {
|
||||
$empty = !isset($this->gdiObjectArray[$i]);
|
||||
$i++;
|
||||
}
|
||||
$idx = $i-1;
|
||||
}
|
||||
$this->gdiObjectArray[$idx] = $obj;
|
||||
}
|
||||
|
||||
function _GetGDIObject($idx) {
|
||||
return $this->gdiObjectArray[$idx];
|
||||
}
|
||||
|
||||
function _DeleteGDIObject($idx) {
|
||||
unset($this->gdiObjectArray[$idx]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
Loading…
Add table
Add a link
Reference in a new issue