0.9.11  2026-06-05T07:24:30+12:00
    - Add some PDF 2.0 definitions to PDF::StructTreeRoot standard structure types
    - Tidy and minimize canvas finishing and content stream editing.

0.9.10  2025-08-26T06:28:17+12:00
    - Add PDF::Content::Tag dest-name() accessor. For use by PDF::Tags.

0.9.9  2025-08-21T06:50:07+12:00
    - Better handle failure to load image
    - Unbreak canvas pre-graphics method

0.9.8  2025-07-28T14:20:26+12:00
    - Allow gfx() method to take an optional code block; make
      it behave similarly to the similarly named graphics method

0.9.7  2025-07-24T13:31:25+12:00
    - Save the existing Text Box :baseline option as an attribute. Note:
      1. This is a symbolic name for the baseline, taken from the HTML Canvas
         specification https://html.spec.whatwg.org/multipage/canvas.html
      2. The existing baseline-shift() method is the scaled horizontal shift
         from the font's actual baseline.
    - Fix the text-box clone method to take a deep copy of the style; this
      avoid changes to the cloned fonts style from affecting the original.

0.9.6  2025-05-18T07:31:44+12:00
    - Deprecate ListElemTags List enumeration in favour of
      LIST; to avoid potential clashes with Raku data-types.

0.9.5  2025-05-11T11:14:46+12:00
    - Remove PDF::Content::XObject type() method, added in 0.9.4
      Causing regressions in PDF::API6

0.9.4  2025-05-11T10:52:46+12:00
    - Fix text-box calculated position, for variable
      first-line height.
    - Fix placement of Image-XObjects in text blocks
    - Allow print()/say() on XObjects, as an alternative
      to do().

0.9.3  2025-05-06T08:22:37+12:00
    - Fix Op::TooFewArgs exception
    - Fix loss of leading atom in text-box overflow.

0.9.2  2025-02-19T06:57:42+13:00
    - Further fixes to Y offset placement.

0.9.1  2025-02-18T08:55:20+13:00
    - Fix text-flow regression. Noticed in PDF-API6/t/colors.t
      rendering.

0.9.0  2025-02-18T06:23:36+13:00
    - Add margins (top left bottom right) and offset[dx,dy] to
      text boxes.

0.8.16  2025-02-08T08:45:59+13:00
    - Fix text-box rendering bug with changing the height of
      the first line.

0.8.15  2024-12-25T07:56:04+13:00
    - Delegate font encoding and hyphen processing from
      text box to text style.
    - Select either \c[HYPEN] and \c[HYPHEN-MINUS] from fonts

0.8.14  2024-12-24T07:43:50+13:00
    - Handle partial and multiple space characters:
    \c[EN SPACE] \c[EM SPACE] \c[THIN SPACE] \c[HAIR SPACE]
    \c[THREE-PER-EM SPACE] \c[FOUR-PER-EM SPACE] \c[SIX-PER-EM SPACE]

0.8.13  2024-12-23T07:09:50+13:00
    - Handle zero width spaces.
    - Accept both \c[HYPEN] and \c[HYPHEN-MINUS] as a continuation
      hyphen in input text and for font rendering.

0.8.12  2024-12-09T07:07:11+13:00
    - Tweak current-point() for #28 and also to more faithfully follow
      the spec. Return an undefined list, if there's no current point,
      rather than (undef, undef).

0.8.11  2024-12-06T17:19:32+13:00
    - Handle "\c[HYPHENATION POINT]" characters in input text. They
      may converted to actual hyphens to facilitate line-breaking,
      but are otherwise ignored.
    - Tweak justification of partial lines. Add `:max-word-gap`
      option. Perform text block alignment early to facilitate
      introspection. Make line word-gap() into a read/write
      assessor to allow adjustments.

0.8.10  2024-10-15T07:18:16+13:00
    - Fix X::PDF::Content::Image subclassing
    - Implement core-font-name(), is-embedded(), is-subset() and
      is-core-font() methods in PDF::Content::FontObj role
    - Add target-class() to PDFTiny::Loader

0.8.9  2024-09-29T06:36:58+13:00
    - Add replace ad-hoc "Illegal nesting of marked content" with
      specific X::PDF::Content::OP::BadNesting::MarkedContent exception
    - Rename exceptions X::PDF::Image:: to X::PDF::Content::Image::
    - Create a compilation unit for X::PDF::Content exceptions

0.8.8  2024-09-22T10:10:22+12:00
    - Add Page-Tree global-resources-scope() rw accessor #24

0.8.7  2024-09-17T07:31:52+12:00
    - Allow canvas resource-key() method to be used as a setter. See t/do.t

0.8.6  2024-09-06T07:49:22+12:00
    - Fix off-by-one bug in 'Unexpected Operator' warnings
    - Rework matrix inverse() function

0.8.5  2024-07-31T06:33:26+12:00
    - Add a PDF::Native v0.1.8+ fast-path for parsing and serializing
      graphics content.

0.8.4  2024-07-28T09:42:57+12:00
    - Handle potential 2-dimensional kerning from PDF::Font::Loader
      shaping.

0.8.3  2024-07-23T05:41:11+12:00
    - Fix inline-content() method, broken in 0.8.2

0.8.2  2024-07-23T05:12:02+12:00
    - Support PDF 2.0 mandated /L (length) entry in inline XObject Images
    - Revised inline image handling for latest PDF and PDF::Grammar.

0.8.1  2024-02-27T08:11:19+13:00
    - Support text box :shape, :!kern option combination. I.e. shaping,
      but without horizontal kerning.

0.8.0  2024-02-15T13:09:07+13:00
    - Add text-box :$direction and :$bidi options. These require
      installation of the optional Text::FriBidi Raku module.

0.7.7  2024-02-07T08:26:57+13:00
    - Store original text atoms in text lines @!decoded attribute.
      Fix text() method to return these rejoined, rather than
      encoded byte-strings.

0.7.6  2024-01-31T11:16:39+13:00
   - Handle missing Ascender, Descender metric values in height
     calculations for ZapfDingbats & Symbol core fonts.

0.7.5  2024-01-28T12:02:11+13:00
   - Implicitly set baseline to match valign so that the entire
     text box and, in particular, a single line of text is aligned
     as expected - see https://github.com/pdf-raku/PDF-API6/issues/17

0.7.4  2024-01-21T10:47:12+13:00
   - Add encoding allocate-cid() method - for PDF::Font::Loader
     v0.8.0+ shaping.

0.7.3  2024-01-02T07:45:29+13:00
   - Add core-font shape method with ligatures and kerning.
   - Add PDF::Content::Font::Encoder interface role

0.7.2  2023-10-17T06:40:11+13:00
   - Fix local-glyph-name return value. Was causing regressions
     in PDF::To::Cairo

0.7.1  2023-09-17T08:37:57+12:00
   - Fix Canvas `has-pre-gfx()` return value. Was causing regressions
     in PDF::Font::Loader.
   - Refactor text-box text positioning calculations

0.7.0  2023-09-11T08:09:51+12:00
   - Tone down text-box :valign to only affect the text flow of multi-
     line text boxes. This removes the overlap with :baseline-shift.
     They no longer combine to allow shifting of Text boxes by up to
     two lines #16

0.6.16  2023-09-08T08:29:55+12:00
   - Make text-box text() method a rw accessor
   - Fix text box rendering x, y returned position
   - Fix text flow with horizontal and vertical alignment

0.6.15  2023-08-26T07:00:47+12:00
   - Breakup README.md add source-level POD. Add Makefile with 'doc'
     target to build markdown under 'docs/' directory
   - Add return constraints to methods/subs (mostly to improve POD)

0.6.14  2023-08-02T15:25:37+12:00
   - Exclude invisible text from text-flow calculations

0.6.13  2023-08-02T13:02:41+12:00
   - Fixes to return positional values of Graphics .print and .say methods:
     my ($x0, $y0, $x1, $y1) = $gfx.print("text");
     -- Track and take account of current text flow in computing $x0, $x1:
        This is only an issue if the text is continuing the current line
     -- Add any :$baseline offset to $y0, $y1.

0.6.12  2023-06-30T07:17:24+12:00
   - Export PDF::Content::Font::Enc::Type1 :Type1EncodingScheme
   - Fix over-generalised caching of fonts

0.6.11  2023-06-29T08:23:35+12:00
   - Add PDF::Content user-coords() method. This is the inverse of
     the existing base-coords() method.
   - Added automatic font object loading from the content stream. See
     tests in t/text-box.t. Also requires PDF::Font::Loader.
   - Added type() and encoding() methods to core fonts for improved
     compatibility with PDF::Font::Loader::FontObj objects.

0.6.10  2023-03-15T07:04:53+13:00
   - Add PDF::Content::API role. A set of base methods for
     content APIs (PDF::Class, PDF::Lite).
   - Make to-landscape() available as an exportable sub

0.6.9  2022-11-28T07:27:39+13:00
   - Fix font over-encoding of glyphs not actually present in
     particular core fonts,
   - Restore backwards compatibility to Rakudo 2011.12

0.6.8  2022-11-24T09:55:04+13:00
   - Handle /ReversedChars tags in content stream.
   - Fix setting text-position, when only X is specified.

0.6.7  2022-08-03T08:36:45+12:00
   - Added MiterLimit and BlendMode graphics variables

0.6.6  2022-07-26T16:44:19+12:00
   - Fix page to-object() form construction

0.6.5  2022-07-03T07:54:38+12:00
   - Protect a potential race in setting font encoding
   - Revert loading of tag dictionaries from 0.6.4 release

0.6.4  2022-06-09T09:35:37+12:00
   - Convert ops to PDF 0.5.8+ :lite AST

0.6.3  2022-06-07T16:49:54+12:00
   - Adjust tests for PDF 0.5.8. Use PDF::COS::Util from-ast()
     sub in PDF::Content::Ops for proper encapsulation

0.6.2  2022-05-26T15:12:29+12:00
   - Fix PDF::Content::PageTree add-pages() method

0.6.1  2022-05-11T07:50:18+12:00
   - Fix PDF::Class regression in 0.6.0
   - Add Cache subclass to PDF::Font::CoreFont. Use it in
     PDFTiny test class for PDF level caching #15

0.6.0  2022-05-10T11:01:38+12:00
   This release targets parallel thread-safe page construction
   - Bump dependents PDF and Font::AFM to thread-safe versions
   - Add PDF::Content::PageTree page-fragment() and pages-fragment() methods.
     These are individual pages or page-trees for concurrent composition.
     They can be built in parallel and in any order before being added
     sequentially using the add-page() method.
   - Make core-fonts and 'require' of classes thread safe. These seem to
     be the main internal areas of thread-safety contention

0.5.17  2022-03-25T08:53:53+13:00
   - Add text box Str() method
   - Add final TextNewLine (T*) Op on text overflow. This sets the text
     position to the bottom of the rendered text. Also assists PDF::Tags::Reader
     to accurately detect new-lines.
   - Suppress actual-test collection in content marked as 'Artifact'
   - move module from CPAN to zef

0.5.16  2021-12-29T08:09:53+13:00
    - Fix text-box overflow handling.

0.5.15  2021-12-20T12:38:25+13:00
   - Fix PDF::Font::Loader regression in 0.5.14 release

0.5.14  2021-12-20T09:19:19+13:00
   - Fixed duplication in ExtGState graphics resources. For example
     `$gfx.FillAlpha = 0.5; $gfx.FillAlpha = 0.5` was resulting in
     two separate resource entries.

0.5.13  2021-12-16T09:14:53+13:00
   - Replaced $*ActualText with PDF::Content.actual-text() attribute
   - Treat trailing space as significant in print() method
   - Performance tweaks in PDF::Content and PDF::Content::ResourceDict

0.5.12  2021-12-11T08:23:28+13:00
   - Add underline-position() and underline-thickness() methods. Unscaled in
     PDF::Content::FontObj and scaled in PDF::Content::Text::Box. Available
     also in PDF::Font::Loader::FontObj v0.5.16+.
   - Add iterate-pages() method

0.5.11  2021-12-03T12:10:07+13:00
   - Renamed PDF::Content::Tag enumeration InlineElemTags::Code ->
     InlineElemTags::CODE; to avoid clashes with standard Raku classes.
   - Fixes to newly introduced text-box verbatim mode
   - Add missing tag enumeration :TableHead<THead>,
     renamed enumeration :TableFooter<TFoot> -> :TableFoot<TFoot>
   - Implement PDF::Context::Text::Box clone() method

0.5.10  2021-11-20T17:02:59+13:00
  - Added PDF::Content:Text::Box option/attributes:
    -- indent: similar to CSS text-indent property; indents the first line.
    -- verbatim: similar to Latex /verbatim mode: disables kerning, breaks on
       newlines and preserves spaces
  - Fixes to PDF::Content::CoreFont load-font() method

0.5.9  2021-10-12T17:38:03+13:00
  - Deprecate PDF::Content::Tags owner() in favour of canvas()

0.5.8  2021-10-08T14:36:22+13:00
  - Deprecate canvas(&code) for drawing to an HTML::Canvas in favour
    of html-canvas(&code).
  - canvas() method now returns the PDF::Content::Canvas containing
    object, either a Page, XObject Form or Pattern.

0.5.7  2021-10-02T08:19:46+13:00
  - Use PDF::Content v0.5.7+ PDF::Content::Canvas role for composing
    XObject Forms and Tiling Pattern classes

0.5.6  2021-09-14T09:24:28+12:00
   - Fix PDF::Content do() positioning for XObject Forms
   - Changed PDF::Context::Text::Style handling of :$baseline option. Use
     font.ascender as top point, rather than font.bbox.y

0.5.5  2021-07-16T14:26:05+12:00
   - Added block form of paint() method. $gfx.paint(&code, |c)) is equivalent to
     $gfx.Save; code(gfx); $gfx.paint(|c); $gfx.Restore;
   - make page bbox() method order from bottom left corner. So a page with
     /MediaBox [ 0 0 612 -792 ] is returned as [0, -792, 612, 0]

0.5.4  2021-07-07T11:28:02+12:00
   PDF::Font::Loader v0.5.5+ compatibility:
   - Font decoding now has three stages decode($bytes, :cids), decode($bytes, :ords) and
     decode() [text-string, default].
   - Font encoding has two stages encode($text, :cids), encode($text) [byte-string, default].
   - type-check text-box() arguments. Make sure we've got a font dictionary
     or a font object

0.5.3  2021-07-02T13:37:20+12:00
  - Add cid-map-glyph() callback for PDF::Font::Loader

0.5.2  2021-06-23T13:43:44+12:00
  - Fix PDF::Content::Font cb-finish() method and invocation

0.5.1  2021-04-29T12:03:00+12:00
  - Declare additional content tags: /OC /TagSuspect /ReversedChars /Clip
  - Pass through parameters in PDF::Content draw() method

0.5.0  2021-03-25T09:36:34+13:00
  - Add PDF::Content::FontObj - interface role for font manipulation
    objects.
  - core-font() method now returns the font-object of type
    PDF::Content::FontObj, rather than font dictionary. This is for
    consistency with PDF::Font::Loader. This allows type-checking.
    Also, a font object is more likely to be useful to an end user.

0.4.13  2021-03-13T14:33:18+13:00
  - Fix :WordSpacing option in text boxes #13

0.4.12  2021-03-11T11:35:37+13:00
  - Fix use-font() method to simply check for uniqueness of the font
    dictionary. The former (deep) equivalence check is incompatible
    with PDF::Font::Loader 0.4.0+, which builds font dictionaries lazily.
  - Add a current-point() accessor; valid during path construction

0.4.11  2021-02-08T16:42:42+13:00
  - Add matrix reflection method. Put its order to be applied
    after rotation and before skew.
  - Add requirement for Font::AFM version 1.24.4+.
  - Add tests for the new method.
  - Deprecate PDF::Content::Text::Block class in favor of
    PDF::Content::Text::Box and text-block() method in favour of
    text-block(). "Text blocks" already commonly refers to BeginText ..
    EndText regions in a content stream. Call them "text boxes" instead.

0.4.10  2021-01-21T14:04:44+13:00
  - Fix paint() method use of ClosePath op
  - Fix nesting of text blocks in :trace output
  - Refactor Ops class. Remove track-graphics method.

0.4.9  2021-01-12T06:12:47+13:00
  - Support IS0-32000 MacExpertEncoding (mac-extra). This is a supplement
    to MacRomanEncoding that includes various additional characters

Release 0.4.8
- Fixed missing renaming of PDF::Writer to PDF::IO::Writer in test suite.

Release 0.4.7
- Update to PDF 0.4.5. PDF::Writer has been renamed to PDF::IO::Writer
  to free up PDF::Writer for ecosystem usage.

Release 0.4.6
- Allow unknown operations in 'BX' .. 'EX' extension blocks
- Fix accidental error suppression in resource cb-finish() invocations
- Added encode %.charset accessor; used for font subsetting
- Fix array flattening issue in SetDashPattern.

Release 0.4.5
- Fix for PDF::API6 #8 - truncation of large JPEG images
- Renamed github project/Rep
- Text blocks now preserve multi spaces by default. :squish option
  gives old behaviour - collapse multiple spaces to a single space;
  Thanks Tom Browder

Release 0.4.4
- Remove PDF::Content::Tag::* sub-classes. Strip back to content
  related tags only. Functionality exported to PDF::Tags (under
  construction).
- PDF::Content.print() method now aggregates printed text in $*ActualText
  if this variable is present in the lexpad. Utilized by the .mark()
  method in PDF::TAGS::Elem.
  
Release 0.4.3
- withdrew implicit content tagging in .print() and .do() methods
- replaced with new PDF::Content::Tag::Elem .mark() and .do() methods
- add PDF::Content::Tag::Root - explicit struct tree root
- remove FakeGfxParent role from test suite. Just use PDFTiny.
- fixed building of Structured Parent Tree

Release 0.4.2
- rename class PDF::Content::Tag::Marked -> PDF::Content::Tag::Mark
- remove tag-name check on marked content tags. Anything is allowed (it's
  only struct elem nodes that need to be named correctly).
- also remove BBox attribute from Marked content and rename tags to /Text
  and /Image respectively.

Release 0.4.1
- .print() and .say() methods now always return block coordinates
- .tag() returns the return value of the executed block
- the .do() method now accepts a :position argument; compatible with .print()
- text blocks now bind the TextRender and Font graphics settings.
- allow color(r, g, b) instead of color([r, g, b]), etc

Release 0.4.0
- Rename modules *.pm -> *.rakumod

Release 0.3.2
- [PDF::Content::Graphics]
  - remove $.gfx(:render, ...) option
  - $.render() method now only renders once

Release 0.3.1
- [PDF::Content] Add $.tag method. Deprecate $.marked-content()
- [PDF::Content::Interface] new role for PDF implementations
- [t/ops.t] fix text for PDF v0.3.8- (issue #3)

Release 0.3.0
- [PDF::Content::Ops] Added graphics-state :delta option:
  -- rename :comment-ops option to :comment
  -- rename :debug option to :trace
  -- .graphics-state(:delta) returns variables updated since last Save('q')
  -- .gsave(:delta) returns an array that summarizes updated variables on the
     graphics stack. The final entry is the same as .graphics-state(:delta)
  -- improved !debug() method. Uses .graphics-state(:delta) and dumps JSON.
  -- Setting both :comment and :trace now causes tracing to be written as
     comments to PDF content streams
- [PDF::Content::Text::{Block|Line|Style}]
  -- Defer font encoding until rendering
  -- Add comments displaying original text when $gfx :comment option is True

Release 0.2.9
- Add $gfx(:debug) option
- Fix handling of 'std' encoding in PDF::Content::Font::Enc::Glyphic

Release 0.2.8
- Allow named page sizes: $page.media-box = 'Letter';
- Add type-checking/coercement to Type1 encoder differences array

Release 0.2.7
- Added $page.bleed() method. Convenience method for getting
  or setting bleed as a gutter around the crop box.
- Fix tests for Rakudo 2018.12+ blead

Release 0.2.6
- $gfx.do() and $text-block.print() now return rectangles
  representing the display coordinates
- Added method user-default-coords() to convert coordinates or
  rectangles from transformed user-space to default user-space.

Release 0.2.5
- Streamline Save(q) and Restore(Q) methods in PDF::Content::Ops
- Fixed Extended Graphics State Smoothness method. Renamed BlackGenerationFunction
  -> BlackGeneration and UnderColorRemovalFunction -> UnderColorRemoval

Release 0.2.4
- Added PDF::Content::Tag and $.marked-content method for tag extraction
- Added PDF::Content::Font::Enc::Glyphic role
- Keep space characters when rendering text blocks. Conform with
  [PDF 32000 - 14.8.2.5: Identifying Word Breaks]

Release 0.2.3
- open() method moved from PDF::Content::Image to PDF::Content::XObject
- fix spelling of rendering intent 'RelativeColorimetric'

Release 0.2.2
- Changed $.gfx method to not render by default
- Added some structured exceptions to PDF::Content::Ops
- Add $gfx.char-width, .char-height and .char-bbox attributes.
- Track operators d0 (SetCharWidth) and d1 (SetCharWidthBBox)

Release 0.2.1
- Tweak handling of BX .. EX compatibility blocks
- Fix BDC op (BeginMarkedContentDict) to allow dict or name as second argument
- Correct sequencing checks on 'sh' (ShFill) operator

Release 0.2.0
- Adjust to PDF ver 0.2.8. PDF::DAO classes have been
  renamed to PDF::COS.

Release 0.1.2
- Withdrew PDF::Content::Text::Reserved.
- Fix PDF::Content::Image.data-uri encoding.

Release 0.1.1
- $gfx.FillColor, $gfx.StrokeColor now register unknown colors in
  the graphics parent's resource dictionary.

Release 0.1.0
- Changed structure of PDF::Content::XObject[Image] to match
  PDF::Content::Font. It now has a $.image-obj handler object,
  similar to the PDF::Content::Font $.font-obj attribute.
- Fixed assignment to page boxes, e.g.: $page.art-box
- Work-around PDF WordSpacing restrictions in multiple-byte
  encoded fonts (issue #2)
- Add 'std' (StandardEncoding) encoding table

Release 0.0.9
- PDF::Content::Font::Enc::Type1 - Optimised encoding to always
  handle subsets up to a maximum of 255 characters. Glyphs are
  mapped as they are encountered:
    -- firstly, as defined by the requested encoding scheme
    -- secondly to unmapped codes in the encoding scheme
    -- thirdly to mapped, but unused character encodings
- PDF::Content::Graphics - fixed graphics update bug

Release 0.0.8
- Replace PDF::Content::Util::Font module with class
  PDF::Content::Font::CoreFont

Release 0.0.7
- Replaced $gfx.TextMove() with $gfx.text-position

Release 0.0.6
- Initial release
    
