1// +build windows 2 3package winterm 4 5import "github.com/Azure/go-ansiterm" 6 7const ( 8 FOREGROUND_COLOR_MASK = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE 9 BACKGROUND_COLOR_MASK = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE 10) 11 12// collectAnsiIntoWindowsAttributes modifies the passed Windows text mode flags to reflect the 13// request represented by the passed ANSI mode. 14func collectAnsiIntoWindowsAttributes(windowsMode uint16, inverted bool, baseMode uint16, ansiMode int16) (uint16, bool) { 15 switch ansiMode { 16 17 // Mode styles 18 case ansiterm.ANSI_SGR_BOLD: 19 windowsMode = windowsMode | FOREGROUND_INTENSITY 20 21 case ansiterm.ANSI_SGR_DIM, ansiterm.ANSI_SGR_BOLD_DIM_OFF: 22 windowsMode &^= FOREGROUND_INTENSITY 23 24 case ansiterm.ANSI_SGR_UNDERLINE: 25 windowsMode = windowsMode | COMMON_LVB_UNDERSCORE 26 27 case ansiterm.ANSI_SGR_REVERSE: 28 inverted = true 29 30 case ansiterm.ANSI_SGR_REVERSE_OFF: 31 inverted = false 32 33 case ansiterm.ANSI_SGR_UNDERLINE_OFF: 34 windowsMode &^= COMMON_LVB_UNDERSCORE 35 36 // Foreground colors 37 case ansiterm.ANSI_SGR_FOREGROUND_DEFAULT: 38 windowsMode = (windowsMode &^ FOREGROUND_MASK) | (baseMode & FOREGROUND_MASK) 39 40 case ansiterm.ANSI_SGR_FOREGROUND_BLACK: 41 windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) 42 43 case ansiterm.ANSI_SGR_FOREGROUND_RED: 44 windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED 45 46 case ansiterm.ANSI_SGR_FOREGROUND_GREEN: 47 windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_GREEN 48 49 case ansiterm.ANSI_SGR_FOREGROUND_YELLOW: 50 windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_GREEN 51 52 case ansiterm.ANSI_SGR_FOREGROUND_BLUE: 53 windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_BLUE 54 55 case ansiterm.ANSI_SGR_FOREGROUND_MAGENTA: 56 windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_BLUE 57 58 case ansiterm.ANSI_SGR_FOREGROUND_CYAN: 59 windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_GREEN | FOREGROUND_BLUE 60 61 case ansiterm.ANSI_SGR_FOREGROUND_WHITE: 62 windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE 63 64 // Background colors 65 case ansiterm.ANSI_SGR_BACKGROUND_DEFAULT: 66 // Black with no intensity 67 windowsMode = (windowsMode &^ BACKGROUND_MASK) | (baseMode & BACKGROUND_MASK) 68 69 case ansiterm.ANSI_SGR_BACKGROUND_BLACK: 70 windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) 71 72 case ansiterm.ANSI_SGR_BACKGROUND_RED: 73 windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED 74 75 case ansiterm.ANSI_SGR_BACKGROUND_GREEN: 76 windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_GREEN 77 78 case ansiterm.ANSI_SGR_BACKGROUND_YELLOW: 79 windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_GREEN 80 81 case ansiterm.ANSI_SGR_BACKGROUND_BLUE: 82 windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_BLUE 83 84 case ansiterm.ANSI_SGR_BACKGROUND_MAGENTA: 85 windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_BLUE 86 87 case ansiterm.ANSI_SGR_BACKGROUND_CYAN: 88 windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_GREEN | BACKGROUND_BLUE 89 90 case ansiterm.ANSI_SGR_BACKGROUND_WHITE: 91 windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE 92 } 93 94 return windowsMode, inverted 95} 96 97// invertAttributes inverts the foreground and background colors of a Windows attributes value 98func invertAttributes(windowsMode uint16) uint16 { 99 return (COMMON_LVB_MASK & windowsMode) | ((FOREGROUND_MASK & windowsMode) << 4) | ((BACKGROUND_MASK & windowsMode) >> 4) 100} 101