1 // Copyright (c) 2015-2016 The Khronos Group Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "source/print.h"
16
17 #if defined(SPIRV_ANDROID) || defined(SPIRV_LINUX) || defined(SPIRV_MAC) || \
18 defined(SPIRV_IOS) || defined(SPIRV_TVOS) || defined(SPIRV_FREEBSD) || \
19 defined(SPIRV_OPENBSD) || defined(SPIRV_EMSCRIPTEN) || \
20 defined(SPIRV_FUCHSIA) || defined(SPIRV_GNU)
21 namespace spvtools {
22
operator const char*()23 clr::reset::operator const char*() { return "\x1b[0m"; }
24
operator const char*()25 clr::grey::operator const char*() { return "\x1b[1;30m"; }
26
operator const char*()27 clr::red::operator const char*() { return "\x1b[31m"; }
28
operator const char*()29 clr::green::operator const char*() { return "\x1b[32m"; }
30
operator const char*()31 clr::yellow::operator const char*() { return "\x1b[33m"; }
32
operator const char*()33 clr::blue::operator const char*() { return "\x1b[34m"; }
34
35 } // namespace spvtools
36 #elif defined(SPIRV_WINDOWS)
37 #include <windows.h>
38
39 namespace spvtools {
40
SetConsoleForegroundColorPrimary(HANDLE hConsole,WORD color)41 static void SetConsoleForegroundColorPrimary(HANDLE hConsole, WORD color) {
42 // Get screen buffer information from console handle
43 CONSOLE_SCREEN_BUFFER_INFO bufInfo;
44 GetConsoleScreenBufferInfo(hConsole, &bufInfo);
45
46 // Get background color
47 color = WORD(color | (bufInfo.wAttributes & 0xfff0));
48
49 // Set foreground color
50 SetConsoleTextAttribute(hConsole, color);
51 }
52
SetConsoleForegroundColor(WORD color)53 static void SetConsoleForegroundColor(WORD color) {
54 SetConsoleForegroundColorPrimary(GetStdHandle(STD_OUTPUT_HANDLE), color);
55 SetConsoleForegroundColorPrimary(GetStdHandle(STD_ERROR_HANDLE), color);
56 }
57
operator const char*()58 clr::reset::operator const char*() {
59 if (isPrint) {
60 SetConsoleForegroundColor(0xf);
61 return "";
62 }
63 return "\x1b[0m";
64 }
65
operator const char*()66 clr::grey::operator const char*() {
67 if (isPrint) {
68 SetConsoleForegroundColor(FOREGROUND_INTENSITY);
69 return "";
70 }
71 return "\x1b[1;30m";
72 }
73
operator const char*()74 clr::red::operator const char*() {
75 if (isPrint) {
76 SetConsoleForegroundColor(FOREGROUND_RED);
77 return "";
78 }
79 return "\x1b[31m";
80 }
81
operator const char*()82 clr::green::operator const char*() {
83 if (isPrint) {
84 SetConsoleForegroundColor(FOREGROUND_GREEN);
85 return "";
86 }
87 return "\x1b[32m";
88 }
89
operator const char*()90 clr::yellow::operator const char*() {
91 if (isPrint) {
92 SetConsoleForegroundColor(FOREGROUND_RED | FOREGROUND_GREEN);
93 return "";
94 }
95 return "\x1b[33m";
96 }
97
operator const char*()98 clr::blue::operator const char*() {
99 // Blue all by itself is hard to see against a black background (the
100 // default on command shell), or a medium blue background (the default
101 // on PowerShell). So increase its intensity.
102
103 if (isPrint) {
104 SetConsoleForegroundColor(FOREGROUND_BLUE | FOREGROUND_INTENSITY);
105 return "";
106 }
107 return "\x1b[94m";
108 }
109
110 } // namespace spvtools
111 #else
112 namespace spvtools {
113
operator const char*()114 clr::reset::operator const char*() { return ""; }
115
operator const char*()116 clr::grey::operator const char*() { return ""; }
117
operator const char*()118 clr::red::operator const char*() { return ""; }
119
operator const char*()120 clr::green::operator const char*() { return ""; }
121
operator const char*()122 clr::yellow::operator const char*() { return ""; }
123
operator const char*()124 clr::blue::operator const char*() { return ""; }
125
126 } // namespace spvtools
127 #endif
128