aboutsummaryrefslogtreecommitdiff
path: root/src/platform/graphics/direct2d/Image.cpp
blob: 2f60b3734cd42134dc82f57b9b064948e3edb800 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "cru/platform/graphics/direct2d/Image.h"
#include <d2d1_1.h>
#include "cru/base/platform/win/Exception.h"
#include "cru/platform/graphics/direct2d/ConvertUtil.h"
#include "cru/platform/graphics/direct2d/Exception.h"
#include "cru/platform/graphics/direct2d/Factory.h"
#include "cru/platform/graphics/direct2d/Painter.h"

namespace cru::platform::graphics::direct2d {
Direct2DImage::Direct2DImage(DirectGraphicsFactory* graphics_factory,
                             Microsoft::WRL::ComPtr<ID2D1Bitmap1> d2d_bitmap)
    : DirectGraphicsResource(graphics_factory),
      d2d_bitmap_(std::move(d2d_bitmap)) {
  Expects(d2d_bitmap_);
}

Direct2DImage::~Direct2DImage() {}

float Direct2DImage::GetWidth() { return d2d_bitmap_->GetSize().width; }

float Direct2DImage::GetHeight() { return d2d_bitmap_->GetSize().height; }

std::unique_ptr<IImage> Direct2DImage::CreateWithRect(const Rect& rect) {
  auto device_context = GetDirectFactory()->CreateD2D1DeviceContext();
  Microsoft::WRL::ComPtr<ID2D1Bitmap1> bitmap;
  ThrowIfFailed(device_context->CreateBitmap(
      D2D1::SizeU(rect.width, rect.height), nullptr, 0,
      D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_TARGET,
                              D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
                                                D2D1_ALPHA_MODE_PREMULTIPLIED)),
      &bitmap));
  device_context->SetTarget(bitmap.Get());
  device_context->BeginDraw();
  device_context->DrawBitmap(d2d_bitmap_.Get(), Convert(rect));
  ThrowIfFailed(device_context->EndDraw());
  return std::make_unique<Direct2DImage>(GetDirectFactory(), std::move(bitmap));
}

std::unique_ptr<IPainter> Direct2DImage::CreatePainter() {
  auto device_context = GetDirectFactory()->CreateD2D1DeviceContext();
  device_context->SetTarget(d2d_bitmap_.Get());
  return std::make_unique<D2DDeviceContextPainter>(device_context.Detach(),
                                                   true);
}
}  // namespace cru::platform::graphics::direct2d