Created Date: 28 Jul, 2023 20:40
Last Modifed Date: 28 Jul, 2023 20:40
This is a significant release of Mako Core, reflected in the increase of the major version to 7. This version has several new features, for example the ILayout class which is backed by a built-in layout engine. It makes it much easier to add new content that is typographically correct, and supports RTL (right-to-left) languages. It can even handle images.
There are many “under the hood” performance improvements, with new APIs to improve color conversion and content optimization. Additionally, fixes for specific support issues are included in this release, labelled MAKOSUP-XXXXX. The link is live and can be followed to the Mako support portal, but will only work for the customer who reported it.
- A SWIG build is also provided for C#, Java and Python (Windows only).
- NuGet packages are available for C++ and C#.
Note: The ColorLogic CMM is delivered as a DLL (Dynamic Link Library for Windows) or SO (Shared Object) for macOS and Linux. Mako expects this runtime to be present alongside your Mako-based executable.
MAKOSUP-10881 Implement input progress monitoring
The customer wished to present a progress bar during file input, but input classes were not set up to work with a progress monitor. This is now rectified, with a call to the progress tick whenever a new page is parsed.
To see how to implement progress monitoring in your project, we’ve demonstrated (via the ProgressHandler class) how to bundle together an IProgressTick object, a callback, and user data into one object. The advantage of this approach is that while the reference-counted ProgressHandler object is alive, the user data and the
The ProgressHandler is used in makoconverter, one of the samples included in the SDK’s makoapps folder. It shows how easy it is to have separate handlers for the input and the output.
MAKOSUP-11102 Add ability to preflight fonts and raise any invalid hinting
A new feature to attempt to detect issues with instructions in TrueType fonts. The customer’s job had a broken pre/cvt tables which previously we would ignore. This change gives back control to the developer with some new APIs:
A new parameter option
MAKOSUP-11129 Converting PDF to Preset=PDF/X-1a Error
The customer exhibit was a 4GB PDF, had over 15,000 pages where each page defined a large number (in some cases over 8000) PDF fonts. This exceeded limits built into the PDF parser, so a change was made to automatically restart the parser when resources are low, allowing the job to complete.
MAKOSUP-11133 PDF/X4 preset creates a PDF that fails validation
Certain XML elements in the XMP were not transferred correctly from the source to the destination PDF. Now fixed.
MAKOSUP-11172 Request to have one Jar for cross platforms (Linux/Windows)
This was a customer request to repackage the Mako libraries for Java for both Windows and Linux into a single jar, to simplify their deployment. We’ve been able to do this, and the result shared with the customer. Once we have automated the process on our build server, we will make this part of the regular release, beginning with Mako 7.1.0.
MAKOSUP-11073 Get Font Objects of Document
MAKOSUP-11177 File does not display content
The customer exhibit was a badly broken PDF with both an invalid xref table and many invalid streams, causing Mako to ignore the content altogether. Mako is now able to cope with such a pathology, and will write a corrected PDF when saving.
MAKOSUP-11178 Exception thrown while attempting to process font
Fixed an issue with PCL font selection.
MAKOSUP-11179 Missing content and incorrect right hand margin
Fixed a PCL 5 parsing issue relating to HPGL/2 commands.
MAKOSUP-11180 Missing pages when converting PCL to PDF
Fixed a PCL 5 parsing issue relating to the HP/GL PE (Polyline Encoded) command.
MAKOSUP-11181 MakoConverter hangs in indefinite loop
This is the same issue as MAKO-4499.
MAKOSUP-11088 Add support colorant information in SVG generation
In response to a customer request, improvements are made to the ISVGGenerator class that enrich SVG output with additional color information.
A new API is added to set the SVG version:
When set to SVG 2.0, additional color information is written to the SVG:
All are written with their colorant information.
MAKOSUP-11191 Reported Rotation Angle is incorrect
A customer wished to determine the angle at which a page element is rotated. However, when using the
MAKOSUP-11098 Canon header
A new interface,
This is necessary because it appears that some Canon drivers add
A class derived from
The list of known attribute IDs are listed in the PCL/XL reference. ignoreAttribute() returns a Boolean value, where true indicates that we should ignore the attribute, or false will result in Mako throwing an exception as before. When true is returned, Mako will remove the attribute from the stack.
MAKOSUP-11201 Error opening PDF
A minor problem with font loading from the PDF, now fixed.
MAKOSUP-11206 Text moved after any update
The customer exhibit was a ‘bad’ PDF, as it had nested BT/ET (Begin Text/End Text) pairs, which the PDF spec does not allow. Mako will now work around this problem and correct the error when saving the PDF.
MAKOSUP-11185 Crash while rendering customer case
The was reported as “Valid PDF/X-4 file became invalid after rerender” but what we saw immediately was that the customer exhibit could crash the Mako renderer. Once this was solved, some color issues surfaced which too were fixed.
MAKOSUP-11216 Trailer dictionary
A new API,
These APIs do not allow editing of the objects; they exist merely to query.
New and updated features
This work began with a customer request to make it easier to create new PDF content, with an eye to VDP (Variable Data Printing) applications where pages are personalised with content drawn from database sources.
While this is possible with existing APIs in Mako, it’s difficult because they are low-level and a developer must do a lot of work, just to put text on the page, for example.
In this release,
Implement a raster image cache in the renderer transform
Implement a source cache for the vector flattener
Implement an IDOMCachedImage image type
Implement caching of bounds for points list geometries
Speed up retained object handling in the transform caches
Speed up Jaws Type 7 shading rendering when most of the shade is not visible
These development stories (MAKO-4216 to MAKO-4220 & MAKO-4223) describe work in this release to significantly improve performance of the
Handle 100% Black preservation - Colour Converter Transform
This introduces a black preservation mode that intends to preserve pure black under selected circumstances. This is great for improving quality for a lot of common situations. For example, text present as RGB 0,0,0 is going to generally look better and use less ink when converted to CMYK black than when painted with a rich black. Such text representations are rather common in real world jobs.
A new API is added to the
This allows black preservation to be specified separately for text and non-text objects. It only ever applies to flat objects (not images or shades for example). In this context, a non-text object is any flat object that is not text, such as simple masks, fills, and strokes.
The in-code documentation provides additional explanation. Search for
Handle 100% Black preservation - IJawsRenderer
The same API is available to the IJawsRenderer class:
Handle 100% Black preservation - IRendererTransform
Again, the same API is available to the IRendererTransform class:
Additionally, defaults can be set for all black preservation settings in one fell swoop. Tell the
Improve form caching to avoid file bloat
When processed by Mako, a PDF with a large number of form
Add support for font rotation in IJPDS
An improvement to the
Implement a spot merging image filter
This release adds a new image filter,
The API documentation explains further. Search for IDOMImageSpotMergerFilter at https://api.globalgraphics.com/mako
The same capability is also available to the IColorConverterTransform, so that the same type of colour conversion can be applied to DOM objects.
Search for setDeviceNHandling at https://api.globalgraphics.com/mako for further details.
Finally, this work affects how color converting Indexed color spaces behaves. Previously, it appeared that Mako would not always convert
Detect DSC comments in PostScript with a call back mechanism
A new feature in IDistiller enables users to detect DSC and other comments within PostScript jobs and capture the metadata they are expressing.
This knowledgebase article describes the new feature in detail, complete with a code sample.
Support PDFs containing images > 2GB
A simple change to ensure large images in an incoming PDF are read successfully.
Attempt to reconstruct forms that are unpacked in the renderer transform
This is a new feature of the
The default is 0, meaning do nothing.
This API sets whether the renderer should attempt to reconstruct forms that it needed to unpack due to the rendering of content within the form, and if so, sets the maximum size of the cache to use (in items).
This feature is only useful if the content is to be written to a PDF output where form objects can have benefits. Where that is the case the use of this API can dramatically reduce output file size and by retaining content within a form, ensure the efficiency of downstream processing, by a RIP for example.
The API documentation explains further. Search for setFormReconstructionCacheSize at https://api.globalgraphics.com/mako.
Allow the fallback resolution of the vector flattener to be set
A new API,
DeviceN: Allow colorants to have different alternate
When there are multiple colorants,
There are reasons why you may want to specify different colorspaces as the alternates for individual colorants in a
This API is updated such that setting this to false indicates that the color converter transform should not use explicit rendering intents in the DOM when performing conversion and instead use the default rendering intent for the current colour space.
CalRGB group spaces are ignored by Mako PDF input
CalRGB group spaces are now correctly propagated.
Matrix transformation changes when rendered at different resolutions
When rendering a customer file at various resolutions, unexpected artifacts were observed. These were due to an issue with a scaling algorithm that did not account properly for a wide range of possible inputs. Now fixed.
PDF/X-1a regressions with Altona and Ghent suites
Improvements elsewhere caused a problem for images and colors using an indexed color space, discovered when testing with the Altona and Ghent Working Group test suites. Solving this has led to quality and performance improvements in the handling of indexed colors.
Incremental save fails to include an entry added to the document Info dictionary
A metadata change was being written by a full save, but not an incremental save. Now fixed.
Canonicalize file names on create rather than on use
A previous change to Mako’s standard outputs prevents overwriting open input files. To do this Mako maintains a list of files that are open, and to enable comparison of filenames, they are canonicalized. For efficiency this process has been moved to when the file handle is created, rather than when the file is referenced. A new API is added to
alongside the existing API (still present):
CEDLVectString doesn't support extended Unicode characters in the C# SWIG build
Fixed by improving marshalling of strings between managed and unmanaged code.
Object in the page group that KO is true isn't knocked out (for PDF output)
Continuation of MAKO-4198 to include the change in PDF output.
Object in the page group that KO is true isn't knocked out
An internally-reported rendering issue was fixed.
Support array literals to initialize a CEDLVector
Initializer lists are now supported for the Mako native vector type CEDLVector. This makes it possible to use code such as this:
Update macOS build tools
Mako 6.x used SDK 11.3, first introduced with macOS Big Sur and Xcode 12.5. For this version we have brought the build tools up to date, and we are now building Mako with:
This means while the static object code library retains the same filename (mako.a) the folder in which it resides is updated to release-macos-ub-13.3.
The Mako SDK includes several code examples, collectively known as simpleexamples that cover a wide range of Mako applications – file format conversion, rendering, imposition, text extraction, content creation and more. They are available in C++, C# and Java but until now Python was largely left out. In this release, this omission is addressed with Python ‘translations’ of these examples.
Create Mako sample to flatten rich black
In response to a customer request, a Mako code sample was created that makes use of a custom transform to find and replace a rich black with a K-only black. It can be found on GitHub: https://github.com/mako-team/CmykBlackConverter
Complete PDF output certificate encryption support
Mako 7.0.0 uses LibreSSL in place of the OpenSSL library that Mako used until now. It has made it possible to have a truly cross-platform implementation for security-related procedures such as certificate-based encryption, etc.
Correct ColorLogic NuGet package name
Introduced in Mako 6.6.3, the ColorLogic builds use the ColorLogic CMM in place of LittleCMS.
The name of the NuGet package for one of these has been updated as it was not following the established naming convention. Hence
Currently Global Graphics does not publish the Mako NuGet packages online, but they are easy to use from a local folder. See this documentation for further details.
MAKO Version 7.0.0 is built for the following platforms:
- Linux (for Debian-based distributions, eg Ubuntu 20.04 LTS, Mint)
- Linux (Centos)
- Linux (Red Hat Enterprise v7.0)
- Linux (Red Hat Enterprise v8.4)
- Linux (for Debian Buster) (arm32v7 for Raspberry Pi)
- Linux (for Debian Bullseye) (arm64v8 for Raspberry Pi)
- Linux (for Debian Bullseye)
- Linux (for MUSL distributions, eg Alpine Linux)
- Windows (static and dynamic libs, VS 2019 (V142), x86 and x64)
- Windows (static and dynamic libs, VS 2017 (V141), x64)
- Windows UWP/WinRT
Note that the Android build has been dropped from this release pending a tooling change. Please contact Mako support if you need a Mako release for Android later than Mako 6.1.0.
Mako supports the following programming languages.
- C++ (Mako is written in C++)
- C# (.Net Core and .Net Framework)
- Java (built with OpenJDK15)
- Python (v3.8)
The alternatives to C++ are built using SWIG (www.swig.org) which provides a translation to the native libraries, are found in these distribution folders: