Created Date: Mar 24, 2021 18:26
Last Modifed Date: Mar 24, 2021 18:26


Introduction

Mako 6.0 was a six-month effort (Mako’s usual release cycle is quarterly) because we needed to incorporate a major architectural change. Until now, Mako relied on a separate library (a DLL on Windows or an SO on macOS/Linux) to write PDF. With this change the need for this separate component disappears, and with it some longstanding memory and resource management limitations. Moreover, it enabled us to align the versions of the Jaws RIP components integrated into Mako to a common version, i.e. Jaws 4001.0 (aka Jaws 4)

This improvement earns Mako its major version increment, from Mako 5.x.x to Mako 6.0.0. Besides this, there are one or two new features

  • We have added Java to the list of supported languages, alongside C++, C# and Python. This is an exciting development as we have had many requests for Java support.
  • Mako’s macOS libraries are now universal binaries, supporting the new Apple Silicon-based Macs

The release notes are presented in terms of the development tasks (MAKO-XXXX) that had to be undertaken to complete this release. Only items of significance – those that add new features in this release or address identifiable support issues – are included. It is worth noting that the Mako releases made while Mako 6.0 was in development – Mako 5.2.0, Mako 5.2.1 and Mako 5.2.2 – delivered many new features and improvements that are also present in Mako 6.0.0.

New Features

MAKO-2980

Remove the “libs dir” parameter from IJawsMako::create()

Previously, the first parameter of the IJawsMako::create() was a path to the location of the library edlpspdfout. This is no longer required and has been removed.

The first parameter is now tempDir, an absolute path to a directory Mako can use to store temporary files Consequently this is potentially a breaking change, as code that specified a path to the location of the library will now be specifying a temp path instead.

In most cases the method can be called without any parameters. See the API documentation for further details.

MAKO-1918

Create a SWIG binding for Java

Mako 6.0 adds language support for Java. As with C# and Python, it is made possible by the use of SWIG, a technology that connects the C++ of Mako with other languages.

A “Using Mako with Java” page can be found on the documentation site at http://documentation.globalgraphics.com, and the simpleexamples which provide code samples for everything from document creation to watermarking, rendering and more, are translated to Java.

MAKO-2981

Enable linking MAKO as a single static library

Until now it was necessary to link several libs from the Mako distribution, i.e.

jawsmako.lib, edllib.lib, makojaws.lib, edlxpsin.lib, edlpcl5out.lib & edlpclxlout.lib

These are now replaced by a single library, mako.lib.

MAKO-2040

Compile edlerrors.cpp into the MAKO libs

Previously this source file, which provides human-readable descriptions of exceptions that could be thrown by Mako, had to be included in projects manually. It is now compiled in. You can remove it from your build, or if you are on Windows and using the NuGet package, this will happen automatically.

MAKO-2979

Remove VS2015 builds and reinstate x86 builds for VS2019

The distribution for Visual Studio 2015 (VC140) is removed from the distribution. This included a build for 32-bit Windows, and although there is little demand for it, we have reinstated the x86 build for Visual Studio 2019 (VC142).

This is a change for exclusively for Windows as macOS & Linux are 64-bit only.

MAKO-3026

Support for ARM64 on macOS

MAKO libraries for macOS are now built as universal binaries. You can build projects that will run natively on Apple Silicon or Intel-based Macs. This change means that MAKO now requires a minimum of macOS 10.12 (Sierra) or iOS 10 as deployment environments.

Although MAKO development has necessarily moved to the 11.1 SDK and Xcode 12.3, OEMs should be able to continue to use older versions as required.

 Support issues

If you are looking for a specific support issue, bear in mind it may have been fixed in an earlier version and therefore will not be listed here. Refer to release notes for past Mako versions if necessary.

MAKO-2459

(MAKO Support Request #10443) pagemodesource.cpp undefined

A customer’s XPS triggered an issue in Mako’s PNG reader. Now fixed.

MAKO-2675

(MAKO Support Request #10479) Supressing MAKO to write to console output?

Mako’s code was scanned for instances of console messages and these were either removed or wrapped in #ifdef…#endif so that they are supressed in the release build.

MAKO-2814

(MAKO Support Request #10502) Slow page->getContent()

The solution for this issue led to the development of a new renderer designed for ROP operations. A simpler and faster renderer that can render all types of objects we expect to see for PCL/XL and PCL/5e ROP flattening duties, into plain grey or RGB.

MAKO-2942

(MAKO Support Request #10540) Customer-supplied file throws exception in MAKO

An unusual glyph configuration triggered an error. Now fixed.

MAKO-3011

(MAKO Support Request #10561) Issue with customer file

An error was thrown by code attempting to extract text from a PDF. Issue found and fixed.

MAKO-3041

(MAKO Support Request #10565) PJL wrapped PDF

PJL has an ENTER_LANGUAGE command that instructs a parser to switch to reading a PDL such as PCL or PostScript. The customer-supplied exhibit instead embedded a PDF which Mako’s PJL parser was unable to handle. To solve this, the parser was enhanced to recognize PDF, and sample code is provided to demonstrate its use, published here on GitHub.

 Improvements

MAKO-2841

Incorrect handling of forms in PDF input where graphics state parameters change and the form doesn't explicitly set them

These two issues were worked together as both are concerned with PDF forms (XObject). Building on work in Mako 4.8.5 and Mako 5.2.1 that offered finer-grained control over the caching of forms to control memory usage, this work ensures that graphics state changes are not interfered with by the caching process.

MAKO-2557

RIP Error when running MakoDistillerCmd.exe

The error was triggered by the presence of PJL at the start of a PostScript file. This required additional work to allow IDistiller() to ignore PJL commands.

MAKO-2567

Jaws PDFLib config issue for MakoDistillerCmd

The solution required to allow this job to complete successfully required a PostScript prolog that was used by MakoDistillerCmd’s predecessor, PDFLib’s testpdflibcmd.exe. It sets up some useful preconditions for the PostScript interpreter.

This prolog whose filename is prologue-pdflib+enabletransparency+pjl.ps available in the MakoDistillerCmd folder of the Mako distribution folder. To use, add this to the arguments file: -Jpdfprologue-pdflib+enabletransparency+pjl.ps

MAKO-3002

Add support for getting/setting the attribute field in a structure element

This change adds the ability to get and set Attributes in a structure element - i.e. the /A entry of the Structure dictionary. Attributes can be free form, so instead of having some sort of structured interface, we allow access to the attributes as a low level IPDFObject.

See the API documentation for more details.

MAKO-2902

Add BPC (black point compensation) controls

IColorManager has two new APIs:

  • setDefaultBlackPointCompensation()
  • getDefaultBlackPointCompensation()

Sets (or gets) the default behavior for black point compensation when (and only when) eBPCDefault is used by convertColors() routines.

See the API documentation for full details.

MAKO-2943

SWIG for C# : Make C# API compatible with .NET Framework 4.6 and later

The C# implementation on Windows is built for three targets:

  • .Net Framework v4.6.1 (and later)
  • .NETStandard v2.0
  • .NETStandard v2.1

You can build apps for .Net Framework or .NET Core using the supplied NuGet package in Visual Studio 2019.

MAKO-2524

Update SWIG implementation to Python 3

The Python API now targets Python 3.8.

MAKO-2500

SWIG: Unable to call PValue::getStringVect() in C#

In PDF metadata the Author entry can present as a list rather than a single string. This change to the C# API makes it possible to access the complete list as a string vector object.

 Bugs fixed

MAKO-701

IPageLayoutData::getNumberOfColumns does not return the correct number of columns

The fix solved a problem that could result in an incorrect number of columns being returned by this API.

MAKO-2045

Spurious messages appearing during conversion to PCL

Affected both PCL5 and PCL/XL output. Messages to stdout are no longer emitted.

MAKO-2288

Exception when processing QualityLogic test file A003.pxl to PDF

This test file included a deliberate error to test the PCL/XL parser’s ability to recover, which Mako is now able to handle correctly.

 Miscellaneous issues

MAKO-3033

iOS Simulator builds do not work on M1 Macs

As part of the Mako build process for iOS, we build a simulator version for arm64, but Xcode fails to link it, claiming that the library we have made is built for iOS and not the simulator.

The problem has yet to be investigated and fixed. In the meantime, the use of a real device for debugging is suggested.

MAKO-2982

Ensure all the open source libraries in use have private prefixes

As it’s possible for a Mako customer to be using a third-party library independently of its use in Mako, to avoid a clash private prefixes are in use.

 Documentation

MAKO-2721

Improve Doxygen API docs

The API documentation in HTML and PDF has been improved with the addition of new sidebar headings (bookmarks in the case of PDF) to simplify navigation. The HTML version is online at http://api.globalgraphics.com/mako.

Distribution

MAKO Version 6.0.0 is built for the following platforms:

  • Android
  • iOS
  • Linux (for Debian-based distributions, eg Ubuntu, Mint)
  • Linux (Centos)
  • Linux (for Debian Stretch)
  • Linux (for MUSL distributions, eg Alpine Linux)
  • macOS
  • Windows (static and dynamic libs, VS 2019 (V142), x86 and x64)
  • Windows UWP (Store apps, Windows 10 IoT)

Mako supports the following programming languages

  • C++ (Mako is written in C++)
  • C# (.Net Framework and .Net Core)
  • Java (built with JDK 15)
  • Python (v3.8)

The alternatives to C++ are built using SWIG (www.swig.org) which provides a translation to the native libraries. These are located in the distribution folder Windows_SWIG_(C#-Java-Python).