2

Visual Studio の Image Watch 拡張機能 ( http://goo.gl/TWre0X ) を使用すると、デバッグ中にメモリ内のビットマップを表示できます。非常に便利ですが、DIB、BITMAPINFOHEADER、または BITMAPINFO オブジェクトだけを表示できるように natvis ファイルを定義しようとして立ち往生しています。

これが私が現在持っているものです:

  <?xml version="1.0" encoding="utf-8"?>
  <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

    <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1"
                  MenuName="Add to Image Watch"/>

    <Type Name="BITMAPINFOHEADER">
      <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
    </Type>

    <Type Name="BITMAPINFOHEADER">
      <Expand>
        <Synthetic Name="[type]">
          <DisplayString>UINT8</DisplayString>
        </Synthetic>
        <Synthetic Name="[channels]">
          <DisplayString>RGB</DisplayString>
        </Synthetic>
        <Item Name="[width]">biWidth</Item>
        <Item Name="[height]">biHeight</Item>
        <Item Name="[data]">(BYTE *)$ + sizeof(BITMAPINFOHEADER) + biClrUsed * 4</Item>
        <Item Name="[stride]">biBitCount*3</Item>
      </Expand>
    </Type>  

  </AutoVisualizer>

問題は明らかに「[data]」部分で、ピクセル データのオフセットを計算しようとしています。$ は、natvis ファイルが実際に何を行っているかを理解しようとする弱い試みです。

Image Watch のドキュメントとユーザー定義型のいくつかのサンプル natvis ファイル (BITMAPINFOHEADER がユーザー定義にどのように分類されるか、理由はわかりません): http://goo.gl/zt2uCh

Image Watch の BITMAPINFOHEADER タイプを処理および表示する natvis ファイルを既に持っている人はいますか? または、これを機能させる方法について提案があります。ありがとう。

4

1 に答える 1

2

あなたが持っているものから少し微調整するだけです。

  • デバッガーからの式をほとんど使用できるように見えるので、 $ の代わりに "this" を使用するように変更します
  • ストライドは行のサイズ (バイト単位) です。
  • 構造体の場合、タグの名前空間名を使用し、AlternativeType を介して typedef にエイリアスを追加する必要があります。
  • 私の Pixel フォーマットは BGR でした
  • 各行のバイト単位のサイズは 4 の倍数でなければならないため、一致するようにストライドもパディングします (Image Watch は不完全なピクセルを破棄するようです)。

<Type Name="tagBITMAPINFOHEADER">
    <AlternativeType Name="BITMAPINFOHEADER"></AlternativeType>
    <Expand>
        <Synthetic Name="[type]">
            <DisplayString Condition="biBitCount==24">UINT8</DisplayString>
            <DisplayString Condition="biBitCount==32">UINT8</DisplayString>
            <DisplayString Condition="biBitCount==48">UINT16</DisplayString>
        </Synthetic>
        <Synthetic Name="[channels]">
            <DisplayString Condition="biBitCount==32">BGRA</DisplayString>
            <DisplayString Condition="biBitCount==24">BGR</DisplayString>
            <DisplayString Condition="biBitCount==48">BGR</DisplayString>
        </Synthetic>
        <Item Name="[width]">biWidth</Item>
        <Item Name="[height]">biHeight</Item>
        <Item Name="[data]">((BYTE *)this) + sizeof(BITMAPINFOHEADER) + (biClrUsed * 4)</Item>
        <Item Name="[stride]">((biBitCount/8)*biWidth)+((4 - (((biBitCount/8)*biWidth)%4))%4)</Item>
    </Expand>
</Type>

于 2015-03-05T17:02:09.180 に答える