ElliotThomas
ElliotThomas

Reputation: 335

What is the srcData for ID2D1Bitmap::CreateBitmap

I need to create a bitmap from an array of pixels for a raycaster I'm working on in Direct2D. However, I'm having trouble understanding how to use the CreateBitmap function. Specifically, I'm not sure what the srcData parameter is supposed to be. I'm pretty sure/hoping it's a pointer to an array of pixels, but I'm not sure how to set up that array. What kind of array is it supposed to be? What data type? Etc.

Here's what I've tried:

    int width = 400, height = 400;
    D2D1::ColorF * arr = (D2D1::ColorF*)calloc(width * height * 4, sizeof(D2D1::ColorF));
    for (int i = 0; i < width * height * 4; i++) { arr[i] = D2D1::ColorF(0.0f, 1.0f, 0.0f); }
    // Create the bitmap and draw it on the screen
    ID2D1Bitmap * bmp;
    HRESULT hr;
    hr = renderTarget->CreateBitmap(
        D2D1::SizeU(width, height),
        arr,
        width * sizeof(int) * 4,
        D2D1::BitmapProperties(),
        &bmp);
    if (hr != S_OK) { return; } // I've tested and found that hr does not equal S_OK

    // Draw the bitmap...

What should the second and third lines look like? Is there anything else I'm doing incorrectly?

Upvotes: 1

Views: 1920

Answers (1)

Roman Ryltsov
Roman Ryltsov

Reputation: 69734

Syntax:

HRESULT CreateBitmap(
  D2D1_SIZE_U                    size,
  const void                     *srcData,
  UINT32                         pitch,
  const D2D1_BITMAP_PROPERTIES & bitmapProperties,
  ID2D1Bitmap                    **bitmap
);

Your code:

hr = renderTarget->CreateBitmap(
    D2D1::SizeU(width, height),
    arr, // <<--- Wrong, see (a) below
    width * sizeof(int) * 4, // <<--- Close but wrong, see (b) below
    D2D1::BitmapProperties(), // <<--- Wrong, see (c) below
    &bmp);

(a) - you are supposed to provide an array of pixel data here, where the format depends on format of the bitmap. Note that this is optional an d you can create a bitmap without initialization. The pixels are not D2D1::ColorF exactly. They could be 4 byte RGBA data if you request respective bitmap format, see (c) below.

(b) - this is distance between rows in bytes, if your pixels are supposed to be 32-bit values you would normally want Width * 4 here

(c) - this requests DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN and results in bitmap creation error. You need a real format here such as DXGI_FORMAT_B8G8R8A8_UNORM (see Pixel Formats and also Supported Pixel Formats and Alpha Modes)

The first link above shows how exactly bytes in memory map to pixel colors, and you are supposed to prepare your data respectively.

UPD

With DXGI_FORMAT_B8G8R8A8_UNORM your initialization structure is this:

UINT8* Data = malloc(Height * Width * 4);
for(UINT Y = 0; Y < Height; Y++)
  for(UINT X = 0; X < Width; X++)
  {
    UINT8* PixelData = Data + ((Y * Width) + X) * 4;
    PixelData[0] = unsigned integer blue in range 0..255;
    PixelData[1] = unsigned integer red in range 0..255;
    PixelData[2] = unsigned integer green in range 0..255;
    PixelData[3] = 255;
  }

Upvotes: 3

Related Questions