mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 00:02:45 +00:00 
			
		
		
		
	 7419569a2b
			
		
	
	
		7419569a2b
		
	
	
	
	
		
			
			Previously, this was done by telling the client to put a space at each character in the range. This was inefficient, because a large number of function calls took place and incorrect, as the ANSI standard dictates that character attributes should be cleared as well. The newly added `clear_in_line` function solves this issue. It performs just one bounds check when it's called and can be implemented as a pretty tight loop.
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/Noncopyable.h>
 | |
| #include <AK/String.h>
 | |
| #include <AK/Vector.h>
 | |
| #include <LibVT/Color.h>
 | |
| #include <LibVT/XtermColors.h>
 | |
| 
 | |
| namespace VT {
 | |
| 
 | |
| struct Attribute {
 | |
|     static constexpr Color default_foreground_color = Color::named(Color::ANSIColor::DefaultForeground);
 | |
|     static constexpr Color default_background_color = Color::named(Color::ANSIColor::DefaultBackground);
 | |
| 
 | |
|     void reset()
 | |
|     {
 | |
|         foreground_color = default_foreground_color;
 | |
|         background_color = default_background_color;
 | |
|         flags = Flags::NoAttributes;
 | |
| #ifndef KERNEL
 | |
|         href = {};
 | |
|         href_id = {};
 | |
| #endif
 | |
|     }
 | |
| 
 | |
|     Color foreground_color { default_foreground_color };
 | |
|     Color background_color { default_background_color };
 | |
| 
 | |
|     constexpr Color effective_background_color() const { return flags & Negative ? foreground_color : background_color; }
 | |
|     constexpr Color effective_foreground_color() const { return flags & Negative ? background_color : foreground_color; }
 | |
| 
 | |
| #ifndef KERNEL
 | |
|     String href;
 | |
|     String href_id;
 | |
| #endif
 | |
| 
 | |
|     enum Flags : u8 {
 | |
|         NoAttributes = 0x00,
 | |
|         Bold = 0x01,
 | |
|         Italic = 0x02,
 | |
|         Underline = 0x04,
 | |
|         Negative = 0x08,
 | |
|         Blink = 0x10,
 | |
|         Touched = 0x20,
 | |
|     };
 | |
| 
 | |
|     constexpr bool is_untouched() const { return !(flags & Touched); }
 | |
| 
 | |
|     // TODO: it would be really nice if we had a helper for enums that
 | |
|     // exposed bit ops for class enums...
 | |
|     u8 flags { Flags::NoAttributes };
 | |
| 
 | |
|     constexpr bool operator==(const Attribute& other) const
 | |
|     {
 | |
|         return foreground_color == other.foreground_color && background_color == other.background_color && flags == other.flags;
 | |
|     }
 | |
|     constexpr bool operator!=(const Attribute& other) const
 | |
|     {
 | |
|         return !(*this == other);
 | |
|     }
 | |
| };
 | |
| 
 | |
| }
 |