Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.

Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402] [Versions 400 and 402] [Versions 401 and 402]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Shared;
   4  
   5  use GdImage;
   6  use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException;
   7  use SimpleXMLElement;
   8  
   9  class Drawing
  10  {
  11      /**
  12       * Convert pixels to EMU.
  13       *
  14       * @param int $pixelValue Value in pixels
  15       *
  16       * @return int Value in EMU
  17       */
  18      public static function pixelsToEMU($pixelValue)
  19      {
  20          return $pixelValue * 9525;
  21      }
  22  
  23      /**
  24       * Convert EMU to pixels.
  25       *
  26       * @param int|SimpleXMLElement $emuValue Value in EMU
  27       *
  28       * @return int Value in pixels
  29       */
  30      public static function EMUToPixels($emuValue)
  31      {
  32          $emuValue = (int) $emuValue;
  33          if ($emuValue != 0) {
  34              return (int) round($emuValue / 9525);
  35          }
  36  
  37          return 0;
  38      }
  39  
  40      /**
  41       * Convert pixels to column width. Exact algorithm not known.
  42       * By inspection of a real Excel file using Calibri 11, one finds 1000px ~ 142.85546875
  43       * This gives a conversion factor of 7. Also, we assume that pixels and font size are proportional.
  44       *
  45       * @param int $pixelValue Value in pixels
  46       *
  47       * @return float|int Value in cell dimension
  48       */
  49      public static function pixelsToCellDimension($pixelValue, \PhpOffice\PhpSpreadsheet\Style\Font $defaultFont)
  50      {
  51          // Font name and size
  52          $name = $defaultFont->getName();
  53          $size = $defaultFont->getSize();
  54  
  55          if (isset(Font::$defaultColumnWidths[$name][$size])) {
  56              // Exact width can be determined
  57              return $pixelValue * Font::$defaultColumnWidths[$name][$size]['width']
  58                  / Font::$defaultColumnWidths[$name][$size]['px'];
  59          }
  60  
  61          // We don't have data for this particular font and size, use approximation by
  62          // extrapolating from Calibri 11
  63          return $pixelValue * 11 * Font::$defaultColumnWidths['Calibri'][11]['width']
  64              / Font::$defaultColumnWidths['Calibri'][11]['px'] / $size;
  65      }
  66  
  67      /**
  68       * Convert column width from (intrinsic) Excel units to pixels.
  69       *
  70       * @param float $cellWidth Value in cell dimension
  71       * @param \PhpOffice\PhpSpreadsheet\Style\Font $defaultFont Default font of the workbook
  72       *
  73       * @return int Value in pixels
  74       */
  75      public static function cellDimensionToPixels($cellWidth, \PhpOffice\PhpSpreadsheet\Style\Font $defaultFont)
  76      {
  77          // Font name and size
  78          $name = $defaultFont->getName();
  79          $size = $defaultFont->getSize();
  80  
  81          if (isset(Font::$defaultColumnWidths[$name][$size])) {
  82              // Exact width can be determined
  83              $colWidth = $cellWidth * Font::$defaultColumnWidths[$name][$size]['px']
  84                  / Font::$defaultColumnWidths[$name][$size]['width'];
  85          } else {
  86              // We don't have data for this particular font and size, use approximation by
  87              // extrapolating from Calibri 11
  88              $colWidth = $cellWidth * $size * Font::$defaultColumnWidths['Calibri'][11]['px']
  89                  / Font::$defaultColumnWidths['Calibri'][11]['width'] / 11;
  90          }
  91  
  92          // Round pixels to closest integer
  93          $colWidth = (int) round($colWidth);
  94  
  95          return $colWidth;
  96      }
  97  
  98      /**
  99       * Convert pixels to points.
 100       *
 101       * @param int $pixelValue Value in pixels
 102       *
 103       * @return float Value in points
 104       */
 105      public static function pixelsToPoints($pixelValue)
 106      {
 107          return $pixelValue * 0.75;
 108      }
 109  
 110      /**
 111       * Convert points to pixels.
 112       *
 113       * @param int $pointValue Value in points
 114       *
 115       * @return int Value in pixels
 116       */
 117      public static function pointsToPixels($pointValue)
 118      {
 119          if ($pointValue != 0) {
 120              return (int) ceil($pointValue / 0.75);
 121          }
 122  
 123          return 0;
 124      }
 125  
 126      /**
 127       * Convert degrees to angle.
 128       *
 129       * @param int $degrees Degrees
 130       *
 131       * @return int Angle
 132       */
 133      public static function degreesToAngle($degrees)
 134      {
 135          return (int) round($degrees * 60000);
 136      }
 137  
 138      /**
 139       * Convert angle to degrees.
 140       *
 141       * @param int|SimpleXMLElement $angle Angle
 142       *
 143       * @return int Degrees
 144       */
 145      public static function angleToDegrees($angle)
 146      {
 147          $angle = (int) $angle;
 148          if ($angle != 0) {
 149              return (int) round($angle / 60000);
 150          }
 151  
 152          return 0;
 153      }
 154  
 155      /**
 156       * Create a new image from file. By alexander at alexauto dot nl.
 157       *
 158       * @see http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214
 159       *
 160       * @param string $bmpFilename Path to Windows DIB (BMP) image
 161       *
 162       * @return GdImage|resource
 163       *
 164       * @deprecated 1.26 use Php function imagecreatefrombmp instead
 165       *
 166       * @codeCoverageIgnore
 167       */
 168      public static function imagecreatefrombmp($bmpFilename)
 169      {
 170          $retVal = @imagecreatefrombmp($bmpFilename);
 171          if ($retVal === false) {
 172              throw new ReaderException("Unable to create image from $bmpFilename");
 173          }
 174  
 175          return $retVal;
 176      }
 177  }