Skip to content
Snippets Groups Projects
Commit 8a2ccf06 authored by George Nachman's avatar George Nachman
Browse files

Basic proof of concept is working.

parent d88b43ff
No related branches found
No related tags found
No related merge requests found
Showing
with 2020 additions and 15 deletions
Loading
Loading
@@ -1275,6 +1275,8 @@
A623D94E1F8984700011F8C3 /* key@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A623D94A1F8983D80011F8C3 /* key@2x.png */; };
A623D94F1F8984710011F8C3 /* key@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A623D94A1F8983D80011F8C3 /* key@2x.png */; };
A623D9501F8984710011F8C3 /* key@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A623D94A1F8983D80011F8C3 /* key@2x.png */; };
A623D9541F8B04890011F8C3 /* iTermMetalGlue.h in Headers */ = {isa = PBXBuildFile; fileRef = A623D9521F8B04890011F8C3 /* iTermMetalGlue.h */; };
A623D9551F8B04890011F8C3 /* iTermMetalGlue.m in Sources */ = {isa = PBXBuildFile; fileRef = A623D9531F8B04890011F8C3 /* iTermMetalGlue.m */; };
A624231019CF6B0C00182C08 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A624230F19CF6B0C00182C08 /* Sparkle.framework */; };
A624231119CF6B0C00182C08 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A624230F19CF6B0C00182C08 /* Sparkle.framework */; };
A624231219CF6B0C00182C08 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A624230F19CF6B0C00182C08 /* Sparkle.framework */; };
Loading
Loading
@@ -1353,8 +1355,12 @@
A647E3AE18C3588800450FA1 /* VT100ControlParser.h in Headers */ = {isa = PBXBuildFile; fileRef = A647E3AC18C3588800450FA1 /* VT100ControlParser.h */; };
A647E3B718C5884600450FA1 /* iTermObjectPool.h in Headers */ = {isa = PBXBuildFile; fileRef = A647E3B518C5884600450FA1 /* iTermObjectPool.h */; };
A656AE4C1DBBE1CE00CE8448 /* libaprutil-1.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A656AE4B1DBBE1CE00CE8448 /* libaprutil-1.tbd */; };
A656E9951F99C5FB00158128 /* iTermSubpixelModelBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = A656E9931F99C5FB00158128 /* iTermSubpixelModelBuilder.h */; };
A656E9961F99C60300158128 /* iTermSubpixelModelBuilder.mm in Sources */ = {isa = PBXBuildFile; fileRef = A656E9921F99C5FB00158128 /* iTermSubpixelModelBuilder.mm */; };
A658716A1D85E6700061CEEE /* PFMoveApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = A65871681D85E6700061CEEE /* PFMoveApplication.h */; };
A658716B1D85E6750061CEEE /* PFMoveApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = A65871671D85E6700061CEEE /* PFMoveApplication.m */; };
A65943CB1F83382B00598B1E /* iTermMetalClipView.h in Headers */ = {isa = PBXBuildFile; fileRef = A65943C91F83382B00598B1E /* iTermMetalClipView.h */; };
A65943CC1F83382B00598B1E /* iTermMetalClipView.m in Sources */ = {isa = PBXBuildFile; fileRef = A65943CA1F83382B00598B1E /* iTermMetalClipView.m */; };
A65B72521B1A5D7500F947A7 /* WarningSign.png in Resources */ = {isa = PBXBuildFile; fileRef = A65B72501B1A5D7500F947A7 /* WarningSign.png */; };
A65B72531B1A5D7500F947A7 /* WarningSign.png in Resources */ = {isa = PBXBuildFile; fileRef = A65B72501B1A5D7500F947A7 /* WarningSign.png */; };
A65B72541B1A5D7500F947A7 /* WarningSign.png in Resources */ = {isa = PBXBuildFile; fileRef = A65B72501B1A5D7500F947A7 /* WarningSign.png */; };
Loading
Loading
@@ -1555,6 +1561,57 @@
A67778B51CFD4A7300DEED78 /* iTermHotKeyProfileBindingController.m in Sources */ = {isa = PBXBuildFile; fileRef = A67778B31CFD4A7300DEED78 /* iTermHotKeyProfileBindingController.m */; };
A67778B71CFF40AC00DEED78 /* iTermNSArrayCategoryTest.m in Sources */ = {isa = PBXBuildFile; fileRef = A67778B61CFF40AC00DEED78 /* iTermNSArrayCategoryTest.m */; };
A67778CD1CFFAE8D00DEED78 /* NSApplication+iTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = A667F38A1B48AEF200705186 /* NSApplication+iTerm.m */; };
A67960921F81FC96008A42BC /* iTermMetalRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A679608A1F81FC94008A42BC /* iTermMetalRenderer.h */; };
A67960941F81FC96008A42BC /* iTermTextureArray.h in Headers */ = {isa = PBXBuildFile; fileRef = A679608C1F81FC95008A42BC /* iTermTextureArray.h */; };
A67960951F81FC96008A42BC /* iTermMetalCellRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A679608D1F81FC95008A42BC /* iTermMetalCellRenderer.h */; };
A67960981F81FC96008A42BC /* iTermTextureMap.h in Headers */ = {isa = PBXBuildFile; fileRef = A67960901F81FC95008A42BC /* iTermTextureMap.h */; };
A67960AA1F81FC9E008A42BC /* iTermBackgroundColorRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A679609A1F81FC9B008A42BC /* iTermBackgroundColorRenderer.h */; };
A67960AB1F81FC9E008A42BC /* iTermMarkRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A679609B1F81FC9C008A42BC /* iTermMarkRenderer.h */; };
A67960AD1F81FC9E008A42BC /* iTermCursorGuideRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A679609D1F81FC9C008A42BC /* iTermCursorGuideRenderer.h */; };
A67960B01F81FC9E008A42BC /* iTermTextRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A67960A01F81FC9C008A42BC /* iTermTextRenderer.h */; };
A67960B31F81FC9E008A42BC /* iTermBroadcastStripesRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A67960A31F81FC9D008A42BC /* iTermBroadcastStripesRenderer.h */; };
A67960B71F81FC9E008A42BC /* iTermBackgroundImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A67960A71F81FC9D008A42BC /* iTermBackgroundImageRenderer.h */; };
A67960B81F81FC9E008A42BC /* iTermBadgeRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A67960A81F81FC9D008A42BC /* iTermBadgeRenderer.h */; };
A67960B91F81FC9E008A42BC /* iTermCursorRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = A67960A91F81FC9D008A42BC /* iTermCursorRenderer.h */; };
A67960CB1F81FCA6008A42BC /* iTermShaderTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A67960C21F81FCA6008A42BC /* iTermShaderTypes.h */; };
A67960CC1F81FCB6008A42BC /* iTermMetalCellRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = A679608E1F81FC95008A42BC /* iTermMetalCellRenderer.m */; };
A67960CD1F81FCB6008A42BC /* iTermMetalRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = A679608F1F81FC95008A42BC /* iTermMetalRenderer.m */; };
A67960CE1F81FCB6008A42BC /* iTermTextureArray.m in Sources */ = {isa = PBXBuildFile; fileRef = A67960911F81FC95008A42BC /* iTermTextureArray.m */; };
A67960CF1F81FCB6008A42BC /* iTermTextureMap.mm in Sources */ = {isa = PBXBuildFile; fileRef = A679608B1F81FC95008A42BC /* iTermTextureMap.mm */; };
A67960D01F81FCBB008A42BC /* iTermBackgroundColorRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = A67960A51F81FC9D008A42BC /* iTermBackgroundColorRenderer.m */; };
A67960D11F81FCBB008A42BC /* iTermBackgroundImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = A679609F1F81FC9C008A42BC /* iTermBackgroundImageRenderer.m */; };
A67960D21F81FCBB008A42BC /* iTermBadgeRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = A67960A41F81FC9D008A42BC /* iTermBadgeRenderer.m */; };
A67960D31F81FCBB008A42BC /* iTermBroadcastStripesRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = A67960A61F81FC9D008A42BC /* iTermBroadcastStripesRenderer.m */; };
A67960D41F81FCBB008A42BC /* iTermCursorGuideRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = A679609C1F81FC9C008A42BC /* iTermCursorGuideRenderer.m */; };
A67960D51F81FCBB008A42BC /* iTermCursorRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = A67960A21F81FC9C008A42BC /* iTermCursorRenderer.m */; };
A67960D61F81FCBB008A42BC /* iTermMarkRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = A679609E1F81FC9C008A42BC /* iTermMarkRenderer.m */; };
A67960D71F81FCBB008A42BC /* iTermTextRenderer.mm in Sources */ = {isa = PBXBuildFile; fileRef = A67960A11F81FC9C008A42BC /* iTermTextRenderer.mm */; };
A67960E21F82019B008A42BC /* iTermMetalDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = A67960E01F82019A008A42BC /* iTermMetalDriver.h */; };
A67960E41F8201A1008A42BC /* iTermMetalDriver.m in Sources */ = {isa = PBXBuildFile; fileRef = A67960E11F82019B008A42BC /* iTermMetalDriver.m */; };
A67960E71F8202C0008A42BC /* iTermBackgroundColor.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BD1F81FCA5008A42BC /* iTermBackgroundColor.metal */; };
A67960E81F8202C0008A42BC /* iTermBackgroundImage.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BC1F81FCA5008A42BC /* iTermBackgroundImage.metal */; };
A67960E91F8202C0008A42BC /* iTermBadge.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BE1F81FCA5008A42BC /* iTermBadge.metal */; };
A67960EA1F8202C0008A42BC /* iTermBroadcastStripes.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960C01F81FCA5008A42BC /* iTermBroadcastStripes.metal */; };
A67960EB1F8202C0008A42BC /* iTermCursorGuide.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BA1F81FCA5008A42BC /* iTermCursorGuide.metal */; };
A67960EC1F8202C0008A42BC /* iTermCursorRenderer.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960C11F81FCA5008A42BC /* iTermCursorRenderer.metal */; };
A67960ED1F8202C0008A42BC /* iTermMark.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BB1F81FCA5008A42BC /* iTermMark.metal */; };
A67960EE1F8202C0008A42BC /* iTermText.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BF1F81FCA5008A42BC /* iTermText.metal */; };
A67960EF1F8202C1008A42BC /* iTermBackgroundColor.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BD1F81FCA5008A42BC /* iTermBackgroundColor.metal */; };
A67960F01F8202C1008A42BC /* iTermBackgroundImage.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BC1F81FCA5008A42BC /* iTermBackgroundImage.metal */; };
A67960F11F8202C1008A42BC /* iTermBadge.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BE1F81FCA5008A42BC /* iTermBadge.metal */; };
A67960F21F8202C1008A42BC /* iTermBroadcastStripes.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960C01F81FCA5008A42BC /* iTermBroadcastStripes.metal */; };
A67960F31F8202C1008A42BC /* iTermCursorGuide.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BA1F81FCA5008A42BC /* iTermCursorGuide.metal */; };
A67960F41F8202C1008A42BC /* iTermCursorRenderer.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960C11F81FCA5008A42BC /* iTermCursorRenderer.metal */; };
A67960F51F8202C1008A42BC /* iTermMark.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BB1F81FCA5008A42BC /* iTermMark.metal */; };
A67960F61F8202C1008A42BC /* iTermText.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BF1F81FCA5008A42BC /* iTermText.metal */; };
A67960F71F8202C2008A42BC /* iTermBackgroundColor.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BD1F81FCA5008A42BC /* iTermBackgroundColor.metal */; };
A67960F81F8202C2008A42BC /* iTermBackgroundImage.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BC1F81FCA5008A42BC /* iTermBackgroundImage.metal */; };
A67960F91F8202C2008A42BC /* iTermBadge.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BE1F81FCA5008A42BC /* iTermBadge.metal */; };
A67960FA1F8202C2008A42BC /* iTermBroadcastStripes.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960C01F81FCA5008A42BC /* iTermBroadcastStripes.metal */; };
A67960FB1F8202C2008A42BC /* iTermCursorGuide.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BA1F81FCA5008A42BC /* iTermCursorGuide.metal */; };
A67960FC1F8202C2008A42BC /* iTermCursorRenderer.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960C11F81FCA5008A42BC /* iTermCursorRenderer.metal */; };
A67960FD1F8202C2008A42BC /* iTermMark.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BB1F81FCA5008A42BC /* iTermMark.metal */; };
A67960FE1F8202C2008A42BC /* iTermText.metal in Sources */ = {isa = PBXBuildFile; fileRef = A67960BF1F81FCA5008A42BC /* iTermText.metal */; };
A67D0D321A2EE12A003A8B35 /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A67D0D111A2EE12A003A8B35 /* AboutWindow.xib */; };
A67D0D331A2EE12A003A8B35 /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A67D0D111A2EE12A003A8B35 /* AboutWindow.xib */; };
A67D0D341A2EE12A003A8B35 /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A67D0D111A2EE12A003A8B35 /* AboutWindow.xib */; };
Loading
Loading
@@ -2031,7 +2088,7 @@
A6C7630B1B45C52B00E3C992 /* FontSizeEstimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DA8117D13CEA30A00CCA89A /* FontSizeEstimator.m */; };
A6C7630D1B45C52B00E3C992 /* iTermAnimatedImageInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = A67F57BD1B01A08800B4F135 /* iTermAnimatedImageInfo.m */; };
A6C7630E1B45C52B00E3C992 /* iTermBackgroundColorRun.m in Sources */ = {isa = PBXBuildFile; fileRef = A61D16FB1AAFD5530013FCCA /* iTermBackgroundColorRun.m */; };
A6C7630F1B45C52B00E3C992 /* iTermColorMap.m in Sources */ = {isa = PBXBuildFile; fileRef = A6A13AA118C2D23300B241ED /* iTermColorMap.m */; };
A6C7630F1B45C52B00E3C992 /* iTermColorMap.mm in Sources */ = {isa = PBXBuildFile; fileRef = A6A13AA118C2D23300B241ED /* iTermColorMap.mm */; };
A6C763101B45C52B00E3C992 /* iTermFindOnPageHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = A6E77F801A23F484009B1CB6 /* iTermFindOnPageHelper.m */; };
A6C763111B45C52B00E3C992 /* iTermFlippedView.m in Sources */ = {isa = PBXBuildFile; fileRef = A682DE9A1915DB1F00BE8758 /* iTermFlippedView.m */; };
A6C763121B45C52B00E3C992 /* iTermImageInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = A67F57B61B01A01800B4F135 /* iTermImageInfo.m */; };
Loading
Loading
@@ -2335,6 +2392,10 @@
A6E525E01A9C5730007B898E /* VT100StateTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E525DB1A9C5730007B898E /* VT100StateTransition.h */; };
A6E525E11A9C5730007B898E /* VT100State.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E525DC1A9C5730007B898E /* VT100State.h */; };
A6E525E21A9C5730007B898E /* VT100State.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E525DC1A9C5730007B898E /* VT100State.h */; };
A6E5D20B1FA3C55700EDD002 /* iTermMetalRowData.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E5D2091FA3C55700EDD002 /* iTermMetalRowData.h */; };
A6E5D20C1FA3C55700EDD002 /* iTermMetalRowData.m in Sources */ = {isa = PBXBuildFile; fileRef = A6E5D20A1FA3C55700EDD002 /* iTermMetalRowData.m */; };
A6E5D20F1FA3C57900EDD002 /* iTermMetalFrameData.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E5D20D1FA3C57900EDD002 /* iTermMetalFrameData.h */; };
A6E5D2101FA3C57900EDD002 /* iTermMetalFrameData.m in Sources */ = {isa = PBXBuildFile; fileRef = A6E5D20E1FA3C57900EDD002 /* iTermMetalFrameData.m */; };
A6E7137A18F1D70E008D94DD /* GeneralPreferencesViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E7137818F1D70D008D94DD /* GeneralPreferencesViewController.h */; };
A6E7138418F263BC008D94DD /* PreferenceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E7138218F263BC008D94DD /* PreferenceInfo.h */; };
A6E7138918F26445008D94DD /* iTermPreferencesBaseViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E7138718F26445008D94DD /* iTermPreferencesBaseViewController.h */; };
Loading
Loading
@@ -3255,6 +3316,8 @@
A623D9461F8972750011F8C3 /* iTermCallWithTimeout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iTermCallWithTimeout.m; sourceTree = "<group>"; };
A623D9491F8983D70011F8C3 /* key.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = key.png; path = images/key.png; sourceTree = "<group>"; };
A623D94A1F8983D80011F8C3 /* key@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "key@2x.png"; path = "images/key@2x.png"; sourceTree = "<group>"; };
A623D9521F8B04890011F8C3 /* iTermMetalGlue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iTermMetalGlue.h; sourceTree = "<group>"; };
A623D9531F8B04890011F8C3 /* iTermMetalGlue.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iTermMetalGlue.m; sourceTree = "<group>"; };
A624230F19CF6B0C00182C08 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = ThirdParty/Sparkle.framework; sourceTree = "<group>"; };
A624231319CF6B1600182C08 /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = ThirdParty/Growl.framework; sourceTree = "<group>"; };
A624231819CF6DE000182C08 /* NMSSH.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NMSSH.framework; path = ThirdParty/NMSSH.framework; sourceTree = "<group>"; };
Loading
Loading
@@ -3348,8 +3411,13 @@
A647E3B618C5884600450FA1 /* iTermObjectPool.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = iTermObjectPool.m; sourceTree = "<group>"; tabWidth = 4; };
A64AB26219B97B670033DB9C /* iTerm2ForApplescriptTesting-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "iTerm2ForApplescriptTesting-Info.plist"; sourceTree = "<group>"; };
A656AE4B1DBBE1CE00CE8448 /* libaprutil-1.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libaprutil-1.tbd"; path = "usr/lib/libaprutil-1.tbd"; sourceTree = SDKROOT; };
A656E9671F8C994200158128 /* iTermMetalGlyphKey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iTermMetalGlyphKey.h; sourceTree = "<group>"; };
A656E9921F99C5FB00158128 /* iTermSubpixelModelBuilder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = iTermSubpixelModelBuilder.mm; path = Metal/Infrastructure/iTermSubpixelModelBuilder.mm; sourceTree = "<group>"; };
A656E9931F99C5FB00158128 /* iTermSubpixelModelBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermSubpixelModelBuilder.h; path = Metal/Infrastructure/iTermSubpixelModelBuilder.h; sourceTree = "<group>"; };
A65871671D85E6700061CEEE /* PFMoveApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PFMoveApplication.m; path = LetsMove/PFMoveApplication.m; sourceTree = "<group>"; };
A65871681D85E6700061CEEE /* PFMoveApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PFMoveApplication.h; path = LetsMove/PFMoveApplication.h; sourceTree = "<group>"; };
A65943C91F83382B00598B1E /* iTermMetalClipView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = iTermMetalClipView.h; path = Metal/Support/iTermMetalClipView.h; sourceTree = "<group>"; };
A65943CA1F83382B00598B1E /* iTermMetalClipView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = iTermMetalClipView.m; path = Metal/Support/iTermMetalClipView.m; sourceTree = "<group>"; };
A65B72501B1A5D7500F947A7 /* WarningSign.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = WarningSign.png; path = images/WarningSign.png; sourceTree = "<group>"; };
A65B72511B1A5D7500F947A7 /* WarningSign@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "WarningSign@2x.png"; path = "images/WarningSign@2x.png"; sourceTree = "<group>"; };
A65B72581B1A630100F947A7 /* CheckMark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = CheckMark.png; path = images/CheckMark.png; sourceTree = "<group>"; };
Loading
Loading
@@ -3431,6 +3499,41 @@
A67778B21CFD4A7300DEED78 /* iTermHotKeyProfileBindingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTermHotKeyProfileBindingController.h; sourceTree = "<group>"; };
A67778B31CFD4A7300DEED78 /* iTermHotKeyProfileBindingController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iTermHotKeyProfileBindingController.m; sourceTree = "<group>"; };
A67778B61CFF40AC00DEED78 /* iTermNSArrayCategoryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iTermNSArrayCategoryTest.m; sourceTree = "<group>"; };
A679608A1F81FC94008A42BC /* iTermMetalRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermMetalRenderer.h; path = Metal/Infrastructure/iTermMetalRenderer.h; sourceTree = "<group>"; };
A679608B1F81FC95008A42BC /* iTermTextureMap.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = iTermTextureMap.mm; path = Metal/Infrastructure/iTermTextureMap.mm; sourceTree = "<group>"; };
A679608C1F81FC95008A42BC /* iTermTextureArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermTextureArray.h; path = Metal/Infrastructure/iTermTextureArray.h; sourceTree = "<group>"; };
A679608D1F81FC95008A42BC /* iTermMetalCellRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermMetalCellRenderer.h; path = Metal/Infrastructure/iTermMetalCellRenderer.h; sourceTree = "<group>"; };
A679608E1F81FC95008A42BC /* iTermMetalCellRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermMetalCellRenderer.m; path = Metal/Infrastructure/iTermMetalCellRenderer.m; sourceTree = "<group>"; };
A679608F1F81FC95008A42BC /* iTermMetalRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermMetalRenderer.m; path = Metal/Infrastructure/iTermMetalRenderer.m; sourceTree = "<group>"; };
A67960901F81FC95008A42BC /* iTermTextureMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermTextureMap.h; path = Metal/Infrastructure/iTermTextureMap.h; sourceTree = "<group>"; };
A67960911F81FC95008A42BC /* iTermTextureArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermTextureArray.m; path = Metal/Infrastructure/iTermTextureArray.m; sourceTree = "<group>"; };
A679609A1F81FC9B008A42BC /* iTermBackgroundColorRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermBackgroundColorRenderer.h; path = Metal/Renderers/iTermBackgroundColorRenderer.h; sourceTree = "<group>"; };
A679609B1F81FC9C008A42BC /* iTermMarkRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermMarkRenderer.h; path = Metal/Renderers/iTermMarkRenderer.h; sourceTree = "<group>"; };
A679609C1F81FC9C008A42BC /* iTermCursorGuideRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermCursorGuideRenderer.m; path = Metal/Renderers/iTermCursorGuideRenderer.m; sourceTree = "<group>"; };
A679609D1F81FC9C008A42BC /* iTermCursorGuideRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermCursorGuideRenderer.h; path = Metal/Renderers/iTermCursorGuideRenderer.h; sourceTree = "<group>"; };
A679609E1F81FC9C008A42BC /* iTermMarkRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermMarkRenderer.m; path = Metal/Renderers/iTermMarkRenderer.m; sourceTree = "<group>"; };
A679609F1F81FC9C008A42BC /* iTermBackgroundImageRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermBackgroundImageRenderer.m; path = Metal/Renderers/iTermBackgroundImageRenderer.m; sourceTree = "<group>"; };
A67960A01F81FC9C008A42BC /* iTermTextRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermTextRenderer.h; path = Metal/Renderers/iTermTextRenderer.h; sourceTree = "<group>"; };
A67960A11F81FC9C008A42BC /* iTermTextRenderer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = iTermTextRenderer.mm; path = Metal/Renderers/iTermTextRenderer.mm; sourceTree = "<group>"; };
A67960A21F81FC9C008A42BC /* iTermCursorRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermCursorRenderer.m; path = Metal/Renderers/iTermCursorRenderer.m; sourceTree = "<group>"; };
A67960A31F81FC9D008A42BC /* iTermBroadcastStripesRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermBroadcastStripesRenderer.h; path = Metal/Renderers/iTermBroadcastStripesRenderer.h; sourceTree = "<group>"; };
A67960A41F81FC9D008A42BC /* iTermBadgeRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermBadgeRenderer.m; path = Metal/Renderers/iTermBadgeRenderer.m; sourceTree = "<group>"; };
A67960A51F81FC9D008A42BC /* iTermBackgroundColorRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermBackgroundColorRenderer.m; path = Metal/Renderers/iTermBackgroundColorRenderer.m; sourceTree = "<group>"; };
A67960A61F81FC9D008A42BC /* iTermBroadcastStripesRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermBroadcastStripesRenderer.m; path = Metal/Renderers/iTermBroadcastStripesRenderer.m; sourceTree = "<group>"; };
A67960A71F81FC9D008A42BC /* iTermBackgroundImageRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermBackgroundImageRenderer.h; path = Metal/Renderers/iTermBackgroundImageRenderer.h; sourceTree = "<group>"; };
A67960A81F81FC9D008A42BC /* iTermBadgeRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermBadgeRenderer.h; path = Metal/Renderers/iTermBadgeRenderer.h; sourceTree = "<group>"; };
A67960A91F81FC9D008A42BC /* iTermCursorRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermCursorRenderer.h; path = Metal/Renderers/iTermCursorRenderer.h; sourceTree = "<group>"; };
A67960BA1F81FCA5008A42BC /* iTermCursorGuide.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = iTermCursorGuide.metal; path = Metal/Shaders/iTermCursorGuide.metal; sourceTree = "<group>"; };
A67960BB1F81FCA5008A42BC /* iTermMark.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = iTermMark.metal; path = Metal/Shaders/iTermMark.metal; sourceTree = "<group>"; };
A67960BC1F81FCA5008A42BC /* iTermBackgroundImage.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = iTermBackgroundImage.metal; path = Metal/Shaders/iTermBackgroundImage.metal; sourceTree = "<group>"; };
A67960BD1F81FCA5008A42BC /* iTermBackgroundColor.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = iTermBackgroundColor.metal; path = Metal/Shaders/iTermBackgroundColor.metal; sourceTree = "<group>"; };
A67960BE1F81FCA5008A42BC /* iTermBadge.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = iTermBadge.metal; path = Metal/Shaders/iTermBadge.metal; sourceTree = "<group>"; };
A67960BF1F81FCA5008A42BC /* iTermText.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = iTermText.metal; path = Metal/Shaders/iTermText.metal; sourceTree = "<group>"; };
A67960C01F81FCA5008A42BC /* iTermBroadcastStripes.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = iTermBroadcastStripes.metal; path = Metal/Shaders/iTermBroadcastStripes.metal; sourceTree = "<group>"; };
A67960C11F81FCA5008A42BC /* iTermCursorRenderer.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = iTermCursorRenderer.metal; path = Metal/Shaders/iTermCursorRenderer.metal; sourceTree = "<group>"; };
A67960C21F81FCA6008A42BC /* iTermShaderTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermShaderTypes.h; path = Metal/Shaders/iTermShaderTypes.h; sourceTree = "<group>"; };
A67960E01F82019A008A42BC /* iTermMetalDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iTermMetalDriver.h; path = Metal/iTermMetalDriver.h; sourceTree = "<group>"; };
A67960E11F82019B008A42BC /* iTermMetalDriver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iTermMetalDriver.m; path = Metal/iTermMetalDriver.m; sourceTree = "<group>"; };
A67D0D111A2EE12A003A8B35 /* AboutWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = AboutWindow.xib; path = Interfaces/AboutWindow.xib; sourceTree = "<group>"; };
A67D0D121A2EE12A003A8B35 /* AddressBook.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = AddressBook.strings; path = Interfaces/AddressBook.strings; sourceTree = "<group>"; };
A67D0D131A2EE12A003A8B35 /* AdvancedWorkingDirectoryWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = AdvancedWorkingDirectoryWindow.xib; path = Interfaces/AdvancedWorkingDirectoryWindow.xib; sourceTree = "<group>"; };
Loading
Loading
@@ -3695,7 +3798,7 @@
A69B45BB197CB78B00F5444D /* iTermDragHandleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTermDragHandleView.h; sourceTree = "<group>"; };
A69B45BC197CB78B00F5444D /* iTermDragHandleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iTermDragHandleView.m; sourceTree = "<group>"; };
A6A13AA018C2D23300B241ED /* iTermColorMap.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = iTermColorMap.h; sourceTree = "<group>"; tabWidth = 4; };
A6A13AA118C2D23300B241ED /* iTermColorMap.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = iTermColorMap.m; sourceTree = "<group>"; tabWidth = 4; };
A6A13AA118C2D23300B241ED /* iTermColorMap.mm */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iTermColorMap.mm; sourceTree = "<group>"; tabWidth = 4; };
A6A13AA518C2D45900B241ED /* NSColor+iTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = "NSColor+iTerm.h"; sourceTree = "<group>"; tabWidth = 4; };
A6A13AA618C2D45900B241ED /* NSColor+iTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = "NSColor+iTerm.m"; sourceTree = "<group>"; tabWidth = 4; };
A6A13AAA18C3347200B241ED /* VT100Output.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = VT100Output.h; sourceTree = "<group>"; tabWidth = 4; };
Loading
Loading
@@ -3857,6 +3960,10 @@
A6E525DA1A9C5730007B898E /* VT100StateMachine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VT100StateMachine.h; sourceTree = "<group>"; };
A6E525DB1A9C5730007B898E /* VT100StateTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VT100StateTransition.h; sourceTree = "<group>"; };
A6E525DC1A9C5730007B898E /* VT100State.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VT100State.h; sourceTree = "<group>"; };
A6E5D2091FA3C55700EDD002 /* iTermMetalRowData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = iTermMetalRowData.h; path = Metal/Infrastructure/iTermMetalRowData.h; sourceTree = "<group>"; };
A6E5D20A1FA3C55700EDD002 /* iTermMetalRowData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = iTermMetalRowData.m; path = Metal/Infrastructure/iTermMetalRowData.m; sourceTree = "<group>"; };
A6E5D20D1FA3C57900EDD002 /* iTermMetalFrameData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iTermMetalFrameData.h; sourceTree = "<group>"; };
A6E5D20E1FA3C57900EDD002 /* iTermMetalFrameData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iTermMetalFrameData.m; sourceTree = "<group>"; };
A6E7137818F1D70D008D94DD /* GeneralPreferencesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = GeneralPreferencesViewController.h; sourceTree = "<group>"; tabWidth = 4; };
A6E7137918F1D70D008D94DD /* GeneralPreferencesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = GeneralPreferencesViewController.m; sourceTree = "<group>"; tabWidth = 4; };
A6E7137D18F1DB1E008D94DD /* iTermPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = iTermPreferences.h; sourceTree = "<group>"; tabWidth = 4; };
Loading
Loading
@@ -4150,6 +4257,7 @@
0464AB0D006CD2EC7F000001 /* JTerminal */ = {
isa = PBXGroup;
children = (
A67960FF1F82040C008A42BC /* font */,
A6D22A701BC8C27E004084E0 /* NSManagedObjects */,
0464AB0E006CD2EC7F000001 /* Classes */,
0464AB15006CD2EC7F000001 /* Headers */,
Loading
Loading
@@ -4168,6 +4276,7 @@
0464AB0E006CD2EC7F000001 /* Classes */ = {
isa = PBXGroup;
children = (
A67960801F81FC65008A42BC /* Metal */,
06E0C88B1DF9691200AA061B /* Services */,
A6CEBF5F1DCE7DF3009F4FD2 /* Proto */,
53EBF29A1DCBFF6D00766613 /* API */,
Loading
Loading
@@ -5192,6 +5301,15 @@
name = API;
sourceTree = "<group>";
};
A623D9511F8B04730011F8C3 /* Glue */ = {
isa = PBXGroup;
children = (
A623D9521F8B04890011F8C3 /* iTermMetalGlue.h */,
A623D9531F8B04890011F8C3 /* iTermMetalGlue.m */,
);
name = Glue;
sourceTree = "<group>";
};
A62C3B371BD40D1400B5629D /* Marks */ = {
isa = PBXGroup;
children = (
Loading
Loading
@@ -5292,6 +5410,16 @@
name = LetsMove;
sourceTree = "<group>";
};
A65943C81F83380E00598B1E /* Support */ = {
isa = PBXGroup;
children = (
A65943C91F83382B00598B1E /* iTermMetalClipView.h */,
A65943CA1F83382B00598B1E /* iTermMetalClipView.m */,
A656E9671F8C994200158128 /* iTermMetalGlyphKey.h */,
);
name = Support;
sourceTree = "<group>";
};
A663012119D08638004AF81C /* SCEvents */ = {
isa = PBXGroup;
children = (
Loading
Loading
@@ -5315,6 +5443,87 @@
path = image_decoder;
sourceTree = "<group>";
};
A67960801F81FC65008A42BC /* Metal */ = {
isa = PBXGroup;
children = (
A623D9511F8B04730011F8C3 /* Glue */,
A65943C81F83380E00598B1E /* Support */,
A67960E01F82019A008A42BC /* iTermMetalDriver.h */,
A67960E11F82019B008A42BC /* iTermMetalDriver.m */,
A67960891F81FC8C008A42BC /* Infrastructure */,
A67960881F81FC87008A42BC /* Renderers */,
A67960871F81FC81008A42BC /* Shaders */,
);
name = Metal;
sourceTree = "<group>";
};
A67960871F81FC81008A42BC /* Shaders */ = {
isa = PBXGroup;
children = (
A67960C21F81FCA6008A42BC /* iTermShaderTypes.h */,
A67960BD1F81FCA5008A42BC /* iTermBackgroundColor.metal */,
A67960BC1F81FCA5008A42BC /* iTermBackgroundImage.metal */,
A67960BE1F81FCA5008A42BC /* iTermBadge.metal */,
A67960C01F81FCA5008A42BC /* iTermBroadcastStripes.metal */,
A67960BA1F81FCA5008A42BC /* iTermCursorGuide.metal */,
A67960C11F81FCA5008A42BC /* iTermCursorRenderer.metal */,
A67960BB1F81FCA5008A42BC /* iTermMark.metal */,
A67960BF1F81FCA5008A42BC /* iTermText.metal */,
);
name = Shaders;
sourceTree = "<group>";
};
A67960881F81FC87008A42BC /* Renderers */ = {
isa = PBXGroup;
children = (
A679609A1F81FC9B008A42BC /* iTermBackgroundColorRenderer.h */,
A67960A71F81FC9D008A42BC /* iTermBackgroundImageRenderer.h */,
A67960A81F81FC9D008A42BC /* iTermBadgeRenderer.h */,
A67960A31F81FC9D008A42BC /* iTermBroadcastStripesRenderer.h */,
A679609D1F81FC9C008A42BC /* iTermCursorGuideRenderer.h */,
A67960A91F81FC9D008A42BC /* iTermCursorRenderer.h */,
A679609B1F81FC9C008A42BC /* iTermMarkRenderer.h */,
A67960A01F81FC9C008A42BC /* iTermTextRenderer.h */,
A67960A51F81FC9D008A42BC /* iTermBackgroundColorRenderer.m */,
A679609F1F81FC9C008A42BC /* iTermBackgroundImageRenderer.m */,
A67960A41F81FC9D008A42BC /* iTermBadgeRenderer.m */,
A67960A61F81FC9D008A42BC /* iTermBroadcastStripesRenderer.m */,
A679609C1F81FC9C008A42BC /* iTermCursorGuideRenderer.m */,
A67960A21F81FC9C008A42BC /* iTermCursorRenderer.m */,
A679609E1F81FC9C008A42BC /* iTermMarkRenderer.m */,
A67960A11F81FC9C008A42BC /* iTermTextRenderer.mm */,
);
name = Renderers;
sourceTree = "<group>";
};
A67960891F81FC8C008A42BC /* Infrastructure */ = {
isa = PBXGroup;
children = (
A656E9931F99C5FB00158128 /* iTermSubpixelModelBuilder.h */,
A656E9921F99C5FB00158128 /* iTermSubpixelModelBuilder.mm */,
A679608D1F81FC95008A42BC /* iTermMetalCellRenderer.h */,
A679608A1F81FC94008A42BC /* iTermMetalRenderer.h */,
A679608C1F81FC95008A42BC /* iTermTextureArray.h */,
A67960901F81FC95008A42BC /* iTermTextureMap.h */,
A679608E1F81FC95008A42BC /* iTermMetalCellRenderer.m */,
A679608F1F81FC95008A42BC /* iTermMetalRenderer.m */,
A67960911F81FC95008A42BC /* iTermTextureArray.m */,
A679608B1F81FC95008A42BC /* iTermTextureMap.mm */,
A6E5D2091FA3C55700EDD002 /* iTermMetalRowData.h */,
A6E5D20A1FA3C55700EDD002 /* iTermMetalRowData.m */,
A6E5D20D1FA3C57900EDD002 /* iTermMetalFrameData.h */,
A6E5D20E1FA3C57900EDD002 /* iTermMetalFrameData.m */,
);
name = Infrastructure;
sourceTree = "<group>";
};
A67960FF1F82040C008A42BC /* font */ = {
isa = PBXGroup;
children = (
);
path = font;
sourceTree = "<group>";
};
A67F57C31B0930AD00B4F135 /* Shell Launcher/FD Client/Server */ = {
isa = PBXGroup;
children = (
Loading
Loading
@@ -5646,7 +5855,7 @@
A61D16FB1AAFD5530013FCCA /* iTermBackgroundColorRun.m */,
A6CC16521CF012E300E8C148 /* iTermCarbonHotKeyController.h */,
A6CC16531CF012E300E8C148 /* iTermCarbonHotKeyController.m */,
A6A13AA118C2D23300B241ED /* iTermColorMap.m */,
A6A13AA118C2D23300B241ED /* iTermColorMap.mm */,
A6FEA25D1CF0F20B00376F28 /* iTermEventTap.h */,
A6FEA25E1CF0F20B00376F28 /* iTermEventTap.m */,
A6E77F801A23F484009B1CB6 /* iTermFindOnPageHelper.m */,
Loading
Loading
@@ -6492,6 +6701,7 @@
A6A269901900F95D00437DA9 /* ProfilesTerminalPreferencesViewController.h in Headers */,
A6E7138918F26445008D94DD /* iTermPreferencesBaseViewController.h in Headers */,
1D5FDD511208E8F000C46BA3 /* ITAddressBookMgr.h in Headers */,
A67960B71F81FC9E008A42BC /* iTermBackgroundImageRenderer.h in Headers */,
A63F4095183B398C003A6A6D /* PTYNoteViewController.h in Headers */,
1D5FDD5A1208E8F000C46BA3 /* PSMYosemiteTabStyle.h in Headers */,
1DFA9D5E18F36DC3008ADC98 /* iTermKeyMappingViewController.h in Headers */,
Loading
Loading
@@ -6507,6 +6717,7 @@
A647E3A418C352B000450FA1 /* VT100OtherParser.h in Headers */,
A6A2698318FE48B200437DA9 /* NSFont+iTerm.h in Headers */,
A6A5991D1887C63700CB4209 /* ToolCommandHistoryView.h in Headers */,
A67960AD1F81FC9E008A42BC /* iTermCursorGuideRenderer.h in Headers */,
1DFA9D6418F37160008ADC98 /* iTermEditKeyActionWindowController.h in Headers */,
A67F57D41B11882900B4F135 /* CapturedOutput.h in Headers */,
A693395C1851A61D00EBEA20 /* VT100ScreenMark.h in Headers */,
Loading
Loading
@@ -6520,6 +6731,7 @@
1D4983501912FC0B002E942D /* ToolDirectoriesView.h in Headers */,
A68A3114186E2F14007F550F /* PopupWindow.h in Headers */,
A682DE96190C5E7000BE8758 /* iTermProgressIndicator.h in Headers */,
A67960B31F81FC9E008A42BC /* iTermBroadcastStripesRenderer.h in Headers */,
1D5FDD5F1208E8F000C46BA3 /* PSMTabBarControl.h in Headers */,
A68A30F7186D150B007F550F /* SCPFile.h in Headers */,
A68A30C1186D0DC1007F550F /* iTermFindCursorView.h in Headers */,
Loading
Loading
@@ -6541,6 +6753,8 @@
A65B72711B248F1800F947A7 /* iTermOrphanServerAdopter.h in Headers */,
1D5FDD6B1208E8F000C46BA3 /* CGSConnection.h in Headers */,
A6C4E8E21846E13800CFAA77 /* IntervalTree.h in Headers */,
A67960951F81FC96008A42BC /* iTermMetalCellRenderer.h in Headers */,
A67960E21F82019B008A42BC /* iTermMetalDriver.h in Headers */,
A60014FB18552BDF00CE38D8 /* iTermNSKeyBindingEmulator.h in Headers */,
A6A13AA718C2D45900B241ED /* NSColor+iTerm.h in Headers */,
A6E77FA11A2A8A5A009B1CB6 /* NSData+iTerm.h in Headers */,
Loading
Loading
@@ -6570,6 +6784,7 @@
1D72439011F416F300BD4924 /* LineBuffer.h in Headers */,
874206490564169600CFC3F1 /* iTermApplicationDelegate.h in Headers */,
DDF0FD65062916F70080EF74 /* iTermApplication.h in Headers */,
A67960921F81FC96008A42BC /* iTermMetalRenderer.h in Headers */,
49A6E4091211CC6000D9AD6F /* Compatability.h in Headers */,
1D6C50A71226EEFB00E0AA3E /* ProfileListView.h in Headers */,
1D468BB91B0543E300226083 /* iTermKeyboardNavigatableTableView.h in Headers */,
Loading
Loading
@@ -6603,6 +6818,7 @@
A6E7138E18F26A91008D94DD /* AppearancePreferencesViewController.h in Headers */,
A6E74761188C679C005355CF /* iTermExposeView.h in Headers */,
A67F57CB1B0930CA00B4F135 /* iTermFileDescriptorClient.h in Headers */,
A67960B91F81FC9E008A42BC /* iTermCursorRenderer.h in Headers */,
1D7C18811275D22900461E55 /* PasteboardHistory.h in Headers */,
1D7C1D1212772ECC00461E55 /* NSDateFormatterExtras.h in Headers */,
1DE214E1128212EE004E3ADF /* Autocomplete.h in Headers */,
Loading
Loading
@@ -6639,6 +6855,7 @@
1D988597135D23BD0072023F /* ProcessCache.h in Headers */,
A65B726D1B23559A00F947A7 /* iTermFileDescriptorSocketPath.h in Headers */,
A6E713A818F7C9F4008D94DD /* iTermProfilePreferences.h in Headers */,
A67960CB1F81FCA6008A42BC /* iTermShaderTypes.h in Headers */,
A6E74757188C66CF005355CF /* iTermExposeTabView.h in Headers */,
A68A3119186E2F54007F550F /* PopupModel.h in Headers */,
A63BA39518A9CB43002BE075 /* iTermSelection.h in Headers */,
Loading
Loading
@@ -6670,6 +6887,8 @@
1D67ABAB14285D6000D5DA4E /* NSFileManager+iTerm.h in Headers */,
1D1F8C1A1A32616A00167161 /* AMIndeterminateProgressIndicator.h in Headers */,
1D31BC65142D33CA001F7ECB /* TriggerController.h in Headers */,
A67960AA1F81FC9E008A42BC /* iTermBackgroundColorRenderer.h in Headers */,
A67960AB1F81FC9E008A42BC /* iTermMarkRenderer.h in Headers */,
A6E713A318F7C7E0008D94DD /* iTermProfilePreferencesBaseViewController.h in Headers */,
A61ABBBB1AE5F38C004656C2 /* NSDictionary+Profile.h in Headers */,
1D9DCBFE142D7BA60016228A /* Trigger.h in Headers */,
Loading
Loading
@@ -6690,6 +6909,7 @@
A60D85A81A3A8105003AEE22 /* NSPasteboard+iTerm.h in Headers */,
A6C537C31939507100A08C18 /* iTermRestorableSession.h in Headers */,
A663012F19D0864C004AF81C /* SCEventListenerProtocol.h in Headers */,
A67960B81F81FC9E008A42BC /* iTermBadgeRenderer.h in Headers */,
A6C7DE5D19A469D6001E5C75 /* NSColor+Scripting.h in Headers */,
A68A30F9186D150B007F550F /* TransferrableFile.h in Headers */,
1D9DDD9C142E5FBB00275650 /* Coprocess.h in Headers */,
Loading
Loading
@@ -6702,6 +6922,7 @@
A6E7475C188C6731005355CF /* iTermExposeGridView.h in Headers */,
1D4AE8FE14343A760092EB49 /* iTermSemanticHistoryPrefsController.h in Headers */,
1DEDC8FD1451F67D004F1615 /* SessionTitleView.h in Headers */,
A656E9951F99C5FB00158128 /* iTermSubpixelModelBuilder.h in Headers */,
1DFA9D7018F3A30F008ADC98 /* PointerPreferencesViewController.h in Headers */,
A6FCB60A1C6714230019184E /* iTermFullScreenWindowManager.h in Headers */,
5ECE005F1454E59B004861E9 /* PseudoTerminalRestorer.h in Headers */,
Loading
Loading
@@ -6724,6 +6945,7 @@
A61B66CF18D51EAC009AC9D5 /* iTermInstantReplayWindowController.h in Headers */,
1D3D21951483144600FAC8E7 /* TSVParser.h in Headers */,
1D3D21AF14839AAB00FAC8E7 /* TmuxLayoutParser.h in Headers */,
A67960B01F81FC9E008A42BC /* iTermTextRenderer.h in Headers */,
A663011719CFE450004AF81C /* iTermAboutWindowController.h in Headers */,
1DB67CED14850D53005849A1 /* TmuxWindowOpener.h in Headers */,
1DB40AB51B27B577005B83C7 /* PTYTabDelegate.h in Headers */,
Loading
Loading
@@ -6736,6 +6958,7 @@
1DD6707714934ADE008E4361 /* PTYSplitView.h in Headers */,
1D8CE03D195A143100FE1BEE /* iTermRule.h in Headers */,
D3CE2D4E1A00936F0098ED99 /* PSMDarkTabStyle.h in Headers */,
A67960981F81FC96008A42BC /* iTermTextureMap.h in Headers */,
1D4BAFEC1BFE77E4004FF52B /* iTermPrintAccessoryViewController.h in Headers */,
1DD4CE8014A51C0D00ED182E /* TmuxDashboardController.h in Headers */,
A68A310F186E2EDA007F550F /* PopupEntry.h in Headers */,
Loading
Loading
@@ -6814,6 +7037,7 @@
A6E74752188C6693005355CF /* iTermExposeWindow.h in Headers */,
1D085F9616F04D0900B7FCE9 /* NSBezierPath+iTerm.h in Headers */,
1D085F9A16F1135F00B7FCE9 /* PasteEvent.h in Headers */,
A67960941F81FC96008A42BC /* iTermTextureArray.h in Headers */,
1D085F9E16F137D900B7FCE9 /* RoundedRectView.h in Headers */,
1D085FA216F138A100B7FCE9 /* ToastWindowController.h in Headers */,
1D9053C617A5CCF100A0B64E /* MovingAverage.h in Headers */,
Loading
Loading
@@ -6859,8 +7083,10 @@
A66719251DCE36C3000CE608 /* iTermBoxDrawingBezierCurveFactory.h in Headers */,
A66719261DCE36C3000CE608 /* iTermCommandHistoryEntryMO.h in Headers */,
A66719271DCE36C3000CE608 /* SetHostnameTrigger.h in Headers */,
A65943CB1F83382B00598B1E /* iTermMetalClipView.h in Headers */,
A66719281DCE36C3000CE608 /* iTermEventTap.h in Headers */,
A66719291DCE36C3000CE608 /* iTermCommandHistoryEntryMO+CoreDataProperties.h in Headers */,
A6E5D20F1FA3C57900EDD002 /* iTermMetalFrameData.h in Headers */,
A667192A1DCE36C3000CE608 /* iTermRecentDirectoryMO+Additions.h in Headers */,
A667192B1DCE36C3000CE608 /* iTermRoundedCornerScrollView.h in Headers */,
A667192C1DCE36C3000CE608 /* iTermPreciseTimer.h in Headers */,
Loading
Loading
@@ -6912,9 +7138,11 @@
A66EF82C1EF59CFC0005891A /* iTermRateLimitedUpdate.h in Headers */,
A66719521DCE36C3000CE608 /* iTermRecentDirectoryMO+CoreDataProperties.h in Headers */,
A66719531DCE36C3000CE608 /* iTermSocketAddress.h in Headers */,
A6E5D20B1FA3C55700EDD002 /* iTermMetalRowData.h in Headers */,
A66719541DCE36C3000CE608 /* SetDirectoryTrigger.h in Headers */,
A66719551DCE36C3000CE608 /* iTermAutomaticProfileSwitcher.h in Headers */,
A66719561DCE36C3000CE608 /* iTermRecentDirectoryMO.h in Headers */,
A623D9541F8B04890011F8C3 /* iTermMetalGlue.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Loading
Loading
@@ -7221,8 +7449,7 @@
DevelopmentTeam = H7V7XYVQ7D;
};
874206460564169600CFC3F1 = {
DevelopmentTeam = CMC4EL7UVS;
ProvisioningStyle = Automatic;
ProvisioningStyle = Manual;
};
A66717851DCE36C3000CE608 = {
DevelopmentTeam = H7V7XYVQ7D;
Loading
Loading
@@ -8376,8 +8603,16 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A67960FC1F8202C2008A42BC /* iTermCursorRenderer.metal in Sources */,
A67960FA1F8202C2008A42BC /* iTermBroadcastStripes.metal in Sources */,
A6C763CF1B45C53B00E3C992 /* main.m in Sources */,
A67960FD1F8202C2008A42BC /* iTermMark.metal in Sources */,
A6D22A451BC8BE6B004084E0 /* Model.xcdatamodeld in Sources */,
A67960F71F8202C2008A42BC /* iTermBackgroundColor.metal in Sources */,
A67960FE1F8202C2008A42BC /* iTermText.metal in Sources */,
A67960FB1F8202C2008A42BC /* iTermCursorGuide.metal in Sources */,
A67960F91F8202C2008A42BC /* iTermBadge.metal in Sources */,
A67960F81F8202C2008A42BC /* iTermBackgroundImage.metal in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Loading
Loading
@@ -8385,11 +8620,19 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A67960F51F8202C1008A42BC /* iTermMark.metal in Sources */,
A67960F01F8202C1008A42BC /* iTermBackgroundImage.metal in Sources */,
A68AC8F61F0823100023A216 /* iTermFindOnPageHelperTest.m in Sources */,
90A1E13B186F9EA4003EC3E8 /* AppleScriptTest.m in Sources */,
A6C763FE1B45C72F00E3C992 /* iTermTests.m in Sources */,
A67960F61F8202C1008A42BC /* iTermText.metal in Sources */,
A67960F31F8202C1008A42BC /* iTermCursorGuide.metal in Sources */,
A6D22A441BC8BE6B004084E0 /* Model.xcdatamodeld in Sources */,
A67960F11F8202C1008A42BC /* iTermBadge.metal in Sources */,
A67960F21F8202C1008A42BC /* iTermBroadcastStripes.metal in Sources */,
A60BB3911EB6A56800D76C09 /* iTermProcessCollectionTest.m in Sources */,
A67960EF1F8202C1008A42BC /* iTermBackgroundColor.metal in Sources */,
A67960F41F8202C1008A42BC /* iTermCursorRenderer.metal in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Loading
Loading
@@ -8406,8 +8649,16 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A67960EC1F8202C0008A42BC /* iTermCursorRenderer.metal in Sources */,
A67960EA1F8202C0008A42BC /* iTermBroadcastStripes.metal in Sources */,
A6C763CE1B45C53A00E3C992 /* main.m in Sources */,
A67960ED1F8202C0008A42BC /* iTermMark.metal in Sources */,
A6D22A431BC8BE6B004084E0 /* Model.xcdatamodeld in Sources */,
A67960E71F8202C0008A42BC /* iTermBackgroundColor.metal in Sources */,
A67960EE1F8202C0008A42BC /* iTermText.metal in Sources */,
A67960EB1F8202C0008A42BC /* iTermCursorGuide.metal in Sources */,
A67960E91F8202C0008A42BC /* iTermBadge.metal in Sources */,
A67960E81F8202C0008A42BC /* iTermBackgroundImage.metal in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Loading
Loading
@@ -8415,24 +8666,42 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A67960D71F81FCBB008A42BC /* iTermTextRenderer.mm in Sources */,
A67960D21F81FCBB008A42BC /* iTermBadgeRenderer.m in Sources */,
A67960D11F81FCBB008A42BC /* iTermBackgroundImageRenderer.m in Sources */,
A6AC5D241E9036D70097C0A7 /* iTermURLMark.m in Sources */,
A66719621DCE3772000CE608 /* iTermSocketAddress.m in Sources */,
53AFFC8E1DD2A04100E6CEC6 /* iTermLSOF.m in Sources */,
A66719671DCE3772000CE608 /* iTermWebSocketFrameBuilder.m in Sources */,
A66719651DCE3772000CE608 /* iTermHTTPConnection.m in Sources */,
A67960CE1F81FCB6008A42BC /* iTermTextureArray.m in Sources */,
A67960D31F81FCBB008A42BC /* iTermBroadcastStripesRenderer.m in Sources */,
A668E8A31E7EFEA5005F8758 /* iTermURLStore.m in Sources */,
A6E5D2101FA3C57900EDD002 /* iTermMetalFrameData.m in Sources */,
A66719681DCE3772000CE608 /* iTermWebSocketConnection.m in Sources */,
A623D9551F8B04890011F8C3 /* iTermMetalGlue.m in Sources */,
A67960D01F81FCBB008A42BC /* iTermBackgroundColorRenderer.m in Sources */,
A67960E41F8201A1008A42BC /* iTermMetalDriver.m in Sources */,
A66719641DCE3772000CE608 /* iTermSocket.m in Sources */,
A67960D41F81FCBB008A42BC /* iTermCursorGuideRenderer.m in Sources */,
A656E9961F99C60300158128 /* iTermSubpixelModelBuilder.mm in Sources */,
A65943CC1F83382B00598B1E /* iTermMetalClipView.m in Sources */,
A67960CF1F81FCB6008A42BC /* iTermTextureMap.mm in Sources */,
A62A1F771E711BC000363EE9 /* iTermHelpMessageViewController.m in Sources */,
A62A1F721E6E724B00363EE9 /* iTermMenuOpener.m in Sources */,
A65EC0301F31800300AC0A6B /* iTermUpdateCadenceController.m in Sources */,
A67960D51F81FCBB008A42BC /* iTermCursorRenderer.m in Sources */,
A66719661DCE3772000CE608 /* iTermWebSocketFrame.m in Sources */,
A65EC0341F3181E700AC0A6B /* NSTimer+iTerm.m in Sources */,
A623D9481F8972750011F8C3 /* iTermCallWithTimeout.m in Sources */,
A66EF82D1EF59CFC0005891A /* iTermRateLimitedUpdate.m in Sources */,
A6E5D20C1FA3C55700EDD002 /* iTermMetalRowData.m in Sources */,
A67960CC1F81FCB6008A42BC /* iTermMetalCellRenderer.m in Sources */,
A67960D61F81FCBB008A42BC /* iTermMarkRenderer.m in Sources */,
A66719601DCE3772000CE608 /* iTermAPIServer.m in Sources */,
A60BB38F1EB6A08A00D76C09 /* iTermProcessCollection.m in Sources */,
A68AC8F41F05C0860023A216 /* NSBundle+iTerm.m in Sources */,
A67960CD1F81FCB6008A42BC /* iTermMetalRenderer.m in Sources */,
A66719631DCE3772000CE608 /* iTermSocketIPV4Address.m in Sources */,
A66719611DCE3772000CE608 /* iTermIPV4Address.m in Sources */,
);
Loading
Loading
@@ -8846,7 +9115,7 @@
A6C762A71B45C52B00E3C992 /* iTermNewWindowCommand.m in Sources */,
A6C763711B45C52B00E3C992 /* iTermProfilePreferencesBaseViewController.m in Sources */,
A6C760431B45C4CF00E3C992 /* NSTableColumn+iTerm.m in Sources */,
A6C7630F1B45C52B00E3C992 /* iTermColorMap.m in Sources */,
A6C7630F1B45C52B00E3C992 /* iTermColorMap.mm in Sources */,
53AFFC931DD38F1500E6CEC6 /* ToolWebView.m in Sources */,
A6C763561B45C52B00E3C992 /* iTermOpenQuicklyTableView.m in Sources */,
A6936B4A1D2D756200521B04 /* iTermWindowOcclusionChangeMonitor.m in Sources */,
Loading
Loading
@@ -9013,11 +9282,11 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_WARN_INT_CONVERSION = YES;
CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_IDENTITY = "Developer ID Application: GEORGE NACHMAN (H7V7XYVQ7D)";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = YES;
DEVELOPMENT_TEAM = CMC4EL7UVS;
DEVELOPMENT_TEAM = "";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)",
Loading
Loading
@@ -9058,6 +9327,7 @@
"-laprutil-1",
"-licucore",
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.googlecode.iterm2;
PRODUCT_NAME = iTerm2;
Loading
Loading
@@ -9127,6 +9397,7 @@
"-laprutil-1",
"-licucore",
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.googlecode.iterm2.applescript;
PRODUCT_NAME = iTerm2ForApplescriptTesting;
Loading
Loading
@@ -9192,6 +9463,7 @@
"-laprutil-1",
"-licucore",
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.googlecode.iterm2.applescript;
PRODUCT_NAME = iTerm2ForApplescriptTesting;
Loading
Loading
@@ -9255,6 +9527,7 @@
"-laprutil-1",
"-licucore",
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.googlecode.iterm2.applescript;
PRODUCT_NAME = iTerm2ForApplescriptTesting;
Loading
Loading
@@ -9333,6 +9606,7 @@
"-laprutil-1",
"-licucore",
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.google.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
Loading
Loading
@@ -9400,6 +9674,7 @@
"-laprutil-1",
"-licucore",
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.google.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
Loading
Loading
@@ -9468,6 +9743,7 @@
"-laprutil-1",
"-licucore",
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.google.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
Loading
Loading
@@ -10673,12 +10949,12 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_WARN_INT_CONVERSION = YES;
CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_IDENTITY = "Developer ID Application: GEORGE NACHMAN (H7V7XYVQ7D)";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = CMC4EL7UVS;
DEVELOPMENT_TEAM = "";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)",
Loading
Loading
@@ -10723,6 +10999,7 @@
"-laprutil-1",
"-licucore",
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.googlecode.iterm2;
PRODUCT_NAME = iTerm2;
Loading
Loading
@@ -10748,11 +11025,11 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_WARN_INT_CONVERSION = YES;
CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_IDENTITY = "Developer ID Application: GEORGE NACHMAN (H7V7XYVQ7D)";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = YES;
DEVELOPMENT_TEAM = CMC4EL7UVS;
DEVELOPMENT_TEAM = "";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)",
Loading
Loading
@@ -10792,6 +11069,7 @@
"-laprutil-1",
"-licucore",
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.googlecode.iterm2;
PRODUCT_NAME = iTerm2;
Loading
Loading
@@ -63,6 +63,7 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
enableAddressSanitizer = "YES"
enableUBSanitizer = "YES"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
Loading
Loading
@@ -86,6 +87,11 @@
value = "YES"
isEnabled = "YES">
</AdditionalOption>
<AdditionalOption
key = "MallocScribble"
value = ""
isEnabled = "YES">
</AdditionalOption>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
Loading
Loading
Loading
Loading
@@ -15,6 +15,7 @@ typedef struct {
int count;
} CVector;
 
#if !__has_feature(objc_arc)
NS_INLINE void CVectorCreate(CVector *vector, int capacity) {
vector->capacity = capacity;
vector->elements = (void **)malloc(vector->capacity * sizeof(void *));
Loading
Loading
@@ -55,6 +56,7 @@ NS_INLINE id CVectorLastObject(const CVector *vector) {
}
return CVectorGet(vector, vector->count - 1);
}
#endif
 
// Hacky but fast templates in C.
//
Loading
Loading
#import "iTermMetalRenderer.h"
#import "VT100GridTypes.h"
NS_ASSUME_NONNULL_BEGIN
extern const CGFloat MARGIN_WIDTH;
extern const CGFloat TOP_MARGIN;
extern const CGFloat BOTTOM_MARGIN;
@class iTermMetalCellRendererTransientState;
@protocol iTermMetalCellRenderer<NSObject>
- (void)drawWithRenderEncoder:(id<MTLRenderCommandEncoder>)renderEncoder
transientState:(__kindof iTermMetalCellRendererTransientState *)transientState;
- (void)createTransientStateForViewportSize:(vector_uint2)viewportSize
cellSize:(CGSize)cellSize
gridSize:(VT100GridSize)gridSize
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
completion:(void (^)(__kindof iTermMetalCellRendererTransientState *transientState))completion;
@end
@interface iTermMetalCellRendererTransientState : iTermMetalRendererTransientState
@property (nonatomic, readonly) VT100GridSize gridSize;
@property (nonatomic, readonly) CGSize cellSize;
@property (nonatomic, readonly) id<MTLBuffer> offsetBuffer;
@property (nonatomic, strong) id<MTLBuffer> pius;
- (void)setPIUValue:(void *)c coord:(VT100GridCoord)coord;
- (const void *)piuForCoord:(VT100GridCoord)coord;
@end
@interface iTermMetalCellRenderer : iTermMetalRenderer<iTermMetalCellRenderer>
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device NS_UNAVAILABLE;
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device
vertexFunctionName:(NSString *)vertexFunctionName
fragmentFunctionName:(NSString *)fragmentFunctionName
blending:(BOOL)blending
transientStateClass:(Class)transientStateClass NS_UNAVAILABLE;
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device
vertexFunctionName:(NSString *)vertexFunctionName
fragmentFunctionName:(NSString *)fragmentFunctionName
blending:(BOOL)blending
piuElementSize:(size_t)piuElementSize
transientStateClass:(Class)transientStateClass NS_DESIGNATED_INITIALIZER;
- (void)createTransientStateForViewportSize:(vector_uint2)viewportSize
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
completion:(void (^)(__kindof iTermMetalRendererTransientState *transientState))completion NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END
#import "iTermMetalCellRenderer.h"
const CGFloat MARGIN_WIDTH = 10;
const CGFloat TOP_MARGIN = 2;
const CGFloat BOTTOM_MARGIN = 2;
NS_ASSUME_NONNULL_BEGIN
@interface iTermMetalCellRendererTransientState()
@property (nonatomic, readwrite) VT100GridSize gridSize;
@property (nonatomic, readwrite) CGSize cellSize;
@property (nonatomic, readwrite) id<MTLBuffer> offsetBuffer;
@property (nonatomic, readwrite) size_t piuElementSize;
@end
@implementation iTermMetalCellRendererTransientState
- (void)setPIUValue:(void *)valuePointer coord:(VT100GridCoord)coord {
const size_t index = coord.x + coord.y * self.gridSize.width;
memcpy(self.pius.contents + index * _piuElementSize, valuePointer, _piuElementSize);
}
- (const void *)piuForCoord:(VT100GridCoord)coord {
const size_t index = coord.x + coord.y * self.gridSize.width;
return self.pius.contents + index * _piuElementSize;
}
@end
@implementation iTermMetalCellRenderer {
Class _transientStateClass;
size_t _piuElementSize;
}
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device
vertexFunctionName:(NSString *)vertexFunctionName
fragmentFunctionName:(NSString *)fragmentFunctionName
blending:(BOOL)blending
piuElementSize:(size_t)piuElementSize
transientStateClass:(Class)transientStateClass {
self = [super initWithDevice:device
vertexFunctionName:vertexFunctionName
fragmentFunctionName:fragmentFunctionName
blending:blending
transientStateClass:transientStateClass];
if (self) {
_piuElementSize = piuElementSize;
_transientStateClass = transientStateClass;
}
return self;
}
- (Class)transientStateClass {
return _transientStateClass;
}
- (void)createTransientStateForViewportSize:(vector_uint2)viewportSize
cellSize:(CGSize)cellSize
gridSize:(VT100GridSize)gridSize
commandBuffer:(nonnull id<MTLCommandBuffer>)commandBuffer completion:(nonnull void (^)(__kindof iTermMetalCellRendererTransientState * _Nonnull))completion {
[super createTransientStateForViewportSize:viewportSize commandBuffer:commandBuffer completion:^(__kindof iTermMetalRendererTransientState * _Nonnull transientState) {
iTermMetalCellRendererTransientState *tState = transientState;
tState.piuElementSize = _piuElementSize;
tState.gridSize = gridSize;
tState.cellSize = cellSize;
CGSize usableSize = CGSizeMake(tState.viewportSize.x - MARGIN_WIDTH * 2,
tState.viewportSize.y - TOP_MARGIN - BOTTOM_MARGIN);
vector_float2 offset = {
MARGIN_WIDTH,
fmod(usableSize.height, tState.cellSize.height) + BOTTOM_MARGIN
};
tState.offsetBuffer = [self.device newBufferWithBytes:&offset
length:sizeof(offset)
options:MTLResourceStorageModeShared];
completion(tState);
}];
}
@end
NS_ASSUME_NONNULL_END
#import <Foundation/Foundation.h>
#import "iTermShaderTypes.h"
#import <MetalKit/MetalKit.h>
#import <simd/simd.h>
NS_ASSUME_NONNULL_BEGIN
@class iTermMetalRendererTransientState;
@protocol iTermMetalRenderer<NSObject>
- (void)drawWithRenderEncoder:(id<MTLRenderCommandEncoder>)renderEncoder
transientState:(__kindof iTermMetalRendererTransientState *)transientState;
- (void)createTransientStateForViewportSize:(vector_uint2)viewportSize
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
completion:(void (^)(__kindof iTermMetalRendererTransientState *transientState))completion;
@end
@interface iTermMetalRendererTransientState : NSObject
@property (nonatomic) vector_uint2 viewportSize;
@property (nonatomic, strong) id<MTLBuffer> vertexBuffer;
@property (nonatomic, readonly, strong) id<MTLRenderPipelineState> pipelineState;
@end
@interface iTermMetalRenderer : NSObject<iTermMetalRenderer>
@property (nonatomic, readonly) id<MTLDevice> device;
@property (nonatomic, readonly) Class transientStateClass;
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device;
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device
vertexFunctionName:(NSString *)vertexFunctionName
fragmentFunctionName:(NSString *)fragmentFunctionName
blending:(BOOL)blending
transientStateClass:(Class)transientStateClass;
- (instancetype)init NS_UNAVAILABLE;
#pragma mark - For subclasses
- (id<MTLBuffer>)newQuadOfSize:(CGSize)size;
- (void)drawWithTransientState:(iTermMetalRendererTransientState *)tState
renderEncoder:(id <MTLRenderCommandEncoder>)renderEncoder
numberOfVertices:(NSInteger)numberOfVertices
numberOfPIUs:(NSInteger)numberOfPIUs
vertexBuffers:(NSDictionary<NSNumber *, id<MTLBuffer>> *)vertexBuffers
fragmentBuffers:(NSDictionary<NSNumber *, id<MTLBuffer>> *)fragmentBuffers
textures:(NSDictionary<NSNumber *, id<MTLTexture>> *)textures;
- (id<MTLTexture>)textureFromImage:(NSImage *)image;
- (id<MTLRenderPipelineState>)newPipelineWithBlending:(BOOL)blending
vertexFunction:(id<MTLFunction>)vertexFunction
fragmentFunction:(id<MTLFunction>)fragmentFunction;
@end
NS_ASSUME_NONNULL_END
#import "iTermMetalRenderer.h"
#import "iTermShaderTypes.h"
@interface iTermMetalRendererTransientState()
@property (nonatomic, readwrite, strong) id<MTLRenderPipelineState> pipelineState;
@end
@implementation iTermMetalRendererTransientState
@end
@implementation iTermMetalRenderer {
BOOL _blending;
NSString *_vertexFunctionName;
NSString *_fragmentFunctionName;
}
- (instancetype)initWithDevice:(id<MTLDevice>)device {
self = [super init];
if (self) {
_device = device;
}
return self;
}
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device
vertexFunctionName:(NSString *)vertexFunctionName
fragmentFunctionName:(NSString *)fragmentFunctionName
blending:(BOOL)blending
transientStateClass:(Class)transientStateClass {
self = [super init];
if (self) {
_device = device;
_vertexFunctionName = [vertexFunctionName copy];
_fragmentFunctionName = [fragmentFunctionName copy];
_blending = blending;
_transientStateClass = transientStateClass;
}
return self;
}
- (id<MTLRenderPipelineState>)newPipelineState {
id<MTLLibrary> defaultLibrary = [_device newDefaultLibrary];
id <MTLFunction> textVertexShader = [defaultLibrary newFunctionWithName:_vertexFunctionName];
id <MTLFunction> textFragmentShader = [defaultLibrary newFunctionWithName:_fragmentFunctionName];
return [self newPipelineWithBlending:_blending
vertexFunction:textVertexShader
fragmentFunction:textFragmentShader];
}
#pragma mark - Protocol Methods
- (void)createTransientStateForViewportSize:(vector_uint2)viewportSize
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
completion:(void (^)(__kindof iTermMetalRendererTransientState * _Nonnull))completion {
iTermMetalRendererTransientState *tState = [[self.transientStateClass alloc] init];
tState.pipelineState = [self newPipelineState];
tState.viewportSize = viewportSize;
completion(tState);
}
- (void)drawWithRenderEncoder:(id<MTLRenderCommandEncoder>)renderEncoder
transientState:(NSDictionary *)transientState {
[self doesNotRecognizeSelector:_cmd];
}
#pragma mark - Utilities for subclasses
- (id<MTLBuffer>)newQuadOfSize:(CGSize)size {
const iTermVertex vertices[] = {
// Pixel Positions, Texture Coordinates
{ { size.width, 0 }, { 1.f, 0.f } },
{ { 0, 0 }, { 0.f, 0.f } },
{ { 0, size.height }, { 0.f, 1.f } },
{ { size.width, 0 }, { 1.f, 0.f } },
{ { 0, size.height }, { 0.f, 1.f } },
{ { size.width, size.height }, { 1.f, 1.f } },
};
return [_device newBufferWithBytes:vertices length:sizeof(vertices) options:MTLResourceStorageModeShared];
}
- (id<MTLRenderPipelineState>)newPipelineWithBlending:(BOOL)blending
vertexFunction:(id<MTLFunction>)vertexFunction
fragmentFunction:(id<MTLFunction>)fragmentFunction {
// Set up a descriptor for creating a pipeline state object
MTLRenderPipelineDescriptor *pipelineStateDescriptor = [[MTLRenderPipelineDescriptor alloc] init];
pipelineStateDescriptor.label = [NSString stringWithFormat:@"Pipeline for %@", NSStringFromClass([self class])];
pipelineStateDescriptor.vertexFunction = vertexFunction;
pipelineStateDescriptor.fragmentFunction = fragmentFunction;
pipelineStateDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm;
if (blending) {
MTLRenderPipelineColorAttachmentDescriptor *renderbufferAttachment = pipelineStateDescriptor.colorAttachments[0];
renderbufferAttachment.blendingEnabled = YES;
renderbufferAttachment.rgbBlendOperation = MTLBlendOperationAdd;
renderbufferAttachment.alphaBlendOperation = MTLBlendOperationAdd;
renderbufferAttachment.sourceRGBBlendFactor = MTLBlendFactorSourceAlpha;
renderbufferAttachment.destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
renderbufferAttachment.sourceAlphaBlendFactor = MTLBlendFactorSourceAlpha;
renderbufferAttachment.destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
}
NSError *error = NULL;
id<MTLRenderPipelineState> pipeline = [_device newRenderPipelineStateWithDescriptor:pipelineStateDescriptor
error:&error];
assert(pipeline);
return pipeline;
}
- (id<MTLTexture>)textureFromImage:(NSImage *)image {
if (!image)
return nil;
NSRect imageRect = NSMakeRect(0, 0, image.size.width, image.size.height);
CGImageRef imageRef = [image CGImageForProposedRect:&imageRect context:NULL hints:nil];
// Create a suitable bitmap context for extracting the bits of the image
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
if (width == 0 || height == 0)
return nil;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
uint8_t *rawData = (uint8_t *)calloc(height * width * 4, sizeof(uint8_t));
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef bitmapContext = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
// Flip the context so the positive Y axis points down
CGContextTranslateCTM(bitmapContext, 0, height);
CGContextScaleCTM(bitmapContext, 1, -1);
CGContextDrawImage(bitmapContext, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(bitmapContext);
MTLTextureDescriptor *textureDescriptor =
[MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm
width:width
height:height
mipmapped:NO];
id<MTLTexture> texture = [_device newTextureWithDescriptor:textureDescriptor];
MTLRegion region = MTLRegionMake2D(0, 0, width, height);
[texture replaceRegion:region mipmapLevel:0 withBytes:rawData bytesPerRow:bytesPerRow];
free(rawData);
return texture;
}
- (void)drawWithTransientState:(iTermMetalRendererTransientState *)tState
renderEncoder:(id <MTLRenderCommandEncoder>)renderEncoder
numberOfVertices:(NSInteger)numberOfVertices
numberOfPIUs:(NSInteger)numberOfPIUs
vertexBuffers:(NSDictionary<NSNumber *, id<MTLBuffer>> *)vertexBuffers
fragmentBuffers:(NSDictionary<NSNumber *, id<MTLBuffer>> *)fragmentBuffers
textures:(NSDictionary<NSNumber *, id<MTLTexture>> *)textures {
[renderEncoder setRenderPipelineState:tState.pipelineState];
[vertexBuffers enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull key, id<MTLBuffer> _Nonnull obj, BOOL * _Nonnull stop) {
[renderEncoder setVertexBuffer:obj
offset:0
atIndex:[key unsignedIntegerValue]];
}];
[fragmentBuffers enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull key, id<MTLBuffer> _Nonnull obj, BOOL * _Nonnull stop) {
[renderEncoder setFragmentBuffer:obj
offset:0
atIndex:[key unsignedIntegerValue]];
}];
const vector_uint2 viewportSize = tState.viewportSize;
[renderEncoder setVertexBytes:&viewportSize
length:sizeof(viewportSize)
atIndex:iTermVertexInputIndexViewportSize];
[textures enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull key, id<MTLTexture> _Nonnull obj, BOOL * _Nonnull stop) {
[renderEncoder setFragmentTexture:obj atIndex:[key unsignedIntegerValue]];
}];
if (numberOfPIUs > 0) {
[renderEncoder drawPrimitives:MTLPrimitiveTypeTriangle
vertexStart:0
vertexCount:numberOfVertices
instanceCount:numberOfPIUs];
} else {
[renderEncoder drawPrimitives:MTLPrimitiveTypeTriangle
vertexStart:0
vertexCount:numberOfVertices];
}
}
@end
//
// iTermMetalRowData.h
// iTerm2SharedARC
//
// Created by George Nachman on 10/27/17.
//
#import <Foundation/Foundation.h>
@interface iTermMetalRowData : NSObject
@property (nonatomic) int y;
@property (nonatomic, strong) NSMutableData *keysData;
@property (nonatomic, strong) NSMutableData *attributesData;
@property (nonatomic, strong) NSMutableData *backgroundColorData;
@end
//
// iTermMetalRowData.m
// iTerm2SharedARC
//
// Created by George Nachman on 10/27/17.
//
#import "iTermMetalRowData.h"
@implementation iTermMetalRowData
@end
//
// iTermSubpixelModelBuilder.h
// subpixel
//
// Created by George Nachman on 10/16/17.
// Copyright © 2017 George Nachman. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <simd/simd.h>
@interface iTermSubpixelModel : NSObject
// The table contains 256 RGBA values that map a reference value to a color value in this model.
// The gray value is a pixel in a non-subpixel-antialiased rendering, while the color value is
// the corresponding color in a subpixel-antialiased glyph in this model. Each combination of
// foreground and background color should have a separate model. Ignore the A, it's always 0.
// Each value is an unsigned short (2 bytes)
@property (nonatomic, readonly) NSData *table;
@property (nonatomic, readonly) vector_float4 foregroundColor;
@property (nonatomic, readonly) vector_float4 backgroundColor;
+ (NSUInteger)keyForForegroundColor:(vector_float4)foregroundColor
backgroundColor:(vector_float4)backgroundColor;
- (NSUInteger)key;
- (NSString *)dump;
@end
// Builds and keeps a cache of built models that map colors in a black-on-white reference glyph
// to the colors used in a glyph with an arbitrary foreground and background color. Thanks to this
// mapping, we only need black-on-white textures with subpixel antialiasing and the GPU can color
// them in the fragment shader. A color map is 768 bytes which is less memory than a single
// 5x12 pt retina glyph.
//
// Example usage:
// iTermSubpixelModel *model = [builder modelForForegroundColor:f backgroundColor:b];
// NSData *glyphBGRAData = [self drawGlyphForString:s];
//
// In practice, glyphBGRAData would be saved in a texture and the following code would run on the
// GPU, but it's presented as objective C for readability:
//
// for (int i = 0; i < glyphBGRAData.length; i += 4) {
// glyphBGRAData.bytes[i] = model.redTable.bytes[glyphBGRAData.bytes[i]];
// glyphBGRAData.bytes[i+1] = model.greenTable.bytes[glyphBGRAData.bytes[i+1]];
// glyphBGRAData.bytes[i+2] = model.blueTable.bytes[glyphBGRAData.bytes[i+2]];
// }
@interface iTermSubpixelModelBuilder : NSObject
+ (instancetype)sharedInstance;
- (iTermSubpixelModel *)modelForForegoundColor:(vector_float4)foregroundColor
backgroundColor:(vector_float4)backgroundColor;
@end
//
// iTermSubpixelModelBuilder.m
// subpixel
//
// Created by George Nachman on 10/16/17.
// Copyright © 2017 George Nachman. All rights reserved.
//
#import "iTermSubpixelModelBuilder.h"
extern "C" {
#import "DebugLogging.h"
}
#import <Cocoa/Cocoa.h>
#include <map>
#include <unordered_map>
#include <unordered_set>
static const CGSize iTermSubpixelModelSize = { 80, 80 };
static NSString *const iTermSubpixelModelString = @"O";
@interface iTermSubpixelModel()
@property (nonatomic, readonly) NSMutableData *mutableTable;
@end
@implementation iTermSubpixelModel {
NSMutableData *_table;
}
+ (NSUInteger)keyForColor:(vector_float4)color {
const NSUInteger r = color.x * 255;
const NSUInteger g = color.y * 255;
const NSUInteger b = color.z * 255;
return (r << 24) | (g << 16) | (b << 8);
}
+ (NSUInteger)keyForForegroundColor:(vector_float4)foregroundColor
backgroundColor:(vector_float4)backgroundColor {
return ([self keyForColor:foregroundColor] << 32) | [self keyForColor:backgroundColor];
}
- (instancetype)initWithForegroundColor:(vector_float4)foregroundColor
backgroundColor:(vector_float4)backgroundColor {
if (self) {
_table = [NSMutableData dataWithLength:3 * 256 * sizeof(unsigned char)];
_foregroundColor = foregroundColor;
_backgroundColor = backgroundColor;
}
return self;
}
- (NSString *)description {
return [NSString stringWithFormat:@"<%@: %p fg=(%f, %f, %f) bg=(%f, %f, %f)>",
NSStringFromClass(self.class), self,
_foregroundColor.x,
_foregroundColor.y,
_foregroundColor.z,
_backgroundColor.x,
_backgroundColor.y,
_backgroundColor.z];
}
- (NSUInteger)key {
return [iTermSubpixelModel keyForForegroundColor:_foregroundColor
backgroundColor:_backgroundColor];
}
- (NSString *)dump {
NSMutableArray *array = [NSMutableArray array];
const unsigned char *bytes = (const unsigned char *)_table.bytes;
for (int i = 0; i < 256 * 3; i += 3) {
NSString *s = [NSString stringWithFormat:@"%@ -> (%@, %@, %@)", @(i / 3), @(bytes[i]), @(bytes[i+1]), @(bytes[i+2])];
[array addObject:s];
}
return [array componentsJoinedByString:@"\n"];
}
- (NSMutableData *)mutableTable {
return _table;
}
@end
@implementation iTermSubpixelModelBuilder {
// Maps the index of a color in the reference image to the color in the reference image.
// An index is 4 * (x + width * y).
// A color is ((r << 16) | (g << 8) | b).
std::unordered_map<int, int> *_indexToReferenceColor;
NSMutableDictionary<NSNumber *, iTermSubpixelModel *> *_models;
}
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
static id instance;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
+ (NSData *)dataForImageWithForegroundColor:(vector_float4)foregroundColor
backgroundColor:(vector_float4)backgroundColor {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate(NULL,
iTermSubpixelModelSize.width,
iTermSubpixelModelSize.height,
8,
iTermSubpixelModelSize.width * 4,
colorSpace,
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host);
CGColorSpaceRelease(colorSpace);
CGContextSetRGBFillColor(ctx, backgroundColor.x, backgroundColor.y, backgroundColor.z, backgroundColor.w);
CGContextFillRect(ctx, CGRectMake(0, 0, iTermSubpixelModelSize.width, iTermSubpixelModelSize.height));
NSFont *font = [NSFont fontWithName:@"Monaco" size:12];
CGFloat foreground[4] = { foregroundColor.x, foregroundColor.y, foregroundColor.z, foregroundColor.w };
[self drawString:iTermSubpixelModelString
font:font
size:iTermSubpixelModelSize
components:foreground
context:ctx];
NSData *data = [NSData dataWithBytes:CGBitmapContextGetData(ctx)
length:iTermSubpixelModelSize.width * iTermSubpixelModelSize.height * 4];
CGContextRelease(ctx);
return data;
}
+ (void)drawString:(NSString *)string
font:(NSFont *)font
size:(CGSize)size
components:(CGFloat *)components
context:(CGContextRef)ctx {
CGGlyph glyphs[string.length];
const NSUInteger numCodes = string.length;
unichar characters[numCodes];
[string getCharacters:characters];
BOOL ok = CTFontGetGlyphsForCharacters((CTFontRef)font,
characters,
glyphs,
numCodes);
assert(ok);
size_t length = numCodes;
// Note: this is slow. It was faster than core text when I did it rarely, but I'm not sure if
// it's still faster to use the deprecated CG API now.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
CGContextSelectFont(ctx,
[[font fontName] UTF8String],
[font pointSize],
kCGEncodingMacRoman);
#pragma clang diagnostic pop
// TODO: could use extended srgb on macOS 10.12+
CGContextSetFillColorSpace(ctx, CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
CGContextSetFillColor(ctx, components);
CGContextSetAllowsFontSubpixelQuantization(ctx, YES);
CGContextSetShouldSubpixelQuantizeFonts(ctx, YES);
CGContextSetAllowsFontSubpixelPositioning(ctx, YES);
CGContextSetShouldSubpixelPositionFonts(ctx, YES);
CGContextSetShouldSmoothFonts(ctx, YES);
CGContextSetTextDrawingMode(ctx, kCGTextFill);
// A hack to make the glyph fill the provided space
const CGFloat scale = size.height / 11;
double y = -(-(floorf(font.leading) - floorf(font.descender + 0.5)));
// Flip vertically and translate to (x, y).
CGContextSetTextMatrix(ctx, CGAffineTransformMake(scale, 0.0,
0, scale,
0, y));
CGContextSetAllowsAntialiasing(ctx, YES);
CGContextSetShouldAntialias(ctx, YES);
CGPoint points[length];
for (int i = 0; i < length; i++) {
points[i].x = 0;
points[i].y = 0;
}
CGContextShowGlyphsAtPositions(ctx, glyphs, points, length);
}
- (instancetype)init {
self = [super init];
if (self) {
_models = [NSMutableDictionary dictionary];
_indexToReferenceColor = new std::unordered_map<int, int>();
NSData *referenceImageData = [iTermSubpixelModelBuilder dataForImageWithForegroundColor:vector4(0.0f, 0.0f, 0.0f, 1.0f)
backgroundColor:vector4(1.0f, 1.0f, 1.0f, 1.0f)];
std::unordered_set<int> referenceColors;
const unsigned char *bytes = (const unsigned char *)referenceImageData.bytes;
int i = 0;
for (int y = 0; y < iTermSubpixelModelSize.height; y++) {
for (int x = 0; x < iTermSubpixelModelSize.width; x++) {
const int b = bytes[i];
const int g = bytes[i + 1];
const int r = bytes[i + 2];
const int c = ((b << 16) | (g << 8) | r);
if (referenceColors.insert(c).second) {
// The color `c` has not been seen before. Remember it and its index.
(*_indexToReferenceColor)[i] = c;
}
i += 4;
}
}
}
return self;
}
- (iTermSubpixelModel *)modelForForegoundColor:(vector_float4)foregroundColor
backgroundColor:(vector_float4)backgroundColor {
NSUInteger key = [iTermSubpixelModel keyForForegroundColor:foregroundColor
backgroundColor:backgroundColor];
iTermSubpixelModel *cachedModel = _models[@(key)];
if (cachedModel) {
return cachedModel;
}
assert(backgroundColor.w == 1);
NSData *imageData = [iTermSubpixelModelBuilder dataForImageWithForegroundColor:foregroundColor
backgroundColor:backgroundColor];
// Maps a reference color to a model color. We'll go back and fill in the gaps with linear
// interpolations, which is why we use a sorted container. When translating a black-on-white
// render to a color render, these mapping tables let us look up the proper color for a black
// on white sample.
std::map<unsigned char, unsigned char> redMap;
std::map<unsigned char, unsigned char> greenMap;
std::map<unsigned char, unsigned char> blueMap;
const unsigned char *bytes = (const unsigned char *)imageData.bytes;
for (auto kv : *_indexToReferenceColor) {
auto index = kv.first;
auto color = kv.second;
const unsigned char refRed = (color & 0xff);
const unsigned char refGreen = ((color >> 8) & 0xff);
const unsigned char refBlue = ((color >> 16) & 0xff);
const unsigned char modelRed = bytes[index + 2];
const unsigned char modelGreen = bytes[index + 1];
const unsigned char modelBlue = bytes[index];
redMap[refRed] = modelRed;
greenMap[refGreen] = modelGreen;
blueMap[refBlue] = modelBlue;
}
iTermSubpixelModel *model = [[iTermSubpixelModel alloc] initWithForegroundColor:foregroundColor
backgroundColor:backgroundColor];
DLog(@"Interpolate red values");
[self interpolateValuesInMap:&redMap toByteArrayInData:model.mutableTable offset:0 stride:3];
DLog(@"Interpolate green values");
[self interpolateValuesInMap:&greenMap toByteArrayInData:model.mutableTable offset:1 stride:3];
DLog(@"Interpolate blue values");
[self interpolateValuesInMap:&blueMap toByteArrayInData:model.mutableTable offset:2 stride:3];
_models[@(key)] = model;
return model;
}
- (void)dealloc {
delete _indexToReferenceColor;
}
namespace iTerm2 {
void Backfill(double slope, int previousReferenceColor, double value, size_t stride, unsigned char *output) {
// Backfill from this value to a reference color of 0
double backfillSlope = -slope;
if (value + backfillSlope * previousReferenceColor < 0) {
backfillSlope = previousReferenceColor / -value;
}
double backfillValue = value;
DLog(@"Backfill [0, %d] with values [%f, %f]", previousReferenceColor, MAX(0, backfillValue + backfillSlope * previousReferenceColor), backfillValue);
for (int i = previousReferenceColor; i >= 0; i--) {
output[i * stride] = MAX(0, round(backfillValue));
backfillValue += backfillSlope;
}
}
void Fill(double slope, double value, int previousReferenceColor, int referenceColor, size_t stride, unsigned char *output) {
// Fill between this color and the previous reference color
DLog(@"Fill range [%d, %d] with values [%f, %f]", previousReferenceColor, referenceColor, value, value + slope * (referenceColor - previousReferenceColor));
for (int i = previousReferenceColor; i <= referenceColor; i++) {
output[i * stride] = value;
value += slope;
}
}
}
- (void)interpolateValuesInMap:(std::map<unsigned char, unsigned char> *)modelToReferenceMap
toByteArrayInData:(NSMutableData *)destinationData
offset:(size_t)offset
stride:(size_t)stride {
int previousModelColor = -1;
int previousReferenceColor = -1;
BOOL first = YES;
double slope = 0;
unsigned char *output = (unsigned char *)destinationData.mutableBytes;
output += offset;
for (auto kv : *modelToReferenceMap) {
const int referenceColor = kv.first;
const int modelColor = kv.second;
DLog(@"Reference color %d -> model color %d", referenceColor, modelColor);
if (previousModelColor >= 0) {
slope = static_cast<double>(modelColor - previousModelColor) / static_cast<double>(referenceColor - previousReferenceColor);
double value = previousModelColor;
if (first) {
iTerm2::Backfill(slope, previousReferenceColor, modelColor, stride, output);
first = NO;
}
iTerm2::Fill(slope, value, previousReferenceColor, referenceColor, stride, output);
}
previousModelColor = modelColor;
previousReferenceColor = referenceColor;
}
// Fill forward from the last reference color to the end
const double value = previousModelColor;
const int distanceLeft = (255 - previousReferenceColor);
if (value + slope * distanceLeft > 255) {
slope = (255 - value) / distanceLeft;
}
iTerm2::Fill(slope, value, previousReferenceColor, 255, stride, output);
}
@end
#import <Metal/Metal.h>
@interface iTermTextureArray : NSObject
@property (nonatomic, readonly) id <MTLTexture> texture;
@property (nonatomic, readonly) uint32_t width;
@property (nonatomic, readonly) uint32_t height;
@property (nonatomic, readonly) NSUInteger count;
@property (nonatomic, readonly) CGSize atlasSize;
- (instancetype)initWithTextureWidth:(uint32_t)width
textureHeight:(uint32_t)height
arrayLength:(NSUInteger)length
device:(id <MTLDevice>)device;
- (BOOL)addSliceWithContentsOfFile:(NSString *)path;
- (void)addSliceWithImage:(NSImage *)image;
- (BOOL)setSlice:(NSUInteger)slice withImage:(NSImage *)nsimage;
- (void)copyTextureAtIndex:(NSInteger)index
toArray:(iTermTextureArray *)destination
index:(NSInteger)destinationIndex
blitter:(id<MTLBlitCommandEncoder>)blitter;
- (MTLOrigin)offsetForIndex:(NSInteger)index;
@end
#import <AppKit/AppKit.h>
#import "iTermTextureArray.h"
#import <CoreImage/CoreImage.h>
@implementation iTermTextureArray {
uint32_t _width;
uint32_t _height;
NSUInteger _count;
NSInteger _cellsPerRow;
}
- (instancetype)initWithTextureWidth:(uint32_t)width
textureHeight:(uint32_t)height
arrayLength:(NSUInteger)length
device:(id <MTLDevice>)device {
self = [super init];
if (self) {
_width = width;
_height = height;
_cellsPerRow = MAX(1, ceil(sqrt(length)));
MTLTextureDescriptor *textureDescriptor = [[MTLTextureDescriptor alloc] init];
textureDescriptor.textureType = MTLTextureType2D;
textureDescriptor.pixelFormat = MTLPixelFormatRGBA8Unorm;
textureDescriptor.width = _width * _cellsPerRow;
textureDescriptor.height = _height * ceil((double)length / (double)_cellsPerRow);
textureDescriptor.arrayLength = 1;
_atlasSize = CGSizeMake(textureDescriptor.width, textureDescriptor.height);
_texture = [device newTextureWithDescriptor:textureDescriptor];
}
return self;
}
- (void)dealloc {
_texture = nil;
}
#pragma mark - APIs
- (BOOL)addSliceWithContentsOfFile:(NSString *)path {
return [self setSlice:_count++ withContentsOfFile:path];
}
- (void)addSliceWithImage:(NSImage *)image {
[self setSlice:_count++ withImage:image];
}
- (void)copyTextureAtIndex:(NSInteger)index
toArray:(iTermTextureArray *)destination
index:(NSInteger)destinationIndex
blitter:(id<MTLBlitCommandEncoder>)blitter {
[blitter copyFromTexture:_texture
sourceSlice:0
sourceLevel:0
sourceOrigin:[self offsetForIndex:index]
sourceSize:MTLSizeMake(_width, _height, 1)
toTexture:destination.texture
destinationSlice:0
destinationLevel:0
destinationOrigin:[destination offsetForIndex:destinationIndex]];
}
- (MTLOrigin)offsetForIndex:(NSInteger)index {
return MTLOriginMake(_width * (index % _cellsPerRow),
_height * (index / _cellsPerRow),
0);
}
#pragma mark - Private
- (BOOL)setSlice:(NSUInteger)slice withContentsOfFile:(NSString *)path {
return [self setSlice:slice withImage:[[NSImage alloc] initWithContentsOfFile:path]];
}
- (BOOL)setSlice:(NSUInteger)slice withImage:(NSImage *)nsimage {
NSBitmapImageRep *bitmapRepresentation = [[NSBitmapImageRep alloc] initWithData:[nsimage TIFFRepresentation]];
if (!bitmapRepresentation) {
return NO;
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
if (!colorSpace) {
return NO;
}
uint32_t width = _width;
uint32_t height = _height;
uint32_t rowBytes = width * 4;
CGContextRef context = CGBitmapContextCreate(NULL,
width,
height,
8,
rowBytes,
colorSpace,
kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
if (!context) {
return NO;
}
CGRect bounds = CGRectMake(0, 0, width, height);
CGContextClearRect(context, bounds);
CGContextTranslateCTM(context, 0, height);
CGContextScaleCTM(context, 1, -1.0);
CGContextDrawImage(context, bounds, bitmapRepresentation.CGImage);
const void *bytes = CGBitmapContextGetData(context);
if (bytes) {
MTLOrigin origin = [self offsetForIndex:slice];
MTLRegion region = MTLRegionMake2D(origin.x, origin.y, _width, _height);
[_texture replaceRegion:region
mipmapLevel:0
slice:0
withBytes:bytes
bytesPerRow:rowBytes
bytesPerImage:rowBytes*height];
}
CGContextRelease(context);
return YES;
}
@end
#import <Foundation/Foundation.h>
#import <Metal/Metal.h>
#import "iTermMetalGlyphKey.h"
// Usage:
// iTermTextureMap *textureMap = [[iTermTextureMap alloc] initWithDevice:device cellSize:cellSize capacity:capacity]
// [textureMap requestStage:^(iTermTextureMapStage *stage) {
// id<MTLCommandQueue> commandQueue = ...
// foreach key, column:
// NSInteger index = [stage findOrAllocateIndexOfLockedTextureWithKey:key column:column creation:creation];
// pius[i++].textureIndex = index;
// [stage blitNewTexturesFromStagingAreaWithCommandQueue:commandQueue];
//
// ... finish enqueueing more GPU work with commandQueue ...
//
// [commandBuffer addCompletedHandler:^() {
// [textureMap returnStage:stage];
// }];
// [commandBuffer commit];
// }];
@class iTermTextureArray;
@class iTermTextureMapStage;
@interface iTermTextureMap : NSObject
// Given in number of cells
@property (nonatomic, readonly) NSInteger capacity;
@property (nonatomic, readonly) iTermTextureArray *array;
@property (nonatomic, copy) NSString *label;
@property (nonatomic, readonly) CGSize cellSize;
@property (nonatomic, readonly) BOOL haveStageAvailable;
- (instancetype)initWithDevice:(id<MTLDevice>)device
cellSize:(CGSize)cellSize
capacity:(NSInteger)capacity NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
- (void)requestStage:(void (^)(iTermTextureMapStage *stage))completion;
- (void)returnStage:(iTermTextureMapStage *)stage;
@end
@interface iTermTextureMapStage : NSObject
@property (nonatomic, readonly) iTermTextureArray *stageArray;
- (instancetype)init NS_UNAVAILABLE;
- (NSInteger)findOrAllocateIndexOfLockedTextureWithKey:(const iTermMetalGlyphKey *)key
column:(int)column
creation:(NSImage *(^)(int))creation;
- (void)blitNewTexturesFromStagingAreaWithCommandBuffer:(id<MTLCommandBuffer>)commandBuffer;
@end
#import "iTermTextureMap.h"
#import "iTermTextureArray.h"
#import "iTermMetalGlyphKey.h"
#define DLog(format, ...)
#include <list>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
static const NSInteger iTermTextureMapNumberOfStages = 2;
/*
Copyright (c) 2014, lamerman
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of lamerman nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#warning TODO: Add this to the documentation
// https://github.com/lamerman/cpp-lru-cache
namespace cache {
template<typename key_t, typename value_t>
class lru_cache {
public:
typedef typename std::pair<key_t, value_t> key_value_pair_t;
typedef typename std::list<key_value_pair_t>::iterator list_iterator_t;
lru_cache(size_t max_size) :
_max_size(max_size) {
}
inline void put(const key_t& key, const value_t& value) {
auto it = _cache_items_map.find(key);
_cache_items_list.push_front(key_value_pair_t(key, value));
if (it != _cache_items_map.end()) {
_cache_items_list.erase(it->second);
_cache_items_map.erase(it);
}
_cache_items_map[key] = _cache_items_list.begin();
if (_cache_items_map.size() > _max_size) {
auto last = _cache_items_list.end();
last--;
_cache_items_map.erase(last->first);
_cache_items_list.pop_back();
}
}
inline const value_t *get(const key_t& key) {
auto it = _cache_items_map.find(key);
if (it == _cache_items_map.end()) {
return nullptr;
} else {
_cache_items_list.splice(_cache_items_list.begin(), _cache_items_list, it->second);
return &it->second->second;
}
}
inline const value_t *peek(const key_t& key) {
auto it = _cache_items_map.find(key);
if (it == _cache_items_map.end()) {
return nullptr;
} else {
return &it->second->second;
}
}
inline void erase(const key_t &key) {
auto it = _cache_items_map.find(key);
if (it != _cache_items_map.end()) {
_cache_items_list.erase(it->second);
_cache_items_map.erase(it);
}
}
inline bool exists(const key_t& key) const {
return _cache_items_map.find(key) != _cache_items_map.end();
}
inline size_t size() const {
return _cache_items_map.size();
}
private:
std::list<key_value_pair_t> _cache_items_list;
std::unordered_map<key_t, list_iterator_t> _cache_items_map;
size_t _max_size;
};
} // namespace cache
namespace iTerm2 {
template <class T>
inline void hash_combine(std::size_t& seed, const T& v) {
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
class GlyphKey {
private:
iTermMetalGlyphKey _repr;
GlyphKey();
public:
explicit GlyphKey(const iTermMetalGlyphKey *repr) : _repr(*repr) { }
// Copy constructor
GlyphKey(const GlyphKey &other) {
_repr = other._repr;
}
inline bool operator==(const GlyphKey &other) const {
return (_repr.code == other._repr.code &&
_repr.isComplex == other._repr.isComplex &&
_repr.image == other._repr.image &&
_repr.boxDrawing == other._repr.boxDrawing &&
_repr.thinStrokes == other._repr.thinStrokes);
}
inline std::size_t get_hash() const {
std::size_t seed = 0;
hash_combine(seed, _repr.code);
hash_combine(seed, _repr.isComplex);
hash_combine(seed, _repr.image);
hash_combine(seed, _repr.boxDrawing);
hash_combine(seed, _repr.thinStrokes);
hash_combine(seed, _repr.thinStrokes);
return seed;
}
};
}
namespace std {
template <>
struct hash<iTerm2::GlyphKey> {
std::size_t operator()(const iTerm2::GlyphKey& glyphKey) const {
return glyphKey.get_hash();
}
};
}
namespace iTerm2 {
class TextureMapStage {
private:
// Maps stage indexes that need blitting to their destination indices.
std::unordered_map<int, int> _indexesToBlit;
// Glyph keys accessed this frame. Stored so we don't waste time promoting more than once
// in the LRU cache.
std::unordered_set<iTerm2::GlyphKey> _usedThisFrame;
// Held locks
std::vector<int> _lockedIndexes;
int _nextStageIndex;
public:
int will_blit(const int index) {
const int stageIndex = _nextStageIndex++;
_indexesToBlit[stageIndex] = index;
return stageIndex;
}
const bool have_indexes_to_blit() const {
return !_indexesToBlit.empty();
}
void blit(iTermTextureArray *source, iTermTextureArray *destination, id <MTLBlitCommandEncoder> blitter) {
for (auto it = _indexesToBlit.begin(); it != _indexesToBlit.end(); it++) {
[source copyTextureAtIndex:it->first
toArray:destination
index:it->second
blitter:blitter];
}
_indexesToBlit.clear();
_nextStageIndex = 0;
}
void unlock_all(std::vector<int> *locks) {
for (auto it = _lockedIndexes.begin(); it != _lockedIndexes.end(); it++) {
(*locks)[*it]--;
}
_lockedIndexes.clear();
}
// Looks up the key in the LRU, promoting it only if it hasn't been used before this frame.
const int *lookup(const GlyphKey &key, cache::lru_cache<GlyphKey, int> *lru) {
const int *valuePtr;
if (_usedThisFrame.find(key) != _usedThisFrame.end()) {
// key was already used this frame. Don't promote it in the LRU.
valuePtr = lru->peek(key);
} else {
// first use of key this frame. Promote it and record its use.
const int *value = lru->get(key);
_usedThisFrame.insert(key);
valuePtr = value;
}
if (valuePtr) {
_lockedIndexes.push_back(*valuePtr);
}
return valuePtr;
}
};
class TextureMap {
private:
// map lru entries
// a -> 0 0 a
// b -> 1 2 b
// c -> 2 1 c
// Maps a character description to its index in a texture sprite sheet.
cache::lru_cache<GlyphKey, int> _lru;
// Tracks which glyph key is at which index.
std::vector<GlyphKey *> _entries;
// Maps an index to the lock count. Values > 0 are locked.
std::vector<int> _locks;
// Maximum number of entries.
const int _capacity;
public:
explicit TextureMap(const int capacity) : _lru(capacity), _locks(capacity), _capacity(capacity) { }
inline int get_index(const GlyphKey &key, TextureMapStage *textureMapStage) {
const int *value;
value = textureMapStage->lookup(key, &_lru);
if (value == nullptr) {
return -1;
} else {
const int index = *value;
_locks[index]++;
return index;
}
}
inline std::pair<int, int> allocate_index(const GlyphKey &key, TextureMapStage *stage) {
const int index = _lru.size() + 1;
_locks[index]++;
assert(index <= _capacity);
_lru.put(key, index);
const int stageIndex = stage->will_blit(index);
return std::make_pair(stageIndex, index);
}
void unlock_stage(TextureMapStage *stage) {
stage->unlock_all(&_locks);
}
};
}
@interface iTermTextureMapStage()
- (instancetype)initWithTextureMap:(iTermTextureMap *)textureMap
stageArray:(iTermTextureArray *)stageArray NS_DESIGNATED_INITIALIZER;
- (void)startNewFrame;
- (iTerm2::TextureMapStage *)textureMapStage;
@end
@implementation iTermTextureMap {
iTerm2::TextureMap *_textureMap;
NSMutableArray<iTermTextureMapStage *> *_stages;
NSMutableArray<void (^)(iTermTextureMapStage *)> *_completionBlocks;
}
- (instancetype)initWithDevice:(id<MTLDevice>)device
cellSize:(CGSize)cellSize
capacity:(NSInteger)capacity {
self = [super init];
if (self) {
_capacity = capacity;
_cellSize = cellSize;
_completionBlocks = [NSMutableArray array];
_array = [[iTermTextureArray alloc] initWithTextureWidth:cellSize.width
textureHeight:cellSize.height
arrayLength:_capacity
device:device];
_textureMap = new iTerm2::TextureMap(capacity);
_stages = [NSMutableArray array];
for (NSInteger i = 0; i < iTermTextureMapNumberOfStages; i++) {
[_stages addObject:[[iTermTextureMapStage alloc] initWithTextureMap:self
stageArray:[self newTextureArrayForStageWithDevice:device]]];
}
}
return self;
}
- (void)dealloc {
delete _textureMap;
}
- (BOOL)haveStageAvailable {
@synchronized(self) {
return _stages.count > 0;
}
}
- (void)requestStage:(void (^)(iTermTextureMapStage *stage))completion {
iTermTextureMapStage *stage = nil;
@synchronized(self) {
stage = [self nextStage];
}
if (stage) {
completion(stage);
} else {
[_completionBlocks addObject:[completion copy]];
}
}
- (iTermTextureMapStage *)nextStage {
iTermTextureMapStage *stage = _stages.lastObject;
[_stages removeLastObject];
[stage startNewFrame];
return stage;
}
- (void)unlockIndexesFromStage:(iTerm2::TextureMapStage *)textureMapStage {
_textureMap->unlock_stage(textureMapStage);
}
- (void)returnStage:(iTermTextureMapStage *)stage {
[self unlockIndexesFromStage:stage.textureMapStage];
[_stages insertObject:stage atIndex:0];
if (_completionBlocks.count) {
void (^block)(iTermTextureMapStage *) = _completionBlocks.firstObject;
[_completionBlocks removeObjectAtIndex:0];
block([self nextStage]);
}
}
- (iTermTextureArray *)newTextureArrayForStageWithDevice:(id<MTLDevice>)device {
return [[iTermTextureArray alloc] initWithTextureWidth:_cellSize.width
textureHeight:_cellSize.height
arrayLength:_capacity / 2
device:device];
}
- (NSInteger)findOrAllocateIndexOfLockedTextureWithKey:(const iTermMetalGlyphKey *)key
column:(int)column
textureMapStage:(iTerm2::TextureMapStage *)textureMapStage
stageArray:(iTermTextureArray *)stageArray
creation:(NSImage *(^)(int))creation {
const iTerm2::GlyphKey glyphKey(key);
int index = _textureMap->get_index(glyphKey, textureMapStage);
if (index >= 0) {
DLog(@"%@: locked existing texture %@", self.label, @(index));
return index;
} else {
NSImage *image = creation(column);
if (image != nil) {
auto stageAndGlobalIndex = _textureMap->allocate_index(glyphKey, textureMapStage);
DLog(@"%@: create and stage new texture %@", self.label, @(index));
DLog(@"Stage %@ at %@", key, @(index));
[stageArray setSlice:stageAndGlobalIndex.first withImage:image];
return stageAndGlobalIndex.second;
} else {
return -1;
}
}
}
- (void)doNoOpBlitWithStage:(iTermTextureArray *)stageArray
commandQueue:(id<MTLCommandQueue>)commandQueue {
id <MTLCommandBuffer> commandBuffer = [commandQueue commandBuffer];
commandBuffer.label = @"Blit from stage";
id <MTLBlitCommandEncoder> blitter = [commandBuffer blitCommandEncoder];
[stageArray copyTextureAtIndex:0
toArray:_array
index:0
blitter:blitter];
[blitter endEncoding];
[commandBuffer commit];
}
- (void)blitFromStage:(iTerm2::TextureMapStage *)textureMapStage
array:(iTermTextureArray *)stageArray
commandBuffer:(id<MTLCommandBuffer>)commandBuffer {
id<MTLBlitCommandEncoder> blitter = [commandBuffer blitCommandEncoder];
textureMapStage->blit(stageArray, _array, blitter);
[blitter endEncoding];
}
@end
@implementation iTermTextureMapStage {
__weak iTermTextureMap *_textureMap;
iTerm2::TextureMapStage *_textureMapStage;
}
- (instancetype)initWithTextureMap:(iTermTextureMap *)textureMap stageArray:(iTermTextureArray *)stageArray {
self = [super init];
if (self) {
stageArray.texture.label = @"Stage";
_textureMap = textureMap;
_stageArray = stageArray;
}
return self;
}
- (void)dealloc {
if (_textureMapStage) {
delete _textureMapStage;
}
}
- (void)startNewFrame {
if (_textureMapStage) {
delete _textureMapStage;
}
_textureMapStage = new iTerm2::TextureMapStage();
}
- (NSInteger)findOrAllocateIndexOfLockedTextureWithKey:(const iTermMetalGlyphKey *)key
column:(int)column
creation:(NSImage *(^)(int))creation {
return [_textureMap findOrAllocateIndexOfLockedTextureWithKey:key
column:column
textureMapStage:_textureMapStage
stageArray:_stageArray
creation:creation];
}
- (void)blitNewTexturesFromStagingAreaWithCommandBuffer:(id<MTLCommandBuffer>)commandBuffer {
DLog(@"%@: blit from staging to completion: %@", self.label, _indexesToBlit);
if (!_textureMapStage->have_indexes_to_blit()) {
// Uncomment to make the stage appear in the GPU debugger
// [self doNoOpBlitWithStage:];
return;
}
[_textureMap blitFromStage:_textureMapStage array:_stageArray commandBuffer:commandBuffer];
}
- (iTerm2::TextureMapStage *)textureMapStage {
return _textureMapStage;
}
@end
#import "iTermMetalCellRenderer.h"
NS_ASSUME_NONNULL_BEGIN
@interface iTermBackgroundColorRendererTransientState : iTermMetalCellRendererTransientState
- (void)setColorData:(NSData *)colorData
row:(int)row
width:(int)width;
@end
@interface iTermBackgroundColorRenderer : NSObject<iTermMetalCellRenderer>
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END
#import "iTermBackgroundColorRenderer.h"
@implementation iTermBackgroundColorRendererTransientState
- (nonnull NSMutableData *)newPerInstanceUniformData {
NSMutableData *data = [[NSMutableData alloc] initWithLength:sizeof(iTermBackgroundColorPIU) * self.gridSize.width * self.gridSize.height];
[self initializePIUData:data];
return data;
}
- (void)initializePIUData:(NSMutableData *)data {
void *bytes = data.mutableBytes;
NSInteger i = 0;
for (NSInteger y = 0; y < self.gridSize.height; y++) {
for (NSInteger x = 0; x < self.gridSize.width; x++) {
const iTermBackgroundColorPIU uniform = {
.offset = {
x * self.cellSize.width,
(self.gridSize.height - y - 1) * self.cellSize.height
},
.color = (vector_float4){ 1, 0, 0, 1 }
};
memcpy(bytes + i * sizeof(uniform), &uniform, sizeof(uniform));
i++;
}
}
}
- (void)setColorData:(NSData *)colorData
row:(int)row
width:(int)width {
iTermBackgroundColorPIU *pius = (iTermBackgroundColorPIU *)[self piuForCoord:VT100GridCoordMake(0, row)];
const vector_float4 *colors = (const vector_float4 *)colorData.bytes;
for (int x = 0; x < width; x++) {
pius[x].color = colors[x];
}
}
@end
@implementation iTermBackgroundColorRenderer {
iTermMetalCellRenderer *_cellRenderer;
}
- (instancetype)initWithDevice:(id<MTLDevice>)device {
self = [super init];
if (self) {
_cellRenderer = [[iTermMetalCellRenderer alloc] initWithDevice:device
vertexFunctionName:@"iTermBackgroundColorVertexShader"
fragmentFunctionName:@"iTermBackgroundColorFragmentShader"
blending:YES
piuElementSize:sizeof(iTermBackgroundColorPIU)
transientStateClass:[iTermBackgroundColorRendererTransientState class]];
}
return self;
}
- (void)createTransientStateForViewportSize:(vector_uint2)viewportSize
cellSize:(CGSize)cellSize
gridSize:(VT100GridSize)gridSize
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
completion:(void (^)(__kindof iTermMetalCellRendererTransientState * _Nonnull))completion {
[_cellRenderer createTransientStateForViewportSize:viewportSize
cellSize:cellSize
gridSize:gridSize
commandBuffer:commandBuffer
completion:^(__kindof iTermMetalCellRendererTransientState * _Nonnull transientState) {
[self initializeTransientState:transientState];
completion(transientState);
}];
}
- (void)initializeTransientState:(iTermBackgroundColorRendererTransientState *)tState {
tState.vertexBuffer = [_cellRenderer newQuadOfSize:tState.cellSize];
NSMutableData *data = [tState newPerInstanceUniformData];
tState.pius = [_cellRenderer.device newBufferWithLength:data.length
options:MTLResourceStorageModeShared];
memcpy(tState.pius.contents, data.bytes, data.length);
}
- (void)drawWithRenderEncoder:(id<MTLRenderCommandEncoder>)renderEncoder
transientState:(nonnull __kindof iTermMetalRendererTransientState *)transientState {
iTermBackgroundColorRendererTransientState *tState = transientState;
[_cellRenderer drawWithTransientState:tState
renderEncoder:renderEncoder
numberOfVertices:6
numberOfPIUs:tState.gridSize.width * tState.gridSize.height
vertexBuffers:@{ @(iTermVertexInputIndexVertices): tState.vertexBuffer,
@(iTermVertexInputIndexPerInstanceUniforms): tState.pius,
@(iTermVertexInputIndexOffset): tState.offsetBuffer }
fragmentBuffers:@{}
textures:@{} ];
}
@end
#import <Foundation/Foundation.h>
#import "iTermMetalRenderer.h"
NS_ASSUME_NONNULL_BEGIN
@interface iTermBackgroundImageRenderer : NSObject<iTermMetalRenderer>
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END
#import "iTermBackgroundImageRenderer.h"
#import "iTermShaderTypes.h"
NS_ASSUME_NONNULL_BEGIN
@interface iTermBackgroundImageRendererTransientState : iTermMetalRendererTransientState
@property (nonatomic, strong) id<MTLTexture> texture;
@end
@implementation iTermBackgroundImageRendererTransientState
@end
@implementation iTermBackgroundImageRenderer {
iTermMetalRenderer *_metalRenderer;
// The texture is shared because it tends to get reused. The transient state holds a reference
// to it, so when the image changes, this can be set to a new texture and it should just work.
id<MTLTexture> _texture;
}
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device {
self = [super init];
if (self) {
_metalRenderer = [[iTermMetalRenderer alloc] initWithDevice:device
vertexFunctionName:@"iTermBackgroundImageVertexShader"
fragmentFunctionName:@"iTermBackgroundImageFragmentShader"
blending:NO
transientStateClass:[iTermBackgroundImageRendererTransientState class]];
NSImage *image = [NSImage imageNamed:@"background"];
_texture = [_metalRenderer textureFromImage:image];
}
return self;
}
- (void)drawWithRenderEncoder:(nonnull id<MTLRenderCommandEncoder>)renderEncoder
transientState:(nonnull __kindof iTermMetalRendererTransientState *)transientState {
iTermBackgroundImageRendererTransientState *tState = transientState;
[_metalRenderer drawWithTransientState:tState
renderEncoder:renderEncoder
numberOfVertices:6
numberOfPIUs:0
vertexBuffers:@{ @(iTermVertexInputIndexVertices): tState.vertexBuffer }
fragmentBuffers:@{}
textures:@{ @(iTermTextureIndexPrimary): tState.texture }];
}
- (void)createTransientStateForViewportSize:(vector_uint2)viewportSize
commandBuffer:(id<MTLCommandBuffer>)commandBuffer
completion:(void (^)(__kindof iTermMetalRendererTransientState * _Nonnull))completion {
[_metalRenderer createTransientStateForViewportSize:viewportSize
commandBuffer:commandBuffer
completion:^(__kindof iTermMetalRendererTransientState * _Nonnull transientState) {
[self initializeTransientState:transientState];
completion(transientState);
}];
}
- (void)initializeTransientState:(iTermBackgroundImageRendererTransientState *)tState {
tState.texture = _texture;
tState.vertexBuffer = [_metalRenderer newQuadOfSize:CGSizeMake(tState.viewportSize.x,
tState.viewportSize.y)];
}
@end
NS_ASSUME_NONNULL_END
#import <Foundation/Foundation.h>
#import "iTermMetalRenderer.h"
NS_ASSUME_NONNULL_BEGIN
@interface iTermBadgeRenderer : NSObject<iTermMetalRenderer>
- (nullable instancetype)initWithDevice:(id<MTLDevice>)device NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
- (void)setBadgeImage:(NSImage *)image;
@end
NS_ASSUME_NONNULL_END
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment