diff --git a/BeefLibs/Beefy2D/src/gfx/Color.bf b/BeefLibs/Beefy2D/src/gfx/Color.bf index 7535a79e..af256e5e 100644 --- a/BeefLibs/Beefy2D/src/gfx/Color.bf +++ b/BeefLibs/Beefy2D/src/gfx/Color.bf @@ -154,5 +154,10 @@ namespace Beefy.gfx { return (color & 0xFF00FF00) | ((color & 0x00FF0000) >> 16) | ((color & 0x000000FF) << 16); } + + public static uint32 FromNative(Color color) + { + return (color & 0xFF00FF00) | ((color & 0x00FF0000) >> 16) | ((color & 0x000000FF) << 16); + } } } diff --git a/BeefLibs/Beefy2D/src/gfx/Image.bf b/BeefLibs/Beefy2D/src/gfx/Image.bf index 275ceaf8..5a2725bd 100644 --- a/BeefLibs/Beefy2D/src/gfx/Image.bf +++ b/BeefLibs/Beefy2D/src/gfx/Image.bf @@ -12,7 +12,15 @@ namespace Beefy.gfx { #if !STUDIO_CLIENT public class Image : IDrawable - { + { + enum LoadFlags + { + None = 0, + Additive = 1, + NoPremult = 2, + AllowRead = 4 + } + public Image mSrcTexture; public int32 mSrcX; public int32 mSrcY; @@ -29,7 +37,7 @@ namespace Beefy.gfx public static extern void Gfx_DrawTextureSegment(void* textureSegment, float a, float b, float c, float d, float tx, float ty, float z, uint32 color, int32 pixelSnapping); [StdCall, CLink] - static extern void* Gfx_LoadTexture(char8* fileName, int32 additive); + static extern void* Gfx_LoadTexture(char8* fileName, int32 flags); [StdCall, CLink] static extern void* Gfx_CreateDynTexture(int32 width, int32 height); @@ -49,6 +57,9 @@ namespace Beefy.gfx [StdCall, CLink] static extern void Gfx_Texture_SetBits(void* textureSegment, int32 destX, int32 destY, int32 destWidth, int32 destHeight, int32 srcPitch, uint32* bits); + [StdCall, CLink] + static extern void Gfx_Texture_GetBits(void* textureSegment, int32 srcX, int32 srcY, int32 srcWidth, int32 srcHeight, int32 destPitch, uint32* bits); + [StdCall, CLink] static extern void Gfx_Texture_Delete(void* textureSegment); @@ -82,11 +93,11 @@ namespace Beefy.gfx return CreateFromNativeTextureSegment(aNativeTextureSegment); } - public static Image LoadFromFile(String fileName, bool additive = false) + public static Image LoadFromFile(String fileName, LoadFlags flags = .None) { scope AutoBeefPerf("Image.LoadFromFile"); - void* aNativeTextureSegment = Gfx_LoadTexture(fileName, additive ? 1 : 0); + void* aNativeTextureSegment = Gfx_LoadTexture(fileName, (int32)flags); if (aNativeTextureSegment == null) return null; @@ -175,6 +186,11 @@ namespace Beefy.gfx Gfx_Texture_SetBits(mNativeTextureSegment, (.)destX, (.)destY, (.)destWidth, (.)destHeight, (.)srcPitch, bits); } + public void GetBits(int srcX, int srcY, int srcWidth, int srcHeight, int destPitch, uint32* bits) + { + Gfx_Texture_GetBits(mNativeTextureSegment, (.)srcX, (.)srcY, (.)srcWidth, (.)srcHeight, (.)destPitch, bits); + } + public void CreateImageCels(Image[,] celImages) { int32 rows = (int32)celImages.GetLength(0); diff --git a/BeefLibs/Beefy2D/src/theme/dark/DarkTheme.bf b/BeefLibs/Beefy2D/src/theme/dark/DarkTheme.bf index 7c7bd37b..dfdd081d 100644 --- a/BeefLibs/Beefy2D/src/theme/dark/DarkTheme.bf +++ b/BeefLibs/Beefy2D/src/theme/dark/DarkTheme.bf @@ -183,13 +183,11 @@ namespace Beefy.theme.dark COUNT }; - public const uint32 COLOR_WINDOW = 0xFF595959; - public const uint32 COLOR_BKG = 0xFF262626; - public const uint32 COLOR_SELECTED_OUTLINE = 0xFFE6A800; - public const uint32 COLOR_MENU_FOCUSED = 0xFFFFA000; - public const uint32 COLOR_MENU_SELECTED = 0xFFD0A070; - public const uint32 COLOR_TIMELINE_SEP = 0xFF202020; - public const uint32 COLOR_TIMELINE_RULE = 0xFF4A4A4A; + public static uint32 COLOR_WINDOW = 0xFF595959; + public static uint32 COLOR_BKG = 0xFF262626; + public static uint32 COLOR_SELECTED_OUTLINE = 0xFFE6A800; + public static uint32 COLOR_MENU_FOCUSED = 0xFFFFA000; + public static uint32 COLOR_MENU_SELECTED = 0xFFD0A070; public static float sScale = 1.0f; public static int32 sSrcImgScale = 1; @@ -309,6 +307,16 @@ namespace Beefy.theme.dark delete mWindowTopImage; } + Image themeImg = Image.LoadFromFile(scope String..Append(tempStr, BFApp.sApp.mInstallDir, "images/DarkTheme.png"), .AllowRead); + defer delete themeImg; + uint32[5] bits = ?; + themeImg.GetBits(0, 0, bits.Count, 1, bits.Count, &bits); + COLOR_WINDOW = Color.FromNative(bits[0]); + COLOR_BKG = Color.FromNative(bits[1]); + COLOR_SELECTED_OUTLINE = Color.FromNative(bits[2]); + COLOR_MENU_FOCUSED = Color.FromNative(bits[3]); + COLOR_MENU_SELECTED = Color.FromNative(bits[4]); + String uiFileName = null; switch (sSrcImgScale) { diff --git a/BeefySysLib/BeefySysLib.cpp b/BeefySysLib/BeefySysLib.cpp index 8c04112c..7311d35f 100644 --- a/BeefySysLib/BeefySysLib.cpp +++ b/BeefySysLib/BeefySysLib.cpp @@ -422,6 +422,11 @@ BF_EXPORT void BF_CALLTYPE Gfx_Texture_SetBits(TextureSegment* textureSegment, i textureSegment->mTexture->SetBits(destX, destY, destWidth, destHeight, srcPitch, bits); } +BF_EXPORT void BF_CALLTYPE Gfx_Texture_GetBits(TextureSegment* textureSegment, int srcX, int srcY, int srcWidth, int srcHeight, int destPitch, uint32* bits) +{ + textureSegment->mTexture->GetBits(srcX, srcY, srcWidth, srcHeight, destPitch, bits); +} + BF_EXPORT void BF_CALLTYPE Gfx_Texture_Delete(TextureSegment* textureSegment) { textureSegment->mTexture->Release(); diff --git a/BeefySysLib/gfx/RenderDevice.h b/BeefySysLib/gfx/RenderDevice.h index 7e766ec2..7c0b1f0c 100644 --- a/BeefySysLib/gfx/RenderDevice.h +++ b/BeefySysLib/gfx/RenderDevice.h @@ -146,7 +146,8 @@ enum CullMode : int8 enum TextureFlag : int8 { TextureFlag_Additive = 1, - TextureFlag_NoPremult = 2 + TextureFlag_NoPremult = 2, + TextureFlag_AllowRead = 4, }; struct VertexDefData diff --git a/BeefySysLib/gfx/Texture.h b/BeefySysLib/gfx/Texture.h index b88ac59c..1c7ead24 100644 --- a/BeefySysLib/gfx/Texture.h +++ b/BeefySysLib/gfx/Texture.h @@ -22,6 +22,7 @@ public: virtual void Blt(ImageData* imageData, int x, int y) { }; virtual void SetBits(int destX, int destY, int destWidth, int destHeight, int srcPitch, uint32* bits) {} + virtual void GetBits(int srcX, int srcY, int srcWidth, int srcHeight, int destPitch, uint32* bits) {} }; class TextureSegment diff --git a/BeefySysLib/platform/win/DXRenderDevice.cpp b/BeefySysLib/platform/win/DXRenderDevice.cpp index 0489907c..806df23f 100644 --- a/BeefySysLib/platform/win/DXRenderDevice.cpp +++ b/BeefySysLib/platform/win/DXRenderDevice.cpp @@ -216,6 +216,48 @@ void DXTexture::SetBits(int destX, int destY, int destWidth, int destHeight, int mRenderDevice->mD3DDeviceContext->UpdateSubresource(mD3DTexture, 0, &box, bits, srcPitch * sizeof(uint32), 0); } +void DXTexture::GetBits(int srcX, int srcY, int srcWidth, int srcHeight, int destPitch, uint32* bits) +{ + D3D11_TEXTURE2D_DESC texDesc; + texDesc.ArraySize = 1; + texDesc.BindFlags = 0; + texDesc.CPUAccessFlags = 0; + texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + texDesc.Width = srcWidth; + texDesc.Height = srcHeight; + texDesc.MipLevels = 1; + texDesc.MiscFlags = 0; + texDesc.SampleDesc.Count = 1; + texDesc.SampleDesc.Quality = 0; + texDesc.Usage = D3D11_USAGE_STAGING; + texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + + D3D11_BOX srcBox = { 0 }; + srcBox.left = srcX; + srcBox.top = srcY; + srcBox.right = srcX + srcWidth; + srcBox.bottom = srcY + srcHeight; + srcBox.back = 1; + + ID3D11Texture2D *texture; + DXCHECK(mRenderDevice->mD3DDevice->CreateTexture2D(&texDesc, 0, &texture)); + mRenderDevice->mD3DDeviceContext->CopySubresourceRegion(texture, 0, 0, 0, 0, mD3DTexture, 0, &srcBox); + + D3D11_MAPPED_SUBRESOURCE mapTex; + DXCHECK(mRenderDevice->mD3DDeviceContext->Map(texture, 0, D3D11_MAP_READ, NULL, &mapTex)); + + uint8* srcPtr = (uint8*) mapTex.pData; + uint8* destPtr = (uint8*) bits; + for (int y = 0; y < srcHeight; y++) + { + memcpy(destPtr, srcPtr, srcWidth*sizeof(uint32)); + srcPtr += mapTex.RowPitch; + destPtr += destPitch * 4; + } + mRenderDevice->mD3DDeviceContext->Unmap(texture, 0); + texture->Release(); +} + /// static int GetPowerOfTwo(int input) diff --git a/BeefySysLib/platform/win/DXRenderDevice.h b/BeefySysLib/platform/win/DXRenderDevice.h index ef74130f..9cc6e8e3 100644 --- a/BeefySysLib/platform/win/DXRenderDevice.h +++ b/BeefySysLib/platform/win/DXRenderDevice.h @@ -72,6 +72,7 @@ public: virtual void PhysSetAsTarget() override; virtual void Blt(ImageData* imageData, int x, int y) override; virtual void SetBits(int destX, int destY, int destWidth, int destHeight, int srcPitch, uint32* bits) override; + virtual void GetBits(int srcX, int srcY, int srcWidth, int srcHeight, int destPitch, uint32* bits) override; }; class DXShaderParam : public ShaderParam diff --git a/IDE/dist/images/DarkTheme.png b/IDE/dist/images/DarkTheme.png new file mode 100644 index 00000000..aceb5488 Binary files /dev/null and b/IDE/dist/images/DarkTheme.png differ diff --git a/IDE/dist/images/LaoUI.ttf b/IDE/dist/images/LaoUI.ttf new file mode 100644 index 00000000..f016aaf5 Binary files /dev/null and b/IDE/dist/images/LaoUI.ttf differ diff --git a/IDE/src/ui/StatusBar.bf b/IDE/src/ui/StatusBar.bf index 6e02f062..1b6da8a6 100644 --- a/IDE/src/ui/StatusBar.bf +++ b/IDE/src/ui/StatusBar.bf @@ -215,9 +215,9 @@ namespace IDE.ui if (atError) bkgColor = 0xFF800000; if (gApp.IsCompiling) - bkgColor = 0xFF303060; + bkgColor = 0xFF35306A; else if (gApp.mDebugger.mIsRunning) - bkgColor = 0xFFCA5100; + bkgColor = 0xFFB65D08; else if (gApp.AreTestsRunning()) bkgColor = 0xFF562143;