<?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*
		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));
				$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));
					$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($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 (isset($this->mpdf->CurrentFont['useOTL']) && $this->mpdf->CurrentFont['useOTL']) {
							if (preg_match("/([".$this->mpdf->pregCURSchars."])/u", $tmp)) { $inclCursive = true; }
						}
						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 is not fully supported for complex scripts
						// 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); }
		$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 = ' '.$text.' ';
	$this->mpdf->SetFont( $font, $fontstyle, $szfont, false );

	$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
	if (preg_match("/([".$this->mpdf->pregRTLchars."])/u", $text)) { $this->mpdf->biDirectional = true; }	// *RTL*

	$textvar = 0;
	$save_OTLtags = $this->mpdf->OTLtags;
	$this->mpdf->OTLtags = array();
	if ($this->mpdf->useKerning) {
		if ($this->mpdf->CurrentFont['haskernGPOS']) { $this->mpdf->OTLtags['Plus'] .= ' kern'; }
		else { $textvar = ($textvar | FC_KERNING); }
	}
	// Use OTL OpenType Table Layout - GSUB & GPOS
	if (isset($this->mpdf->CurrentFont['useOTL']) && $this->mpdf->CurrentFont['useOTL']) {
		$text = $this->mpdf->otl->applyOTL($text, $this->mpdf->CurrentFont['useOTL']);
		$OTLdata = $this->mpdf->otl->OTLdata;
	}
	$this->mpdf->OTLtags = $save_OTLtags ;

	$this->mpdf->magic_reverse_dir($text, $this->mpdf->directionality, $OTLdata, '', '');

	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, false );
		$sz = $this->mpdf->GetStringWidth( $text, true, $OTLdata, $textvar );
		if ( ($r1+$sz) > $r2 )
			$szfont --;
		else
			$loop ++;
	}
	$this->mpdf->SetFont( $font, $fontstyle, $szfont, true, true );

	$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",0,'',0,0,0,'M', 0, 0, 0, false, $OTLdata, $textvar );
	$this->mpdf->SetY($y1+$y2+2);	// +2 = mm margin below shaded box
	$this->mpdf->Reset();
}


}

?>