aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/get_current_monitor_profile.cpp
blob: 096ecd01ce35938051f62eea7cb498af2b0a8a36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "SkStream.h"

#if defined(SK_BUILD_FOR_MAC)
#include <ApplicationServices/ApplicationServices.h>
#elif defined(SK_BUILD_FOR_WIN)
#include <windows.h>
#endif

int main(int argc, char** argv) {
#if defined(SK_BUILD_FOR_MAC)
    CGColorSpaceRef cs = CGDisplayCopyColorSpace(CGMainDisplayID());
    CFDataRef dataRef = CGColorSpaceCopyICCProfile(cs);
    const uint8_t* data = CFDataGetBytePtr(dataRef);
    size_t size = CFDataGetLength(dataRef);

    SkFILEWStream file("monitor_0.icc");
    file.write(data, size);

    CFRelease(cs);
    CFRelease(dataRef);
    return 0;
#elif defined(SK_BUILD_FOR_WIN)
    DISPLAY_DEVICE dd = { sizeof(DISPLAY_DEVICE) };
    SkString outputFilename;

    // Chrome's code for this currently just gets the primary monitor's profile. This code iterates
    // over all attached monitors, so it's "better" in that sense. Making intelligent use of this
    // information (via things like MonitorFromWindow or MonitorFromRect to pick the correct
    // profile for a particular window or region of a window), is an exercise left to the reader.
    for (int i = 0; EnumDisplayDevices(NULL, i, &dd, 0); ++i) {
        if (dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) {
            // There are other helpful things in dd at this point:
            // dd.DeviceString has a longer name for the adapter
            // dd.StateFlags indicates primary display, mirroring, etc...
            HDC dc = CreateDC(NULL, dd.DeviceName, NULL, NULL);
            if (dc) {
                char icmPath[MAX_PATH + 1];
                DWORD pathLength = MAX_PATH;
                if (GetICMProfile(dc, &pathLength, icmPath)) {
                    // GetICMProfile just returns the path to the installed profile (not the data)
                    outputFilename = SkStringPrintf("monitor_%d.icc", i);
                    CopyFile(icmPath, outputFilename.c_str(), FALSE);
                }
                DeleteDC(dc);
            }
        }
    }

    return 0;
#else
    SkDebugf("ERROR: Unsupported platform\n");
    return 1;
#endif
}