Commit a6c4b293b1c78125caa7327742ffbe631d42e09b

Authored by Jay Berkenbilt
1 parent 3dbab589

Clean up release notes for qpdf 11

Showing 2 changed files with 70 additions and 46 deletions
@@ -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: