Skip to content

Commit f99e611

Browse files
committed
Tweak powerline drawing because symbols that should color the left or right edge completely were getting it alpha-ed out. I think when the vector is rendered it didn't land exactly on the right edge and antialiasing brought in some of the just offscreen clear pixels. The fix is to draw a solid line on the left or right. Issue 11539
1 parent edf63e6 commit f99e611

File tree

2 files changed

+103
-19
lines changed

2 files changed

+103
-19
lines changed

sources/iTermBoxDrawingBezierCurveFactory.m

Lines changed: 70 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -94,43 +94,71 @@ + (NSCharacterSet *)blockDrawingCharacters {
9494
typedef NS_OPTIONS(NSUInteger, iTermPowerlineDrawingOptions) {
9595
iTermPowerlineDrawingOptionsNone = 0,
9696
iTermPowerlineDrawingOptionsMirrored = 1 << 0,
97-
iTermPowerlineDrawingOptionsHalfWidth = 2 << 0,
97+
iTermPowerlineDrawingOptionsHalfWidth = 1 << 1,
98+
99+
iTermPowerlineDrawingOptionsFullBleedLeft = 1 << 2,
100+
iTermPowerlineDrawingOptionsFullBleedRight = 1 << 3,
98101
};
99102

100103
+ (NSDictionary<NSNumber *, NSArray *> *)powerlineExtendedSymbols {
101104
if (![iTermAdvancedSettingsModel supportPowerlineExtendedSymbols]) {
102105
return @{};
103106
}
104107
return @{ @(0xE0A3): @[@"uniE0A3_column-number", @(iTermPowerlineDrawingOptionsNone)],
105-
@(0xE0B0): @[@"uniE0B0_Powerline_normal-left", @(iTermPowerlineDrawingOptionsNone)],
106-
@(0xE0B2): @[@"uniE0B2_Powerline_normal-right", @(iTermPowerlineDrawingOptionsNone)],
107-
@(0xE0B4): @[@"uniE0B4_right-half-circle-thick", @(iTermPowerlineDrawingOptionsNone)],
108+
@(0xE0B0): @[@"uniE0B0_Powerline_normal-left",
109+
@(iTermPowerlineDrawingOptionsNone |
110+
iTermPowerlineDrawingOptionsFullBleedLeft)],
111+
@(0xE0B2): @[@"uniE0B2_Powerline_normal-right",
112+
@(iTermPowerlineDrawingOptionsNone |
113+
iTermPowerlineDrawingOptionsFullBleedRight)],
114+
@(0xE0B4): @[@"uniE0B4_right-half-circle-thick",
115+
@(iTermPowerlineDrawingOptionsNone |
116+
iTermPowerlineDrawingOptionsFullBleedLeft)],
108117
@(0xE0B5): @[@"uniE0B5_right-half-circle-thin", @(iTermPowerlineDrawingOptionsNone)],
109-
@(0xE0B6): @[@"uniE0B6_left-half-circle-thick", @(iTermPowerlineDrawingOptionsNone)],
118+
@(0xE0B6): @[@"uniE0B6_left-half-circle-thick", @(
119+
iTermPowerlineDrawingOptionsNone |
120+
iTermPowerlineDrawingOptionsFullBleedRight)],
110121
@(0xE0B7): @[@"uniE0B7_left-half-circle-thin", @(iTermPowerlineDrawingOptionsNone)],
111-
@(0xE0B8): @[@"uniE0B8_lower-left-triangle", @(iTermPowerlineDrawingOptionsNone)],
112-
@(0xE0C0): @[@"uniE0C0_flame-thick", @(iTermPowerlineDrawingOptionsNone)],
122+
@(0xE0B8): @[@"uniE0B8_lower-left-triangle",
123+
@(iTermPowerlineDrawingOptionsNone |
124+
iTermPowerlineDrawingOptionsFullBleedLeft)],
125+
@(0xE0C0): @[@"uniE0C0_flame-thick", @(
126+
iTermPowerlineDrawingOptionsNone |
127+
iTermPowerlineDrawingOptionsFullBleedLeft)],
113128
@(0xE0C1): @[@"uniE0C1_flame-thin", @(iTermPowerlineDrawingOptionsNone)],
114-
@(0xE0C2): @[@"uniE0C0_flame-thick", @(iTermPowerlineDrawingOptionsMirrored)],
129+
@(0xE0C2): @[@"uniE0C0_flame-thick", @(
130+
iTermPowerlineDrawingOptionsMirrored |
131+
iTermPowerlineDrawingOptionsFullBleedLeft)],
115132
@(0xE0C3): @[@"uniE0C1_flame-thin", @(iTermPowerlineDrawingOptionsMirrored)],
116133
@(0xE0CE): @[@"uniE0CE_lego_separator", @(iTermPowerlineDrawingOptionsNone)],
117134
@(0xE0CF): @[@"uniE0CF_lego_separator_thin", @(iTermPowerlineDrawingOptionsNone)],
118-
@(0xE0D1): @[@"uniE0D1_lego_block_sideways", @(iTermPowerlineDrawingOptionsNone)],
135+
@(0xE0D1): @[@"uniE0D1_lego_block_sideways", @(
136+
iTermPowerlineDrawingOptionsNone |
137+
iTermPowerlineDrawingOptionsFullBleedLeft)],
119138

120139
// These were exported to PDF using FontForge
121140
@(0xE0C4): @[@"uniE0C4_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsNone)],
122141
@(0xE0C5): @[@"uniE0C4_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsMirrored)],
123142
@(0xE0C6): @[@"uniE0C6_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsNone)],
124143
@(0xE0C7): @[@"uniE0C6_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsMirrored)],
125-
@(0xE0C8): @[@"uniE0C8_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsNone)],
126-
@(0xE0C9): @[@"uniE0C9_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsNone)],
144+
@(0xE0C8): @[@"uniE0C8_PowerlineExtraSymbols",
145+
@(iTermPowerlineDrawingOptionsNone |
146+
iTermPowerlineDrawingOptionsFullBleedLeft)],
147+
@(0xE0C9): @[@"uniE0C9_PowerlineExtraSymbols", @(
148+
iTermPowerlineDrawingOptionsNone |
149+
iTermPowerlineDrawingOptionsFullBleedLeft)],
127150
@(0xE0CA): @[@"uniE0C8_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsMirrored)],
128-
@(0xE0CB): @[@"uniE0C9_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsMirrored)],
151+
@(0xE0CB): @[@"uniE0C9_PowerlineExtraSymbols", @(
152+
iTermPowerlineDrawingOptionsMirrored |
153+
iTermPowerlineDrawingOptionsFullBleedRight)],
129154
@(0xE0CC): @[@"uniE0CC_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsNone)],
130155
@(0xE0CD): @[@"uniE0CD_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsNone)],
131156
@(0xE0D0): @[@"uniE0D0_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsNone)],
132-
@(0xE0D2): @[@"uniE0D2_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsHalfWidth)],
133-
@(0xE0D4): @[@"uniE0D2_PowerlineExtraSymbols", @(iTermPowerlineDrawingOptionsHalfWidth | iTermPowerlineDrawingOptionsMirrored)],
157+
@(0xE0D2): @[@"uniE0D2_PowerlineExtraSymbols", @(
158+
iTermPowerlineDrawingOptionsHalfWidth)],
159+
@(0xE0D4): @[@"uniE0D2_PowerlineExtraSymbols", @(
160+
iTermPowerlineDrawingOptionsHalfWidth |
161+
iTermPowerlineDrawingOptionsMirrored)],
134162
};
135163
}
136164

@@ -328,11 +356,12 @@ + (void)performBlockWithoutAntialiasing:(void (^)(void))block {
328356
}
329357

330358
+ (void)drawPowerlineCode:(unichar)code
331-
cellSize:(NSSize)regularCellSize
332-
color:(CGColorRef)color
333-
scale:(CGFloat)scale
334-
isPoints:(BOOL)isPoints
335-
offset:(CGPoint)offset {
359+
cellSize:(NSSize)regularCellSize
360+
color:(CGColorRef)color
361+
scale:(CGFloat)scale
362+
isPoints:(BOOL)isPoints
363+
offset:(CGPoint)offset {
364+
336365
NSSize cellSize = regularCellSize;
337366
if ([[iTermBoxDrawingBezierCurveFactory doubleWidthPowerlineSymbols] containsObject:@(code)]) {
338367
cellSize.width *= 2;
@@ -400,7 +429,11 @@ + (void)drawComponents:(NSString *)components
400429
if (!paths) {
401430
return;
402431
}
432+
CGContextRef cgContext = [[NSGraphicsContext currentContext] CGContext];
433+
CGContextSaveGState(cgContext);
434+
CGContextClipToRect(cgContext, CGRectMake(0, 0, cellSize.width, cellSize.height));
403435
[self drawPaths:paths color:color scale:scale isPoints:isPoints solid:solid];
436+
CGContextRestoreGState(cgContext);
404437
}
405438

406439
+ (NSImage *)bitmapForImage:(NSImage *)image {
@@ -533,9 +566,27 @@ + (void)drawPDFWithName:(NSString *)pdfName
533566
fraction:1
534567
respectFlipped:YES
535568
hints:nil];
569+
[self drawBleedForImage:(NSImageRep *)imageRep
570+
destination:destination
571+
options:options
572+
color:[NSColor colorWithCGColor:color]];
536573
[ctx restoreGraphicsState];
537574
}
538575

576+
+ (void)drawBleedForImage:imageRep
577+
destination:(NSRect)destination
578+
options:(iTermPowerlineDrawingOptions)options
579+
color:(NSColor *)color {
580+
const CGFloat size = 1;
581+
[color set];
582+
if (options & iTermPowerlineDrawingOptionsFullBleedLeft) {
583+
NSRectFill(NSMakeRect(NSMinX(destination), NSMinY(destination), size, NSHeight(destination)));
584+
}
585+
if (options & iTermPowerlineDrawingOptionsFullBleedRight) {
586+
NSRectFill(NSMakeRect(NSMaxX(destination) - size, NSMinY(destination), size, NSHeight(destination)));
587+
}
588+
}
589+
539590
+ (BOOL)isPowerlineGlyph:(unichar)code {
540591
switch (code) {
541592
case 0xE0A0: // Version control branch

tests/powerline.txt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,36 @@
3737
U+E0D2 
3838
U+E0D3 
3939
U+E0D4 
40+
41+
Full-bleed tests:
42+
43+
  U+E0B0
44+
45+
  U+E0B4
46+
47+
  U+E0B8
48+
49+
  U+E0BC
50+
51+
  U+E0C0
52+
53+
  U+E0C8
54+
55+
  U+E0D1
56+
57+
  U+E0D2
58+
59+
60+
61+
  U+E0B2
62+
63+
  U+E0B6
64+
65+
   U+E0BA
66+
67+
   U+E0BE
68+
69+
   U+E0C2
70+
71+
   U+E0D4
72+

0 commit comments

Comments
 (0)