Skip to content

Commit

Permalink
extract some functions
Browse files Browse the repository at this point in the history
  • Loading branch information
scheffle committed Apr 14, 2024
1 parent 4a364dd commit 1ca48de
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 42 deletions.
19 changes: 19 additions & 0 deletions vstgui/lib/platform/win32/direct2d/d2d.h
Expand Up @@ -73,6 +73,25 @@ inline TransformMatrix convert (const D2D1_MATRIX_3X2_F& t)
return matrix;
}

//------------------------------------------------------------------------
inline D2D1_BITMAP_INTERPOLATION_MODE convert (BitmapInterpolationQuality quality)
{
D2D1_BITMAP_INTERPOLATION_MODE mode;
switch (quality)
{
case BitmapInterpolationQuality::kLow:
mode = D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR;
break;

case BitmapInterpolationQuality::kMedium:
case BitmapInterpolationQuality::kHigh:
default:
mode = D2D1_BITMAP_INTERPOLATION_MODE_LINEAR;
break;
}
return mode;
}

//------------------------------------------------------------------------
} // anonymous namespace

Expand Down
83 changes: 41 additions & 42 deletions vstgui/lib/platform/win32/direct2d/d2dgraphicscontext.cpp
Expand Up @@ -125,6 +125,42 @@ struct D2DBitmapDeviceContext : D2DGraphicsDeviceContext
SharedPointer<D2DBitmap> bitmap;
};

//------------------------------------------------------------------------
COM::Ptr<ID2D1ImageBrush> createBrushFromBitmap (ID2D1DeviceContext* deviceContext,
ID2D1Bitmap* d2d1Bitmap, const CRect& srcRect,
const CRect& dstRect,
BitmapInterpolationQuality quality)
{
D2D1_IMAGE_BRUSH_PROPERTIES imageBrushProp = {};
imageBrushProp.sourceRectangle = convert (srcRect);
imageBrushProp.extendModeX = imageBrushProp.extendModeY = D2D1_EXTEND_MODE_WRAP;
switch (quality)
{
case BitmapInterpolationQuality::kLow:
imageBrushProp.interpolationMode = D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR;
break;

case BitmapInterpolationQuality::kMedium:
case BitmapInterpolationQuality::kHigh:
default:
imageBrushProp.interpolationMode = D2D1_INTERPOLATION_MODE_LINEAR;
break;
}
CGraphicsTransform brushTransform;
brushTransform.translate (dstRect.getTopLeft ());

D2D1_BRUSH_PROPERTIES brushProp = {};
brushProp.opacity = 1.f;
brushProp.transform = convert (brushTransform);

COM::Ptr<ID2D1ImageBrush> brush;
auto hr =
deviceContext->CreateImageBrush (d2d1Bitmap, imageBrushProp, brushProp, brush.adoptPtr ());
if (FAILED (hr))
return {};
return brush;
}

//------------------------------------------------------------------------
} // anonymous namespace

Expand Down Expand Up @@ -643,24 +679,10 @@ bool D2DGraphicsDeviceContext::drawBitmap (IPlatformBitmap& bitmap, CRect dest,
source.setWidth (d2d1Bitmap->GetSize ().width);
source.setHeight (d2d1Bitmap->GetSize ().height);

D2D1_BITMAP_INTERPOLATION_MODE mode;
switch (quality)
{
case BitmapInterpolationQuality::kLow:
mode = D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR;
break;

case BitmapInterpolationQuality::kMedium:
case BitmapInterpolationQuality::kHigh:
default:
mode = D2D1_BITMAP_INTERPOLATION_MODE_LINEAR;
break;
}

D2D1_RECT_F sourceRect = convert (source);
deviceContext->DrawBitmap (d2d1Bitmap, convert (d),
static_cast<FLOAT> (alpha * impl->state.globalAlpha), mode,
&sourceRect);
static_cast<FLOAT> (alpha * impl->state.globalAlpha),
convert (quality), &sourceRect);
});
setTransformMatrix (originalTransformMatrix);
impl->state.clip = originalClip;
Expand Down Expand Up @@ -932,32 +954,9 @@ bool D2DGraphicsDeviceContext::fillRectWithBitmap (IPlatformBitmap& bitmap, CRec
invBitmapTransform.transform (dstRect);
invBitmapTransform.transform (srcRect);

D2D1_IMAGE_BRUSH_PROPERTIES imageBrushProp = {};
imageBrushProp.sourceRectangle = convert (srcRect);
imageBrushProp.extendModeX = imageBrushProp.extendModeY = D2D1_EXTEND_MODE_WRAP;
switch (quality)
{
case BitmapInterpolationQuality::kLow:
imageBrushProp.interpolationMode = D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR;
break;

case BitmapInterpolationQuality::kMedium:
case BitmapInterpolationQuality::kHigh:
default:
imageBrushProp.interpolationMode = D2D1_INTERPOLATION_MODE_LINEAR;
break;
}
CGraphicsTransform brushTransform;
brushTransform.translate (dstRect.getTopLeft ());

D2D1_BRUSH_PROPERTIES brushProp = {};
brushProp.opacity = 1.f;
brushProp.transform = convert (brushTransform);

COM::Ptr<ID2D1ImageBrush> brush;
auto hr = impl->deviceContext->CreateImageBrush (d2d1Bitmap, imageBrushProp, brushProp,
brush.adoptPtr ());
if (FAILED (hr))
auto brush =
createBrushFromBitmap (impl->deviceContext.get (), d2d1Bitmap, srcRect, dstRect, quality);
if (!brush)
return false;

impl->state.clip = cr;
Expand Down

0 comments on commit 1ca48de

Please sign in to comment.