1
1
mirror of https://github.com/qvacua/vimr.git synced 2024-12-21 12:41:44 +03:00
vimr/NvimView/Support/DrawerDev/MyView.swift

209 lines
5.5 KiB
Swift
Raw Normal View History

2020-08-19 01:09:13 +03:00
/**
* Tae Won Ha - http://taewon.de - @hataewon
* See LICENSE
*/
import Cocoa
// let cells = ["👨👨👧👧", "", "a"]
// let cells = ["👶🏽", "", "a"]
// let cells = ["ü", "a͆", "a̪"]
// let cells = ["a", "b" , "c"]
// let cells = ["<", "-", "-", "\u{1F600}", "", " ", "b", "c"]
class MyView: NSView {
required init?(coder decoder: NSCoder) {
super.init(coder: decoder)
self.setupUgrid()
}
2020-09-18 23:51:51 +03:00
override func draw(_: NSRect) {
2020-08-19 01:09:13 +03:00
guard let context = NSGraphicsContext.current?.cgContext else { return }
let cellSize = FontUtils.cellSize(of: fira, linespacing: 1, characterspacing: 1)
/*
2020-09-18 23:51:51 +03:00
let string = "a\u{034B}"
let attrStr = NSAttributedString(string: string, attributes: [.font: fira])
let ctLine = CTLineCreateWithAttributedString(attrStr)
let ctRun = (CTLineGetGlyphRuns(ctLine) as! Array<CTRun>)[0]
let glyphCount = CTRunGetGlyphCount(ctRun)
var glyphs = Array(repeating: CGGlyph(), count: glyphCount)
var positions = Array(repeating: CGPoint(), count: glyphCount)
var advances = Array(repeating: CGSize(), count: glyphCount)
CTRunGetGlyphs(ctRun, .zero, &glyphs)
CTRunGetPositions(ctRun, .zero, &positions)
CTRunGetAdvances(ctRun, .zero, &advances)
let attrs = CTRunGetAttributes(ctRun) as! [NSAttributedStringKey: Any]
let font = attrs[NSAttributedStringKey.font] as! NSFont
for i in (0..<positions.count) {
positions[i].x += 20
positions[i].y += 10
}
print(glyphs)
print(positions)
print(advances)
CTFontDrawGlyphs(font, glyphs, positions, glyphCount, context)
*/
2020-08-19 01:09:13 +03:00
/*
2020-09-18 23:51:51 +03:00
// let glyphs: [CGGlyph] = [1614, 1494, 1104, 133]
let glyphs: [CGGlyph] = [1614, 1614, 1063]
let positions = (0..<3).compactMap {
CGPoint(x: CGFloat($0) * cellSize.width, y: 10)
}
CTFontDrawGlyphs(
fira,
glyphs,
positions,
3,
context
)
*/
2020-08-19 01:09:13 +03:00
let runs = (0..<5).map { row in
AttributesRun(
location: CGPoint(x: 0, y: CGFloat(row) * cellSize.height),
cells: self.ugrid.cells[row][0..<10],
attrs: CellAttributes(
fontTrait: [],
foreground: NSColor.textColor.int,
background: NSColor.textBackgroundColor.int,
special: 0xFF0000,
reverse: false
)
)
}
let defaultAttrs = CellAttributes(
fontTrait: [],
foreground: NSColor.textColor.int,
background: NSColor.textBackgroundColor.int,
special: 0xFF0000,
reverse: false
)
self.runDrawer.usesLigatures = true
2020-09-18 23:51:51 +03:00
runs.forEach { _ in
2020-08-19 01:09:13 +03:00
self.runDrawer.draw(
runs,
defaultAttributes: defaultAttrs,
offset: .zero,
in: context
)
}
self.draw(cellGridIn: context, cellSize: cellSize)
}
private let ugrid = UGrid()
private let runDrawer = AttributesRunDrawer(
baseFont: fira, linespacing: 1, characterspacing: 1, usesLigatures: true
)
private func draw(cellGridIn context: CGContext, cellSize: CGSize) {
context.saveGState()
defer { context.restoreGState() }
let color = NSColor.magenta.cgColor
context.setFillColor(color)
var lines = [
CGRect(x: 0, y: 0, width: 1, height: self.bounds.height),
2020-09-18 23:51:51 +03:00
CGRect(
x: self.bounds.width - 1,
y: 0,
width: 1,
height: self.bounds.height
),
2020-08-19 01:09:13 +03:00
CGRect(x: 0, y: 0, width: self.bounds.width, height: 1),
2020-09-18 23:51:51 +03:00
CGRect(
x: 0,
y: self.bounds.height - 1,
width: self.bounds.width,
height: 1
),
2020-08-19 01:09:13 +03:00
]
let rowCount = Int(ceil(self.bounds.height / cellSize.height))
let columnCount = Int(ceil(self.bounds.width / cellSize.width))
for row in 0..<rowCount {
for col in 0..<columnCount {
lines.append(contentsOf: [
2020-09-18 23:51:51 +03:00
CGRect(
x: CGFloat(col) * cellSize.width,
y: CGFloat(row) * cellSize.height,
width: 1,
height: self.bounds.height
),
CGRect(
x: CGFloat(col) * cellSize.width,
y: CGFloat(row) * cellSize.height,
width: self.bounds.width,
height: 1
),
2020-08-19 01:09:13 +03:00
])
}
}
lines.forEach { $0.fill() }
}
private func setupUgrid() {
self.ugrid.resize(Size(width: 10, height: 10))
self.ugrid.update(
row: 0,
startCol: 0,
endCol: 10,
clearCol: 10,
clearAttr: 0,
chunk: [
2020-09-18 23:51:51 +03:00
"", "", "", "", "", "", " ", "a\u{1DC1}", "a\u{032A}", "a\u{034B}",
2020-08-19 01:09:13 +03:00
],
attrIds: Array(repeating: 0, count: 10)
)
self.ugrid.update(
row: 2,
startCol: 0,
endCol: 10,
clearCol: 10,
clearAttr: 0,
chunk: [">", "=", " ", "-", "-", ">", " ", "<", "=", ">"],
attrIds: Array(repeating: 0, count: 10)
)
self.ugrid.update(
row: 1,
startCol: 0,
endCol: 10,
clearCol: 10,
clearAttr: 0,
2020-09-18 23:51:51 +03:00
chunk: ["", "τ", "έ", "", "-", ">", " ", "<", "=", ">"],
2020-08-19 01:09:13 +03:00
attrIds: Array(repeating: 0, count: 10)
)
self.ugrid.update(
row: 3,
startCol: 0,
endCol: 10,
clearCol: 10,
clearAttr: 0,
chunk: (0..<10).compactMap { String($0) },
attrIds: Array(repeating: 0, count: 10)
)
self.ugrid.update(
row: 4,
startCol: 0,
endCol: 8,
clearCol: 8,
clearAttr: 0,
chunk: ["", "", "", "", "", "-", ">", ""],
attrIds: Array(repeating: 0, count: 8)
)
}
}
private let fira = NSFont(name: "FiraCode-Regular", size: 36)!