mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
Change to use Gfx rendering
This commit is contained in:
@ -36,6 +36,8 @@
|
||||
#include "TintedImage.h"
|
||||
#include "MeasureScript.h"
|
||||
#include "../Version.h"
|
||||
#include "../Common/Gfx/CanvasGDIP.h"
|
||||
#include "../Common/Gfx/CanvasD2D.h"
|
||||
|
||||
using namespace Gdiplus;
|
||||
|
||||
@ -74,11 +76,7 @@ extern CRainmeter* Rainmeter;
|
||||
**
|
||||
*/
|
||||
CMeterWindow::CMeterWindow(const std::wstring& folderPath, const std::wstring& file) : m_FolderPath(folderPath), m_FileName(file),
|
||||
m_DoubleBuffer(),
|
||||
m_DIBSectionBuffer(),
|
||||
m_DIBSectionBufferPixels(),
|
||||
m_DIBSectionBufferW(),
|
||||
m_DIBSectionBufferH(),
|
||||
m_Canvas(),
|
||||
m_Background(),
|
||||
m_BackgroundSize(),
|
||||
m_Window(),
|
||||
@ -145,6 +143,9 @@ CMeterWindow::CMeterWindow(const std::wstring& folderPath, const std::wstring& f
|
||||
m_FontCollection(),
|
||||
m_ToolTipHidden(false)
|
||||
{
|
||||
m_Canvas = Platform::IsAtLeastWinVista() ?
|
||||
(Gfx::Canvas*)new Gfx::CanvasD2D() : (Gfx::Canvas*)new Gfx::CanvasGDIP();
|
||||
|
||||
if (!c_DwmInstance && Platform::IsAtLeastWinVista())
|
||||
{
|
||||
c_DwmInstance = CSystem::RmLoadLibrary(L"dwmapi.dll");
|
||||
@ -201,6 +202,9 @@ CMeterWindow::~CMeterWindow()
|
||||
c_DwmIsCompositionEnabled = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
delete m_Canvas;
|
||||
m_Canvas = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -260,16 +264,6 @@ void CMeterWindow::Dispose(bool refresh)
|
||||
|
||||
if (!refresh)
|
||||
{
|
||||
// Destroy double buffers and window
|
||||
delete m_DoubleBuffer;
|
||||
m_DoubleBuffer = NULL;
|
||||
|
||||
if (m_DIBSectionBuffer)
|
||||
{
|
||||
DeleteObject(m_DIBSectionBuffer);
|
||||
m_DIBSectionBuffer = NULL;
|
||||
}
|
||||
|
||||
if (m_Window)
|
||||
{
|
||||
DestroyWindow(m_Window);
|
||||
@ -2439,25 +2433,7 @@ bool CMeterWindow::ResizeWindow(bool reset)
|
||||
*/
|
||||
void CMeterWindow::CreateDoubleBuffer(int cx, int cy)
|
||||
{
|
||||
// Create DIBSection bitmap
|
||||
BITMAPV4HEADER bmiHeader = {sizeof(BITMAPV4HEADER)};
|
||||
bmiHeader.bV4Width = cx;
|
||||
bmiHeader.bV4Height = -cy; // top-down DIB
|
||||
bmiHeader.bV4Planes = 1;
|
||||
bmiHeader.bV4BitCount = 32;
|
||||
bmiHeader.bV4V4Compression = BI_BITFIELDS;
|
||||
bmiHeader.bV4RedMask = 0x00FF0000;
|
||||
bmiHeader.bV4GreenMask = 0x0000FF00;
|
||||
bmiHeader.bV4BlueMask = 0x000000FF;
|
||||
bmiHeader.bV4AlphaMask = 0xFF000000;
|
||||
|
||||
m_DIBSectionBuffer = CreateDIBSection(NULL, (BITMAPINFO*)&bmiHeader, DIB_RGB_COLORS, (void**)&m_DIBSectionBufferPixels, NULL, 0);
|
||||
|
||||
// Create GDI+ bitmap from DIBSection's pixels
|
||||
m_DoubleBuffer = new Bitmap(cx, cy, cx * 4, PixelFormat32bppPARGB, (BYTE*)m_DIBSectionBufferPixels);
|
||||
|
||||
m_DIBSectionBufferW = cx;
|
||||
m_DIBSectionBufferH = cy;
|
||||
m_Canvas->Resize(cx, cy);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2484,29 +2460,26 @@ void CMeterWindow::Redraw()
|
||||
cy = 1;
|
||||
}
|
||||
|
||||
if (cx != m_DIBSectionBufferW || cy != m_DIBSectionBufferH || m_DIBSectionBufferPixels == NULL)
|
||||
if (cx != m_Canvas->GetW() || cy != m_Canvas->GetH())
|
||||
{
|
||||
delete m_DoubleBuffer;
|
||||
if (m_DIBSectionBuffer) DeleteObject(m_DIBSectionBuffer);
|
||||
m_DIBSectionBufferPixels = NULL;
|
||||
|
||||
CreateDoubleBuffer(cx, cy);
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(m_DIBSectionBufferPixels, 0, cx * cy * 4);
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_Canvas->BeginDraw())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_Canvas->Clear();
|
||||
|
||||
if (m_WindowW != 0 && m_WindowH != 0)
|
||||
{
|
||||
Graphics graphics(m_DoubleBuffer);
|
||||
|
||||
if (m_Background)
|
||||
{
|
||||
// Copy the background over the doublebuffer
|
||||
Rect r(0, 0, m_WindowW, m_WindowH);
|
||||
graphics.DrawImage(m_Background, r, 0, 0, m_Background->GetWidth(), m_Background->GetHeight(), UnitPixel);
|
||||
const Rect dst(0, 0, m_WindowW, m_WindowH);
|
||||
const Rect src(0, 0, m_Background->GetWidth(), m_Background->GetHeight());
|
||||
m_Canvas->DrawBitmap(m_Background, dst, src);
|
||||
}
|
||||
else if (m_BackgroundMode == BGMODE_SOLID)
|
||||
{
|
||||
@ -2517,12 +2490,14 @@ void CMeterWindow::Redraw()
|
||||
{
|
||||
if (m_SolidColor.GetValue() == m_SolidColor2.GetValue())
|
||||
{
|
||||
graphics.Clear(m_SolidColor);
|
||||
m_Canvas->Clear(m_SolidColor);
|
||||
}
|
||||
else
|
||||
{
|
||||
Gdiplus::Graphics& graphics = m_Canvas->BeginGdiplusContext();
|
||||
LinearGradientBrush gradient(r, m_SolidColor, m_SolidColor2, m_SolidAngle, TRUE);
|
||||
graphics.FillRectangle(&gradient, r);
|
||||
m_Canvas->EndGdiplusContext();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2540,7 +2515,9 @@ void CMeterWindow::Redraw()
|
||||
Pen light(lightColor);
|
||||
Pen dark(darkColor);
|
||||
|
||||
Gdiplus::Graphics& graphics = m_Canvas->BeginGdiplusContext();
|
||||
CMeter::DrawBevel(graphics, r, light, dark);
|
||||
m_Canvas->EndGdiplusContext();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2551,22 +2528,24 @@ void CMeterWindow::Redraw()
|
||||
const Matrix* matrix = (*j)->GetTransformationMatrix();
|
||||
if (matrix && !matrix->IsIdentity())
|
||||
{
|
||||
// Change the world matrix
|
||||
graphics.SetTransform(matrix);
|
||||
// TODO FIXME: Change the world matrix
|
||||
//m_Canvas->GetGraphics().SetTransform(matrix);
|
||||
|
||||
(*j)->Draw(graphics);
|
||||
(*j)->Draw(*m_Canvas);
|
||||
|
||||
// Set back to identity matrix
|
||||
graphics.ResetTransform();
|
||||
// TODO FIXME: Set back to identity matrix
|
||||
//m_Canvas->GetGraphics().ResetTransform();
|
||||
}
|
||||
else
|
||||
{
|
||||
(*j)->Draw(graphics);
|
||||
(*j)->Draw(*m_Canvas);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UpdateWindow(m_TransparencyValue, false);
|
||||
UpdateWindow(m_TransparencyValue, false, true);
|
||||
|
||||
m_Canvas->EndDraw();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2738,7 +2717,7 @@ void CMeterWindow::Update(bool refresh)
|
||||
** Updates the window contents
|
||||
**
|
||||
*/
|
||||
void CMeterWindow::UpdateWindow(int alpha, bool reset)
|
||||
void CMeterWindow::UpdateWindow(int alpha, bool reset, bool canvasBeginDrawCalled)
|
||||
{
|
||||
if (reset)
|
||||
{
|
||||
@ -2746,25 +2725,25 @@ void CMeterWindow::UpdateWindow(int alpha, bool reset)
|
||||
}
|
||||
|
||||
BLENDFUNCTION blendPixelFunction = {AC_SRC_OVER, 0, alpha, AC_SRC_ALPHA};
|
||||
POINT ptWindowScreenPosition = {m_ScreenX, m_ScreenY};
|
||||
POINT ptSrc = {0, 0};
|
||||
SIZE szWindow = {m_DIBSectionBufferW, m_DIBSectionBufferH};
|
||||
SIZE szWindow = {m_WindowW, m_WindowH};
|
||||
|
||||
HDC dcScreen = GetDC(0);
|
||||
HDC dcMemory = CreateCompatibleDC(dcScreen);
|
||||
SelectObject(dcMemory, m_DIBSectionBuffer);
|
||||
if (!canvasBeginDrawCalled) m_Canvas->BeginDraw();
|
||||
|
||||
BOOL ret = UpdateLayeredWindow(m_Window, dcScreen, &ptWindowScreenPosition, &szWindow, dcMemory, &ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
|
||||
if (!ret)
|
||||
HDC dcScreen = GetDC(NULL);
|
||||
HDC dcMemory = m_Canvas->GetDC();
|
||||
if (!UpdateLayeredWindow(m_Window, dcScreen, NULL, &szWindow, dcMemory, &ptSrc, 0, &blendPixelFunction, ULW_ALPHA))
|
||||
{
|
||||
// Retry after resetting WS_EX_LAYERED flag
|
||||
// Retry after resetting WS_EX_LAYERED flag.
|
||||
RemoveWindowExStyle(WS_EX_LAYERED);
|
||||
AddWindowExStyle(WS_EX_LAYERED);
|
||||
UpdateLayeredWindow(m_Window, dcScreen, &ptWindowScreenPosition, &szWindow, dcMemory, &ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
|
||||
UpdateLayeredWindow(m_Window, dcScreen, NULL, &szWindow, dcMemory, &ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
|
||||
}
|
||||
|
||||
ReleaseDC(0, dcScreen);
|
||||
DeleteDC(dcMemory);
|
||||
ReleaseDC(NULL, dcScreen);
|
||||
m_Canvas->ReleaseDC(dcMemory);
|
||||
|
||||
if (!canvasBeginDrawCalled) m_Canvas->EndDraw();
|
||||
|
||||
m_TransparencyValue = alpha;
|
||||
}
|
||||
@ -3066,21 +3045,7 @@ HWND CMeterWindow::GetWindowFromPoint(POINT pos)
|
||||
*/
|
||||
bool CMeterWindow::HitTest(int x, int y)
|
||||
{
|
||||
if (x >= 0 && y >= 0 && x < m_WindowW && y < m_WindowH)
|
||||
{
|
||||
// Check transparent pixels
|
||||
if (m_DIBSectionBufferPixels)
|
||||
{
|
||||
DWORD pixel = m_DIBSectionBufferPixels[y * m_WindowW + x]; // top-down DIB
|
||||
return ((pixel & 0xFF000000) != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return m_Canvas->IsTransparentPixel(x, y);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user