Commit a6c4b293b1c78125caa7327742ffbe631d42e09b
1 parent
3dbab589
Clean up release notes for qpdf 11
Showing
2 changed files
with
70 additions
and
46 deletions
TODO
| @@ -4,6 +4,8 @@ Always | @@ -4,6 +4,8 @@ Always | ||
| 4 | 4 | ||
| 5 | * Evaluate issues tagged with `next` and `bug`. Remember to check | 5 | * Evaluate issues tagged with `next` and `bug`. Remember to check |
| 6 | discussions and pull requests in addition to regular issues. | 6 | discussions and pull requests in addition to regular issues. |
| 7 | +* When close to release, make sure external-libs is building and | ||
| 8 | + follow instructions in ../external-libs/README | ||
| 7 | 9 | ||
| 8 | Next | 10 | Next |
| 9 | ==== | 11 | ==== |
manual/release-notes.rst
| @@ -6,14 +6,9 @@ Release Notes | @@ -6,14 +6,9 @@ Release Notes | ||
| 6 | For a detailed list of changes, please see the file | 6 | For a detailed list of changes, please see the file |
| 7 | :file:`ChangeLog` in the source distribution. | 7 | :file:`ChangeLog` in the source distribution. |
| 8 | 8 | ||
| 9 | -11.0.0 | ||
| 10 | - - Performance improvements | ||
| 11 | - | ||
| 12 | - - Many performance enhancements have been added. In developer | ||
| 13 | - performance benchmarks, gains on the order of 20% have been | ||
| 14 | - observed. Most of that work, including major optimization of | ||
| 15 | - qpdf's lexical and parsing layers, was done by M. Holger. | 9 | +.. x.y.z: not yet released |
| 16 | 10 | ||
| 11 | +11.0.0: not yet released | ||
| 17 | - Replacement of ``PointerHolder`` with ``std::shared_ptr`` | 12 | - Replacement of ``PointerHolder`` with ``std::shared_ptr`` |
| 18 | 13 | ||
| 19 | - The qpdf-specific ``PointerHolder`` smart pointer implementation | 14 | - The qpdf-specific ``PointerHolder`` smart pointer implementation |
| @@ -50,8 +45,8 @@ For a detailed list of changes, please see the file | @@ -50,8 +45,8 @@ For a detailed list of changes, please see the file | ||
| 50 | 45 | ||
| 51 | - Build replaced with cmake | 46 | - Build replaced with cmake |
| 52 | 47 | ||
| 53 | - - The old autoconf-based build has been replaced with CMake. Version | ||
| 54 | - 3.16 or newer is required. For all the details, please read | 48 | + - The old autoconf-based build has been replaced with CMake. CMake |
| 49 | + version 3.16 or newer is required. For details, please read | ||
| 55 | :ref:`installing` and, if you package qpdf for a distribution, | 50 | :ref:`installing` and, if you package qpdf for a distribution, |
| 56 | :ref:`packaging`. | 51 | :ref:`packaging`. |
| 57 | 52 | ||
| @@ -87,6 +82,13 @@ For a detailed list of changes, please see the file | @@ -87,6 +82,13 @@ For a detailed list of changes, please see the file | ||
| 87 | ``autopkgtest`` framework but can be used by others. See | 82 | ``autopkgtest`` framework but can be used by others. See |
| 88 | :file:`pkg-test/README.md` for details. | 83 | :file:`pkg-test/README.md` for details. |
| 89 | 84 | ||
| 85 | + - Performance improvements | ||
| 86 | + | ||
| 87 | + - Many performance enhancements have been added. In developer | ||
| 88 | + performance benchmarks, gains on the order of 20% have been | ||
| 89 | + observed. Most of that work, including major optimization of | ||
| 90 | + qpdf's lexical and parsing layers, was done by M. Holger. | ||
| 91 | + | ||
| 90 | - CLI: breaking changes | 92 | - CLI: breaking changes |
| 91 | 93 | ||
| 92 | - The :qpdf:ref:`--show-encryption` flag now provides encryption | 94 | - The :qpdf:ref:`--show-encryption` flag now provides encryption |
| @@ -114,13 +116,13 @@ For a detailed list of changes, please see the file | @@ -114,13 +116,13 @@ For a detailed list of changes, please see the file | ||
| 114 | need your code to be backward compatible to qpdf versions prior | 116 | need your code to be backward compatible to qpdf versions prior |
| 115 | to 10.5.0, you can check that the preprocessor symbol | 117 | to 10.5.0, you can check that the preprocessor symbol |
| 116 | ``QPDF_MAJOR_VERSION`` is defined and ``>= 11``. As a stop-gap, | 118 | ``QPDF_MAJOR_VERSION`` is defined and ``>= 11``. As a stop-gap, |
| 117 | - you can `#define QPDF_OBJECT_NOWARN` to suppress the warning. | 119 | + you can ``#define QPDF_OBJECT_NOWARN`` to suppress the warning. |
| 118 | 120 | ||
| 119 | - - Pipeline::write now takes ``unsigned char const*`` instead of | ||
| 120 | - ``unsigned char*``. Callers don't need to change anything, but | ||
| 121 | - you no longer have to pass writable pointers to pipelines. If | ||
| 122 | - you've implemented your own pipeline classes, you will need to | ||
| 123 | - update them. | 121 | + - ``Pipeline::write`` now takes ``unsigned char const*`` instead |
| 122 | + of ``unsigned char*``. Callers don't need to change anything, | ||
| 123 | + but you no longer have to pass writable pointers to pipelines. | ||
| 124 | + If you've implemented your own pipeline classes, you will need | ||
| 125 | + to update them. | ||
| 124 | 126 | ||
| 125 | - Remove deprecated | 127 | - Remove deprecated |
| 126 | ``QPDFAcroFormDocumentHelper::copyFieldsFromForeignPage``. This | 128 | ``QPDFAcroFormDocumentHelper::copyFieldsFromForeignPage``. This |
| @@ -132,8 +134,8 @@ For a detailed list of changes, please see the file | @@ -132,8 +134,8 @@ For a detailed list of changes, please see the file | ||
| 132 | ``QPDF&`` argument. | 134 | ``QPDF&`` argument. |
| 133 | 135 | ||
| 134 | - The function passed to and called by ``QPDFJob::doIfVerbose`` | 136 | - The function passed to and called by ``QPDFJob::doIfVerbose`` |
| 135 | - now takes a ``Pipeline&` argument instead of a ``std::ostream&`` | ||
| 136 | - argument. | 137 | + now takes a ``Pipeline&`` argument instead of a |
| 138 | + ``std::ostream&`` argument. | ||
| 137 | 139 | ||
| 138 | - Intentionally break API to call attention to operations that | 140 | - Intentionally break API to call attention to operations that |
| 139 | write files with insecure encryption: | 141 | write files with insecure encryption: |
| @@ -150,8 +152,9 @@ For a detailed list of changes, please see the file | @@ -150,8 +152,9 @@ For a detailed list of changes, please see the file | ||
| 150 | 152 | ||
| 151 | - ``QPDFObjectHandle::warnIfPossible`` no longer takes an optional | 153 | - ``QPDFObjectHandle::warnIfPossible`` no longer takes an optional |
| 152 | argument to throw an exception if there is no description. If | 154 | argument to throw an exception if there is no description. If |
| 153 | - there is no description, it writes to the default logger's error | ||
| 154 | - stream. | 155 | + there is no description, it writes to the default |
| 156 | + ``QPDFLogger``'s error stream. (``QPDFLogger`` is new in qpdf | ||
| 157 | + 11---see below.) | ||
| 155 | 158 | ||
| 156 | - ``QPDF`` objects can no longer be copied or assigned to. It has | 159 | - ``QPDF`` objects can no longer be copied or assigned to. It has |
| 157 | never been safe to do this because of assumptions made by | 160 | never been safe to do this because of assumptions made by |
| @@ -162,7 +165,7 @@ For a detailed list of changes, please see the file | @@ -162,7 +165,7 @@ For a detailed list of changes, please see the file | ||
| 162 | 165 | ||
| 163 | - CLI Enhancements | 166 | - CLI Enhancements |
| 164 | 167 | ||
| 165 | - - ``qpdf --list-attachments --verbose`` include some additional | 168 | + - ``qpdf --list-attachments --verbose`` includes some additional |
| 166 | information about attachments. Additional information about | 169 | information about attachments. Additional information about |
| 167 | attachments is also included in the ``attachments`` JSON key | 170 | attachments is also included in the ``attachments`` JSON key |
| 168 | with ``--json``. | 171 | with ``--json``. |
| @@ -206,32 +209,43 @@ For a detailed list of changes, please see the file | @@ -206,32 +209,43 @@ For a detailed list of changes, please see the file | ||
| 206 | ``replaceKeyAndGetOld``, a ``null`` object if the object was not | 209 | ``replaceKeyAndGetOld``, a ``null`` object if the object was not |
| 207 | previously there. | 210 | previously there. |
| 208 | 211 | ||
| 209 | - - It is now possible to detect when a ``QPDFObjectHandle`` is an | ||
| 210 | - indirect object that belongs to a ``QPDF`` that has been | ||
| 211 | - destroyed. Any attempt to unparse this type of | ||
| 212 | - ``QPDFObjectHandle`` will throw a logic error. You can detect | ||
| 213 | - this by calling the new ``QPDFObjectHandle::isDestroyed`` | ||
| 214 | - method. Also the ``QPDFObjectHandle::getOwningQPDF`` method now | ||
| 215 | - returns a null pointer rather than an invalid pointer. | ||
| 216 | - | ||
| 217 | - - The method ``QPDFObjectHandle::getQPDF`` returns a ``QPDF&`` | ||
| 218 | - (rather than a ``QPDF*``) and is an alternative to | ||
| 219 | - ``QPDFObjectHandle::getOwningQPDF`` for when the object is known | ||
| 220 | - to have an owning ``QPDF``. | 212 | + - The ``QPDFObjectHandle::isDestroyed`` method can be used to |
| 213 | + detect when an indirect object ``QPDFObjectHandle`` belongs to a | ||
| 214 | + ``QPDF`` that has been destroyed. Any attempt to unparse this | ||
| 215 | + type of ``QPDFObjectHandle`` will throw a logic error. | ||
| 216 | + | ||
| 217 | + - The ``QPDFObjectHandle::getOwningQPDF`` method now returns a | ||
| 218 | + null pointer rather than an invalid pointer when the owning | ||
| 219 | + ``QPDF`` object has been destroyed. Indirect objects whose | ||
| 220 | + owning ``QPDF`` has been destroyed become invalid. Direct | ||
| 221 | + objects just lose their owning ``QPDF`` but continue to be | ||
| 222 | + valid. | ||
| 223 | + | ||
| 224 | + - The method ``QPDFObjectHandle::getQPDF`` is an alternative to | ||
| 225 | + ``QPDFObjectHandle::getOwningQPDF``. It returns a ``QPDF&`` | ||
| 226 | + rather than a ``QPDF*`` and can be used when the object is known | ||
| 227 | + to have an owning ``QPDF``. It throws an exception if the object | ||
| 228 | + does not have an owning ``QPDF``. Only indirect objects are | ||
| 229 | + guaranteed to have an owning ``QPDF``. Direct objects may have | ||
| 230 | + one if they were initially read from a PDF input source that is | ||
| 231 | + still valid, but it's also possible to have direct objects that | ||
| 232 | + don't have an owning ``QPDF``. | ||
| 221 | 233 | ||
| 222 | - It is now possible to test ``QPDFObjectHandle`` equality with | 234 | - It is now possible to test ``QPDFObjectHandle`` equality with |
| 223 | ``==`` and ``!=``. Two ``QPDFObjectHandle`` objects are equal if | 235 | ``==`` and ``!=``. Two ``QPDFObjectHandle`` objects are equal if |
| 224 | they point to the same underlying object, meaning changes to one | 236 | they point to the same underlying object, meaning changes to one |
| 225 | - will be reflected in the other. | 237 | + will be reflected in the other. Note that this method does not |
| 238 | + compare the contents of the objects, so two distinct but | ||
| 239 | + structurally identical objects will not be considered equal. | ||
| 226 | 240 | ||
| 227 | - - Add new factory method ``QPDF::create()`` that returns a | 241 | + - New factory method ``QPDF::create()`` returns a |
| 228 | ``std::shared_ptr<QPDF>``. | 242 | ``std::shared_ptr<QPDF>``. |
| 229 | 243 | ||
| 230 | - - Add new ``Pipeline`` methods to reduce the amount of casting that is | ||
| 231 | - needed: | 244 | + - New ``Pipeline`` methods have been added to reduce the amount of |
| 245 | + casting that is needed: | ||
| 232 | 246 | ||
| 233 | - - ``write``: overloaded version that takes `char const*` in | ||
| 234 | - addition to the one that takes `unsigned char const*` | 247 | + - ``write``: overloaded version that takes ``char const*`` in |
| 248 | + addition to the one that takes ``unsigned char const*`` | ||
| 235 | 249 | ||
| 236 | - ``writeCstr``: writes a null-terminated C string | 250 | - ``writeCstr``: writes a null-terminated C string |
| 237 | 251 | ||
| @@ -240,20 +254,26 @@ For a detailed list of changes, please see the file | @@ -240,20 +254,26 @@ For a detailed list of changes, please see the file | ||
| 240 | - ``operator <<``: for null-terminated C strings, std::strings, | 254 | - ``operator <<``: for null-terminated C strings, std::strings, |
| 241 | and integer types | 255 | and integer types |
| 242 | 256 | ||
| 243 | - - Add new ``Pipeline`` type ``Pl_OStream`` to write to a | 257 | + - New ``Pipeline`` type ``Pl_OStream`` writes to a |
| 244 | ``std::ostream``. | 258 | ``std::ostream``. |
| 245 | 259 | ||
| 246 | - - Add new ``Pipeline`` type ``Pl_String`` to append to a | 260 | + - New ``Pipeline`` type ``Pl_String`` appends to a |
| 247 | ``std::string``. | 261 | ``std::string``. |
| 248 | 262 | ||
| 249 | - - Add methods to ``QUtil`` for converting PDF timestamps and | ||
| 250 | - ``QPDFTime`` objects to ISO-8601 timestamps. | 263 | + - New ``Pipeline`` type ``Pl_Function`` can be used to call an |
| 264 | + arbitrary function on write. It supports ``std::function`` for | ||
| 265 | + C++ code and can also accept C-style functions that indicate | ||
| 266 | + success using a return value and take an extra parameter for | ||
| 267 | + passing user data. | ||
| 268 | + | ||
| 269 | + - Methods have been added to ``QUtil`` for converting PDF | ||
| 270 | + timestamps and ``QPDFTime`` objects to ISO-8601 timestamps. | ||
| 251 | 271 | ||
| 252 | - Enhance JSON class to better support incrementally reading and | 272 | - Enhance JSON class to better support incrementally reading and |
| 253 | writing large amounts of data without having to keep everything | 273 | writing large amounts of data without having to keep everything |
| 254 | in memory. | 274 | in memory. |
| 255 | 275 | ||
| 256 | - - Add new functions to the C API for qpdfjob that use a | 276 | + - Add new functions to the C API for ``qpdfjob`` that use a |
| 257 | ``qpdfjob_handle``. Like with the regular C API for qpdf, you | 277 | ``qpdfjob_handle``. Like with the regular C API for qpdf, you |
| 258 | have to call ``qpdfjob_init`` first, pass the handle to the | 278 | have to call ``qpdfjob_init`` first, pass the handle to the |
| 259 | functions, and call ``qpdfjob_cleanup`` at the end. This | 279 | functions, and call ``qpdfjob_cleanup`` at the end. This |
| @@ -308,11 +328,13 @@ For a detailed list of changes, please see the file | @@ -308,11 +328,13 @@ For a detailed list of changes, please see the file | ||
| 308 | `qpdf/performance-test-files github repository | 328 | `qpdf/performance-test-files github repository |
| 309 | <https://github.com/qpdf/performance-test-files>`__. In addition | 329 | <https://github.com/qpdf/performance-test-files>`__. In addition |
| 310 | to running time, memory usage is also included in performance | 330 | to running time, memory usage is also included in performance |
| 311 | - test results. The ``performance_check`` tool has only been | ||
| 312 | - tested on Linux. | 331 | + test results when available. The ``performance_check`` tool has |
| 332 | + only been tested on Linux. | ||
| 313 | 333 | ||
| 314 | - Lots of code cleanup and refactoring work was contributed in | 334 | - Lots of code cleanup and refactoring work was contributed in |
| 315 | - multiple pull requests by M. Holger. | 335 | + multiple pull requests by M. Holger. This includes the work |
| 336 | + required to enable detection of ``QPDFObjectHandle`` objects | ||
| 337 | + that belong to destroyed ``QPDF`` objects. | ||
| 316 | 338 | ||
| 317 | 10.6.3: March 8, 2022 | 339 | 10.6.3: March 8, 2022 |
| 318 | - Announcement of upcoming change: | 340 | - Announcement of upcoming change: |