1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-30 22:48:11 +00:00
serenity/Meta/Lagom/Contrib/MacPDF/AppDelegate.mm
Nico Weber 9c762b9650 LibPDF+Meta: Use a CMYK ICC profile to convert CMYK to RGB
CMYK data describes which inks a printer should use to print a color.
If a screen should display a color that's supposed to look similar
to what the printer produces, it results in a color very different
to what Color::from_cmyk() produces. (It's also printer-dependent.)

There are many ICC profiles describing printing processes. It doesn't
matter too much which one we use -- most of them look somewhat
similar, and they all look dramatically better than Color::from_cmyk().

This patch adds a function to download a zip file that Adobe offers
on their web site. They even have a page for redistribution:
https://www.adobe.com/support/downloads/iccprofiles/icc_eula_win_dist.html

(That one leads to a broken download though, so this downloads the
end-user version.)

In case we have to move off this download at some point, there are also
a whole bunch of profiles at https://www.color.org/registry/index.xalter
that "may be used, embedded, exchanged, and shared without restriction".

The adobe zip contains a whole bunch of other useful and fun profiles,
so I went with it.

For now, this only unzips the USWebCoatedSWOP.icc file though, and
installs it in ${CMAKE_BINARY_DIR}/Root/res/icc/Adobe/CMYK/. In
Serenity builds, this will make it to /res/icc/Adobe/CMYK in the
disk image. And in lagom build, after #23016 this is the
lagom res staging directory that tools can install via
Core::ResourceImplementation. `pdf` and `MacPDF` already do that,
`TestPDF` now does it too.

The final piece is that LibPDF then loads the profile from there
and uses it for DeviceCMYK color conversions.

(Doing file access from the bowels of a library is a bit weird,
especially in a system that has sandboxing built in. But LibGfx does
that in FontDatabase too already, and LibPDF uses that, so it's not a
new problem.)
2024-02-01 13:42:04 -07:00

47 lines
1.4 KiB
Text

/*
* Copyright (c) 2023, Nico Weber <thakis@chromium.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#import "AppDelegate.h"
#include <LibCore/ResourceImplementationFile.h>
@interface AppDelegate ()
@property (strong) IBOutlet NSWindow* window;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
// FIXME: Copy fonts and icc file to the bundle or something
// Get from `Build/lagom/bin/MacPDF.app/Contents/MacOS/MacPDF` to `Build/lagom/Root/res`.
NSString* source_root = [[NSBundle mainBundle] executablePath];
for (int i = 0; i < 5; ++i)
source_root = [source_root stringByDeletingLastPathComponent];
auto source_root_string = ByteString([source_root UTF8String]);
Core::ResourceImplementation::install(make<Core::ResourceImplementationFile>(MUST(String::formatted("{}/Root/res", source_root_string))));
}
- (void)applicationWillTerminate:(NSNotification*)aNotification
{
}
- (BOOL)applicationSupportsSecureRestorableState:(NSApplication*)app
{
return YES;
}
- (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename
{
[[NSDocumentController sharedDocumentController]
openDocumentWithContentsOfURL:[NSURL fileURLWithPath:filename]
display:YES
completionHandler:^(NSDocument*, BOOL, NSError*) {}];
return YES;
}
@end