1<?php
2/**
3 * This file is part of FPDI
4 *
5 * @package   setasign\Fpdi
6 * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com)
7 * @license   http://opensource.org/licenses/mit-license The MIT License
8 */
9
10namespace setasign\Fpdi\PdfParser\Type;
11
12use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException;
13use setasign\Fpdi\PdfParser\PdfParser;
14use setasign\Fpdi\PdfParser\PdfParserException;
15
16/**
17 * A class defining a PDF data type
18 *
19 * @package setasign\Fpdi\PdfParser\Type
20 */
21class PdfType
22{
23    /**
24     * Resolves a PdfType value to its value.
25     *
26     * This method is used to evaluate indirect and direct object references until a final value is reached.
27     *
28     * @param PdfType $value
29     * @param PdfParser $parser
30     * @param bool $stopAtIndirectObject
31     * @return PdfType
32     * @throws CrossReferenceException
33     * @throws PdfParserException
34     */
35    public static function resolve(PdfType $value, PdfParser $parser, $stopAtIndirectObject = false)
36    {
37        if ($value instanceof PdfIndirectObject) {
38            if ($stopAtIndirectObject === true) {
39                return $value;
40            }
41
42            return self::resolve($value->value, $parser, $stopAtIndirectObject);
43        }
44
45        if ($value instanceof PdfIndirectObjectReference) {
46            return self::resolve($parser->getIndirectObject($value->value), $parser, $stopAtIndirectObject);
47        }
48
49        return $value;
50    }
51
52    /**
53     * Ensure that a value is an instance of a specific PDF type.
54     *
55     * @param string $type
56     * @param PdfType $value
57     * @param string $errorMessage
58     * @return mixed
59     * @throws PdfTypeException
60     */
61    protected static function ensureType($type, $value, $errorMessage)
62    {
63        if (!($value instanceof $type)) {
64            throw new PdfTypeException(
65                $errorMessage,
66                PdfTypeException::INVALID_DATA_TYPE
67            );
68        }
69
70        return $value;
71    }
72
73    /**
74     * The value of the PDF type.
75     *
76     * @var mixed
77     */
78    public $value;
79}
80