aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_devices/backBuffer.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Library/ml_devices/backBuffer.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/Library/ml_devices/backBuffer.cpp')
-rw-r--r--Src/Plugins/Library/ml_devices/backBuffer.cpp276
1 files changed, 276 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_devices/backBuffer.cpp b/Src/Plugins/Library/ml_devices/backBuffer.cpp
new file mode 100644
index 00000000..881c37bf
--- /dev/null
+++ b/Src/Plugins/Library/ml_devices/backBuffer.cpp
@@ -0,0 +1,276 @@
+#include "main.h"
+#include "./backBuffer.h"
+
+
+BOOL
+BackBuffer_Initialize(BackBuffer *self, HWND hwnd)
+{
+ if (NULL == self)
+ return FALSE;
+
+ ZeroMemory(self, sizeof(BackBuffer));
+
+ self->hwnd = hwnd;
+
+ return TRUE;
+}
+
+void
+BackBuffer_Uninitialize(BackBuffer *self)
+{
+ BackBuffer_Reset(self);
+}
+
+void
+BackBuffer_Reset(BackBuffer *self)
+{
+ if (NULL == self)
+ return;
+
+ if (NULL != self->hdc)
+ {
+ if (NULL != self->previous)
+ SelectBitmap(self->hdc, self->previous);
+
+ DeleteDC(self->hdc);
+ }
+
+ if (NULL != self->bitmap)
+ {
+ DeleteObject(self->bitmap);
+ }
+
+ ZeroMemory(self, sizeof(BackBuffer));
+}
+
+BOOL
+BackBuffer_EnsureSize(BackBuffer *self, long width, long height)
+{
+ return BackBuffer_EnsureSizeEx(self, width, height, width, height);
+}
+
+BOOL
+BackBuffer_EnsureSizeEx(BackBuffer *self, long width, long height, long allocWidth, long allocHeight)
+{
+ BOOL result;
+ HDC windowDC;
+ HBITMAP bitmap;
+ long bitmapWidth, bitmapHeight;
+
+ if (NULL == self)
+ return FALSE;
+
+ if (width < 0)
+ width = 0;
+
+ if (height < 0)
+ height = 0;
+
+ if (NULL != self->bitmap)
+ {
+ BITMAP bitmapInfo;
+ if (sizeof(bitmapInfo) == GetObject(self->bitmap, sizeof(bitmapInfo), &bitmapInfo))
+ {
+ if (bitmapInfo.bmWidth >= width && bitmapInfo.bmHeight >= height)
+ return TRUE;
+
+ bitmapWidth = bitmapInfo.bmWidth;
+ bitmapHeight = bitmapInfo.bmHeight;
+ }
+ else
+ {
+ bitmapWidth = 0;
+ bitmapHeight = 0;
+ }
+ }
+ else
+ {
+ bitmapWidth = 0;
+ bitmapHeight = 0;
+ }
+
+ result = FALSE;
+ bitmap = NULL;
+
+ windowDC = GetDCEx(self->hwnd, NULL, DCX_CACHE | DCX_NORESETATTRS);
+ if(NULL != windowDC)
+ {
+ if (allocWidth < width)
+ allocWidth = width;
+
+ if (allocWidth < bitmapWidth)
+ allocWidth = bitmapWidth;
+
+ if (allocHeight < height)
+ allocHeight = height;
+
+ if (allocHeight < bitmapHeight)
+ allocHeight = bitmapHeight;
+
+ bitmap = CreateCompatibleBitmap(windowDC, allocWidth, allocHeight);
+ ReleaseDC(self->hwnd, windowDC);
+ }
+
+ if (NULL != bitmap)
+ {
+ if (NULL != self->hdc)
+ SelectBitmap(self->hdc, bitmap);
+
+ if (NULL != self->bitmap)
+ DeleteObject(self->bitmap);
+
+ self->bitmap = bitmap;
+ result = TRUE;
+ }
+
+ return result;
+}
+
+HDC
+BackBuffer_GetDC(BackBuffer *self)
+{
+ if (NULL == self)
+ return FALSE;
+
+ if (NULL == self->hdc)
+ {
+ HDC windowDC;
+ windowDC = GetDCEx(self->hwnd, NULL, DCX_CACHE | DCX_NORESETATTRS);
+ if (NULL != windowDC)
+ {
+ self->hdc = CreateCompatibleDC(windowDC);
+ ReleaseDC(self->hwnd, windowDC);
+
+ if (NULL != self->hdc)
+ {
+ if (NULL != self->bitmap)
+ self->previous = SelectBitmap(self->hdc, self->bitmap);
+ else
+ self->previous = GetCurrentBitmap(self->hdc);
+ }
+ }
+ }
+
+ return self->hdc;
+}
+
+BOOL
+BackBuffer_Copy(BackBuffer *self, HDC hdc, long x, long y, long width, long height)
+{
+ HDC sourceDC;
+
+ if (NULL == self || NULL == self->bitmap)
+ return FALSE;
+
+ sourceDC = BackBuffer_GetDC(self);
+ if (NULL == sourceDC)
+ return FALSE;
+
+ return BitBlt(hdc, x, y, width, height, sourceDC, 0, 0, SRCCOPY);
+}
+
+BOOL
+BackBuffer_DrawTextEx(BackBuffer *self, HDC hdc, const wchar_t *string,
+ int length, RECT *rect, unsigned int format,
+ HFONT font, COLORREF backColor, COLORREF textColor, int backMode)
+{
+ BOOL result = FALSE;
+ RECT bufferRect;
+
+ if (NULL == hdc || NULL == rect)
+ return FALSE;
+
+ SetRect(&bufferRect, 0, 0, RECTWIDTH(*rect), RECTHEIGHT(*rect));
+
+ if (NULL != self &&
+ FALSE != BackBuffer_EnsureSize(self, bufferRect.right, bufferRect.bottom))
+ {
+ HDC bufferDC = BackBuffer_GetDC(self);
+ if (NULL != bufferDC)
+ {
+ HFONT prevFont;
+ prevFont = SelectFont(bufferDC, font);
+ SetTextColor(bufferDC, textColor);
+ SetBkColor(bufferDC, backColor);
+ SetBkMode(bufferDC, backMode);
+
+ if (OPAQUE == backMode)
+ ExtTextOut(bufferDC, 0, 0, ETO_OPAQUE, &bufferRect, NULL, 0, NULL);
+
+ if (FALSE != DrawText(bufferDC, string, length, &bufferRect, format))
+ {
+ result = BackBuffer_Copy(self, hdc, rect->left, rect->top,
+ bufferRect.right, bufferRect.bottom);
+ }
+
+ SelectFont(bufferDC, prevFont);
+ }
+ }
+
+
+ if (FALSE == result)
+ {
+ HFONT prevFont;
+ COLORREF prevBackColor, prevTextColor;
+ int prevBkMode;
+
+ prevFont = SelectFont(hdc, font);
+ prevTextColor = SetTextColor(hdc, textColor);
+ prevBackColor = SetBkColor(hdc, backColor);
+ prevBkMode= SetBkMode(hdc, backMode);
+
+ result = DrawText(hdc, string, length, rect, format);
+
+ SelectFont(hdc, prevFont);
+ SetTextColor(hdc, prevTextColor);
+ SetBkColor(hdc, prevBackColor);
+ SetBkMode(hdc, prevBkMode);
+ }
+
+ return result;
+}
+
+BOOL
+BackBuffer_DrawText(BackBuffer *self, HDC hdc, const wchar_t *string,
+ int length, RECT *rect, unsigned int format)
+{
+ BOOL result = FALSE;
+ RECT bufferRect;
+
+ if (NULL == hdc || NULL == rect)
+ return FALSE;
+
+ SetRect(&bufferRect, 0, 0, RECTWIDTH(*rect), RECTHEIGHT(*rect));
+
+ if (NULL != self &&
+ FALSE != BackBuffer_EnsureSize(self, bufferRect.right, bufferRect.bottom))
+ {
+ HDC bufferDC = BackBuffer_GetDC(self);
+ if (NULL != bufferDC)
+ {
+ HFONT prevFont;
+ int backMode;
+ prevFont = SelectFont(bufferDC, GetCurrentFont(hdc));
+ SetTextColor(bufferDC, GetTextColor(hdc));
+ SetBkColor(bufferDC, GetBkColor(hdc));
+ backMode = GetBkMode(hdc);
+ SetBkMode(bufferDC, backMode);
+
+ if (OPAQUE == backMode)
+ ExtTextOut(bufferDC, 0, 0, ETO_OPAQUE, &bufferRect, NULL, 0, NULL);
+
+ if (FALSE != DrawText(bufferDC, string, length, &bufferRect, format))
+ {
+ result = BackBuffer_Copy(self, hdc, rect->left, rect->top,
+ bufferRect.right, bufferRect.bottom);
+ }
+
+ SelectFont(bufferDC, prevFont);
+ }
+ }
+
+ if (FALSE == result)
+ result = DrawText(hdc, string, length, rect, format);
+
+ return result;
+}