1<?xml version="1.0" encoding="utf-8"?> 2<!-- 3 This .natvis file allows natively viewing Skia types in any debugger that supports NatVis, 4 although the installation or usage instructions vary: 5 6 <<< Visual Studio >>> 7 https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2019 8 9 Visualizer files can be placed in the project, but your best bet is to copy this file to 10 your 'Documents\Visual Studio YYYY\Visualizers' folder (where YYYY is 2017 or 2019). 11 12 If you use Visual Studio, there are graphical visualizers for SkBitmap and SkPixmap: 13 - Install the "Image Watch" extension to Visual Studio (created by Microsoft). 14 - Copy this file to the directory indicated above. (Visualizers can normally be placed in 15 the project, but the Image Watch extension requires them to be global.) 16 - While debugging, go to View -> Other Windows -> Image Watch 17 - SkBitmap and SkPixmap objects will be visible directly in the debugger. 18 Note that due to limitations, it does not visualize some more exotic color types 19 (565, 4444, 1010102, 888x). 20 - Documentation for the extension is available: 21 https://imagewatch.azurewebsites.net/ImageWatchHelp/ImageWatchHelp.htm 22 23 <<< Visual Studio Code >>> 24 https://code.visualstudio.com/docs/cpp/natvis 25 26 Visualizer files can be placed in a global directory, but the exact directory name depends 27 on the version of VS Code you're running, and the version of the CPP tools: 28 ~/.vscode(-insiders)/extensions/ms-vscode.cpptools-x.y.z/debugAdapters/vsdbg/bin/Visualizers 29 30 Instead, you can simply edit your launch.json debugger configuration file, and set the 31 "visualizerFile" property of any Skia launch targets to point at this file. For example: 32 33 { 34 "name": "DM", 35 "type": "cppvsdbg", 36 "request": "launch", 37 "program": "${workspaceFolder}/out/Debug/dm.exe", 38 "args": [], 39 "cwd": "${workspaceFolder}", 40 "environment": [], 41 "externalConsole": true, 42 "visualizerFile": "${workspaceFolder}/platform_tools/debugging/vs/Skia.natvis" 43 }, 44 45--> 46<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> 47 <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" 48 MenuName="Add to Image Watch"/> 49 50 <!-- sk_sp --> 51 <Type Name="sk_sp<*>"> 52 <DisplayString>{fPtr}</DisplayString> 53 <Expand> 54 <ExpandedItem>fPtr</ExpandedItem> 55 </Expand> 56 </Type> 57 58 <!-- unique_ptr --> 59 <Type Name="std::unique_ptr<*>"> 60 <DisplayString>{_Mypair._Myval2}</DisplayString> 61 <Expand> 62 <ExpandedItem>_Mypair._Myval2</ExpandedItem> 63 </Expand> 64 </Type> 65 66 <!-- shared_ptr --> 67 <Type Name="std::shared_ptr<*>"> 68 <DisplayString>{_Ptr}</DisplayString> 69 <Expand> 70 <ExpandedItem>_Ptr</ExpandedItem> 71 </Expand> 72 </Type> 73 74 <!-- SkString --> 75 <Type Name="SkString"> 76 <DisplayString>{&fRec.fPtr->fBeginningOfData}</DisplayString> 77 </Type> 78 79 <!-- SkSL::StringFragment --> 80 <Type Name="SkSL::StringFragment"> 81 <DisplayString>{fChars,[fLength]}</DisplayString> 82 </Type> 83 84 <!-- SkSL::SymbolTable::SymbolKey --> 85 <Type Name="SkSL::SymbolTable::SymbolKey"> 86 <DisplayString>{fName}</DisplayString> 87 </Type> 88 89 <!-- AutoTArray --> 90 <Type Name="skia_private::AutoTArray<*>"> 91 <DisplayString>{{size = {fCount}}}</DisplayString> 92 <Expand> 93 <Item Name="[size]">fCount</Item> 94 <ArrayItems> 95 <Size>fCount</Size> 96 <ValuePointer>fArray._Mypair._Myval2</ValuePointer> 97 </ArrayItems> 98 </Expand> 99 </Type> 100 101 <!-- TArray --> 102 <Type Name="skia_private::TArray<*>"> 103 <DisplayString>{{size = {fSize}}}</DisplayString> 104 <Expand> 105 <Item Name="[size]">fSize</Item> 106 <ArrayItems> 107 <Size>fSize</Size> 108 <ValuePointer>fData</ValuePointer> 109 </ArrayItems> 110 </Expand> 111 </Type> 112 113 <!-- SkTHashTable::Slot --> 114 <Type Name="SkTHashTable<*,*,*>::Slot"> 115 <DisplayString Condition="hash">{val}</DisplayString> 116 <DisplayString Condition="!hash">Empty</DisplayString> 117 <Expand> 118 <ExpandedItem>val</ExpandedItem> 119 </Expand> 120 </Type> 121 122 <!-- THashMap --> 123 <Type Name="skia_private::THashMap<*,*,*>"> 124 <DisplayString>{{size = {fTable.fCount}}}</DisplayString> 125 <Expand> 126 <CustomListItems> 127 <Variable Name="iSlot" InitialValue="0"/> 128 <Size>fTable.fCount</Size> 129 <Loop> 130 <If Condition="fTable.fSlots.fArray._Mypair._Myval2[iSlot].hash != 0"> 131 <Item Name="{fTable.fSlots.fArray._Mypair._Myval2[iSlot].val.key}"> 132 fTable.fSlots.fArray._Mypair._Myval2[iSlot].val 133 </Item> 134 </If> 135 <Exec>iSlot++</Exec> 136 </Loop> 137 </CustomListItems> 138 </Expand> 139 </Type> 140 141 <!-- SkImageInfo --> 142 <Type Name="SkImageInfo"> 143 <DisplayString>[{fDimensions.fWidth} x {fDimensions.fHeight}] {fColorInfo.fColorType,en} {fColorInfo.fAlphaType,en} {fColorInfo.fColorSpace,na}</DisplayString> 144 </Type> 145 146 <!-- SkBitmap --> 147 <Type Name="SkBitmap"> 148 <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" /> 149 </Type> 150 151 <Type Name="SkBitmap"> 152 <DisplayString>{fPixmap.fInfo}</DisplayString> 153 <Expand> 154 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kAlpha_8_SkColorType"> 155 <DisplayString>UINT8</DisplayString> 156 </Synthetic> 157 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kRGBA_8888_SkColorType"> 158 <DisplayString>UINT8</DisplayString> 159 </Synthetic> 160 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kBGRA_8888_SkColorType"> 161 <DisplayString>UINT8</DisplayString> 162 </Synthetic> 163 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kGray_8_SkColorType"> 164 <DisplayString>UINT8</DisplayString> 165 </Synthetic> 166 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kRGBA_F16_SkColorType"> 167 <DisplayString>FLOAT16</DisplayString> 168 </Synthetic> 169 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kRGBA_F16Norm_SkColorType"> 170 <DisplayString>FLOAT16</DisplayString> 171 </Synthetic> 172 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kRGBA_F32_SkColorType"> 173 <DisplayString>FLOAT32</DisplayString> 174 </Synthetic> 175 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kR8G8_unorm_SkColorType"> 176 <DisplayString>UINT8</DisplayString> 177 </Synthetic> 178 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kA16_float_SkColorType"> 179 <DisplayString>FLOAT16</DisplayString> 180 </Synthetic> 181 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kR16G16_float_SkColorType"> 182 <DisplayString>FLOAT16</DisplayString> 183 </Synthetic> 184 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kA16_unorm_SkColorType"> 185 <DisplayString>UINT16</DisplayString> 186 </Synthetic> 187 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kR16G16_unorm_SkColorType"> 188 <DisplayString>UINT16</DisplayString> 189 </Synthetic> 190 <Synthetic Name="[type]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kR16G16B16A16_unorm_SkColorType"> 191 <DisplayString>UINT16</DisplayString> 192 </Synthetic> 193 194 <Item Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kAlpha_8_SkColorType">1</Item> 195 <Synthetic Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kRGBA_8888_SkColorType"> 196 <DisplayString>RGBA</DisplayString> 197 </Synthetic> 198 <Synthetic Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kBGRA_8888_SkColorType"> 199 <DisplayString>BGRA</DisplayString> 200 </Synthetic> 201 <Item Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kGray_8_SkColorType">1</Item> 202 <Synthetic Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kRGBA_F16_SkColorType"> 203 <DisplayString>RGBA</DisplayString> 204 </Synthetic> 205 <Synthetic Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kRGBA_F16Norm_SkColorType"> 206 <DisplayString>RGBA</DisplayString> 207 </Synthetic> 208 <Synthetic Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kRGBA_F32_SkColorType"> 209 <DisplayString>RGBA</DisplayString> 210 </Synthetic> 211 <Synthetic Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kR8G8_unorm_SkColorType"> 212 <DisplayString>RG</DisplayString> 213 </Synthetic> 214 <Item Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kA16_float_SkColorType">1</Item> 215 <Synthetic Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kR16G16_float_SkColorType"> 216 <DisplayString>RG</DisplayString> 217 </Synthetic> 218 <Item Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kA16_unorm_SkColorType">1</Item> 219 <Synthetic Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kR16G16_unorm_SkColorType"> 220 <DisplayString>RG</DisplayString> 221 </Synthetic> 222 <Synthetic Name="[channels]" Condition="fPixmap.fInfo.fColorInfo.fColorType == kR16G16B16A16_unorm_SkColorType"> 223 <DisplayString>BGRA</DisplayString> 224 </Synthetic> 225 226 <Item Name="[width]">fPixmap.fInfo.fDimensions.fWidth</Item> 227 <Item Name="[height]">fPixmap.fInfo.fDimensions.fHeight</Item> 228 <Item Name="[data]">fPixmap.fPixels</Item> 229 <Item Name="[stride]">fPixmap.fRowBytes</Item> 230 </Expand> 231 </Type> 232 233 <!-- SkPixmap --> 234 <Type Name="SkPixmap"> 235 <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" /> 236 </Type> 237 238 <Type Name="SkPixmap"> 239 <DisplayString>{fInfo}</DisplayString> 240 <Expand> 241 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kAlpha_8_SkColorType"> 242 <DisplayString>UINT8</DisplayString> 243 </Synthetic> 244 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kRGBA_8888_SkColorType"> 245 <DisplayString>UINT8</DisplayString> 246 </Synthetic> 247 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kBGRA_8888_SkColorType"> 248 <DisplayString>UINT8</DisplayString> 249 </Synthetic> 250 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kGray_8_SkColorType"> 251 <DisplayString>UINT8</DisplayString> 252 </Synthetic> 253 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kRGBA_F16_SkColorType"> 254 <DisplayString>FLOAT16</DisplayString> 255 </Synthetic> 256 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kRGBA_F16Norm_SkColorType"> 257 <DisplayString>FLOAT16</DisplayString> 258 </Synthetic> 259 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kRGBA_F32_SkColorType"> 260 <DisplayString>FLOAT32</DisplayString> 261 </Synthetic> 262 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kR8G8_unorm_SkColorType"> 263 <DisplayString>UINT8</DisplayString> 264 </Synthetic> 265 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kA16_float_SkColorType"> 266 <DisplayString>FLOAT16</DisplayString> 267 </Synthetic> 268 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kR16G16_float_SkColorType"> 269 <DisplayString>FLOAT16</DisplayString> 270 </Synthetic> 271 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kA16_unorm_SkColorType"> 272 <DisplayString>UINT16</DisplayString> 273 </Synthetic> 274 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kR16G16_unorm_SkColorType"> 275 <DisplayString>UINT16</DisplayString> 276 </Synthetic> 277 <Synthetic Name="[type]" Condition="fInfo.fColorInfo.fColorType == kR16G16B16A16_unorm_SkColorType"> 278 <DisplayString>UINT16</DisplayString> 279 </Synthetic> 280 281 <Item Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kAlpha_8_SkColorType">1</Item> 282 <Synthetic Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kRGBA_8888_SkColorType"> 283 <DisplayString>RGBA</DisplayString> 284 </Synthetic> 285 <Synthetic Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kBGRA_8888_SkColorType"> 286 <DisplayString>BGRA</DisplayString> 287 </Synthetic> 288 <Item Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kGray_8_SkColorType">1</Item> 289 <Synthetic Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kRGBA_F16_SkColorType"> 290 <DisplayString>RGBA</DisplayString> 291 </Synthetic> 292 <Synthetic Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kRGBA_F16Norm_SkColorType"> 293 <DisplayString>RGBA</DisplayString> 294 </Synthetic> 295 <Synthetic Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kRGBA_F32_SkColorType"> 296 <DisplayString>RGBA</DisplayString> 297 </Synthetic> 298 <Synthetic Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kR8G8_unorm_SkColorType"> 299 <DisplayString>RG</DisplayString> 300 </Synthetic> 301 <Item Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kA16_float_SkColorType">1</Item> 302 <Synthetic Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kR16G16_float_SkColorType"> 303 <DisplayString>RG</DisplayString> 304 </Synthetic> 305 <Item Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kA16_unorm_SkColorType">1</Item> 306 <Synthetic Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kR16G16_unorm_SkColorType"> 307 <DisplayString>RG</DisplayString> 308 </Synthetic> 309 <Synthetic Name="[channels]" Condition="fInfo.fColorInfo.fColorType == kR16G16B16A16_unorm_SkColorType"> 310 <DisplayString>BGRA</DisplayString> 311 </Synthetic> 312 313 <Item Name="[width]">fInfo.fDimensions.fWidth</Item> 314 <Item Name="[height]">fInfo.fDimensions.fHeight</Item> 315 <Item Name="[data]">fPixels</Item> 316 <Item Name="[stride]">fRowBytes</Item> 317 </Expand> 318 </Type> 319</AutoVisualizer> 320