From fc58af98fde698fbaef1949e0467e67636368713 Mon Sep 17 00:00:00 2001 From: John Rassa Date: Wed, 3 Jul 2019 21:10:17 -0400 Subject: [PATCH] support for color gradients in drawRect and ImageComponent --- es-app/src/SystemScreenSaver.cpp | 8 +-- es-app/src/components/AsyncReqComponent.cpp | 2 +- .../src/components/ScraperSearchComponent.cpp | 4 +- es-app/src/components/TextListComponent.h | 17 +++++- es-app/src/views/SystemView.cpp | 14 ++++- es-app/src/views/SystemView.h | 2 + es-app/src/views/ViewController.cpp | 3 +- es-core/src/ThemeData.cpp | 6 +++ es-core/src/Window.cpp | 2 +- es-core/src/components/ComponentList.cpp | 12 ++--- .../src/components/DateTimeEditComponent.cpp | 2 +- es-core/src/components/ImageComponent.cpp | 53 +++++++++++++++---- es-core/src/components/ImageComponent.h | 4 ++ es-core/src/components/SliderComponent.cpp | 2 +- es-core/src/components/TextComponent.cpp | 10 ++-- es-core/src/components/TextEditComponent.cpp | 2 +- es-core/src/renderers/Renderer.cpp | 15 +++--- es-core/src/renderers/Renderer.h | 4 +- 18 files changed, 116 insertions(+), 46 deletions(-) diff --git a/es-app/src/SystemScreenSaver.cpp b/es-app/src/SystemScreenSaver.cpp index c5bcdf300..0543cfed1 100644 --- a/es-app/src/SystemScreenSaver.cpp +++ b/es-app/src/SystemScreenSaver.cpp @@ -209,7 +209,7 @@ void SystemScreenSaver::renderScreenSaver() { // Render black background Renderer::setMatrix(Transform4x4f::Identity()); - Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), (unsigned char)(255)); + Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0x000000FF, 0x000000FF); // Only render the video if the state requires it if ((int)mState >= STATE_FADE_IN_VIDEO) @@ -222,7 +222,7 @@ void SystemScreenSaver::renderScreenSaver() { // Render black background Renderer::setMatrix(Transform4x4f::Identity()); - Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), (unsigned char)(255)); + Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0x000000FF, 0x000000FF); // Only render the video if the state requires it if ((int)mState >= STATE_FADE_IN_VIDEO) @@ -248,8 +248,8 @@ void SystemScreenSaver::renderScreenSaver() else if (mState != STATE_INACTIVE) { Renderer::setMatrix(Transform4x4f::Identity()); - unsigned char opacity = screensaver_behavior == "dim" ? 0xA0 : 0xFF; - Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0x00000000 | opacity); + unsigned char color = screensaver_behavior == "dim" ? 0x000000A0 : 0x000000FF; + Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), color, color); } } diff --git a/es-app/src/components/AsyncReqComponent.cpp b/es-app/src/components/AsyncReqComponent.cpp index 6c811dcf8..e08b27f3c 100644 --- a/es-app/src/components/AsyncReqComponent.cpp +++ b/es-app/src/components/AsyncReqComponent.cpp @@ -42,7 +42,7 @@ void AsyncReqComponent::render(const Transform4x4f& /*parentTrans*/) Renderer::setMatrix(trans); Vector3f point(Math::cosf(mTime * 0.01f) * 12, Math::sinf(mTime * 0.01f) * 12, 0); - Renderer::drawRect((int)point.x(), (int)point.y(), 8, 8, 0x0000FFFF); + Renderer::drawRect((int)point.x(), (int)point.y(), 8, 8, 0x0000FFFF, 0x0000FFFF); } std::vector AsyncReqComponent::getHelpPrompts() diff --git a/es-app/src/components/ScraperSearchComponent.cpp b/es-app/src/components/ScraperSearchComponent.cpp index bc28d3b26..33f942dee 100644 --- a/es-app/src/components/ScraperSearchComponent.cpp +++ b/es-app/src/components/ScraperSearchComponent.cpp @@ -359,9 +359,9 @@ void ScraperSearchComponent::render(const Transform4x4f& parentTrans) if(mBlockAccept) { Renderer::setMatrix(trans); - Renderer::drawRect(0.f, 0.f, mSize.x(), mSize.y(), 0x00000011); + Renderer::drawRect(0.f, 0.f, mSize.x(), mSize.y(), 0x00000011, 0x00000011); //Renderer::drawRect((int)mResultList->getPosition().x(), (int)mResultList->getPosition().y(), - // (int)mResultList->getSize().x(), (int)mResultList->getSize().y(), 0x00000011); + // (int)mResultList->getSize().x(), (int)mResultList->getSize().y(), 0x0000011, 0x00000011); mBusyAnim.render(trans); } diff --git a/es-app/src/components/TextListComponent.h b/es-app/src/components/TextListComponent.h index 5e4c26b8e..44fcb3924 100644 --- a/es-app/src/components/TextListComponent.h +++ b/es-app/src/components/TextListComponent.h @@ -73,6 +73,8 @@ public: inline void setSelectorHeight(float selectorScale) { mSelectorHeight = selectorScale; } inline void setSelectorOffsetY(float selectorOffsetY) { mSelectorOffsetY = selectorOffsetY; } inline void setSelectorColor(unsigned int color) { mSelectorColor = color; } + inline void setSelectorColorEnd(unsigned int color) { mSelectorColorEnd = color; } + inline void setSelectorColorGradientHorizontal(bool horizontal) { mSelectorColorGradientHorizontal = horizontal; } inline void setSelectedColor(unsigned int color) { mSelectedColor = color; } inline void setColor(unsigned int id, unsigned int color) { mColors[id] = color; } inline void setLineSpacing(float lineSpacing) { mLineSpacing = lineSpacing; } @@ -97,6 +99,8 @@ private: float mSelectorHeight; float mSelectorOffsetY; unsigned int mSelectorColor; + unsigned int mSelectorColorEnd; + bool mSelectorColorGradientHorizontal = true; unsigned int mSelectedColor; std::string mScrollSound; static const unsigned int COLOR_ID_COUNT = 2; @@ -122,6 +126,8 @@ TextListComponent::TextListComponent(Window* window) : mSelectorHeight = mFont->getSize() * 1.5f; mSelectorOffsetY = 0; mSelectorColor = 0x000000FF; + mSelectorColorEnd = 0x000000FF; + mSelectorColorGradientHorizontal = true; mSelectedColor = 0; mColors[0] = 0x0000FFFF; mColors[1] = 0x00FF00FF; @@ -167,7 +173,8 @@ void TextListComponent::render(const Transform4x4f& parentTrans) mSelectorImage.render(trans); } else { Renderer::setMatrix(trans); - Renderer::drawRect(0.f, (mCursor - startEntry)*entrySize + mSelectorOffsetY, mSize.x(), mSelectorHeight, mSelectorColor); + Renderer::drawRect(0.f, (mCursor - startEntry)*entrySize + mSelectorOffsetY, mSize.x(), + mSelectorHeight, mSelectorColor, mSelectorColorEnd, mSelectorColorGradientHorizontal); } } @@ -363,7 +370,14 @@ void TextListComponent::applyTheme(const std::shared_ptr& theme, c if(properties & COLOR) { if(elem->has("selectorColor")) + { setSelectorColor(elem->get("selectorColor")); + setSelectorColorEnd(elem->get("selectorColor")); + } + if (elem->has("selectorColorEnd")) + setSelectorColorEnd(elem->get("selectorColorEnd")); + if (elem->has("selectorGradientType")) + setSelectorColorGradientHorizontal(!(elem->get("selectorGradientType").compare("horizontal"))); if(elem->has("selectedColor")) setSelectedColor(elem->get("selectedColor")); if(elem->has("primaryColor")) @@ -426,6 +440,7 @@ void TextListComponent::applyTheme(const std::shared_ptr& theme, c mSelectorImage.setImage(path, tile); mSelectorImage.setSize(mSize.x(), mSelectorHeight); mSelectorImage.setColorShift(mSelectorColor); + mSelectorImage.setColorShiftEnd(mSelectorColorEnd); } else { mSelectorImage.setImage(""); } diff --git a/es-app/src/views/SystemView.cpp b/es-app/src/views/SystemView.cpp index b3e48911a..e0a096ee9 100644 --- a/es-app/src/views/SystemView.cpp +++ b/es-app/src/views/SystemView.cpp @@ -434,7 +434,7 @@ void SystemView::renderCarousel(const Transform4x4f& trans) Renderer::pushClipRect(Vector2i((int)clipPos.x(), (int)clipPos.y()), Vector2i((int)mCarousel.size.x(), (int)mCarousel.size.y())); Renderer::setMatrix(carouselTrans); - Renderer::drawRect(0.0, 0.0, mCarousel.size.x(), mCarousel.size.y(), mCarousel.color); + Renderer::drawRect(0.0, 0.0, mCarousel.size.x(), mCarousel.size.y(), mCarousel.color, mCarousel.colorEnd, mCarousel.colorGradientHorizontal); // draw logos Vector2f logoSpacing(0.0, 0.0); // NB: logoSpacing will include the size of the logo itself as well! @@ -584,8 +584,9 @@ void SystemView::renderFade(const Transform4x4f& trans) // fade extras if necessary if (mExtrasFadeOpacity) { + unsigned int fadeColor = 0x00000000 | (unsigned char)(mExtrasFadeOpacity * 255); Renderer::setMatrix(trans); - Renderer::drawRect(0.0f, 0.0f, mSize.x(), mSize.y(), 0x00000000 | (unsigned char)(mExtrasFadeOpacity * 255)); + Renderer::drawRect(0.0f, 0.0f, mSize.x(), mSize.y(), fadeColor, fadeColor); } } @@ -602,6 +603,8 @@ void SystemView::getDefaultElements(void) mCarousel.origin.x() = 0.0f; mCarousel.origin.y() = 0.0f; mCarousel.color = 0xFFFFFFD8; + mCarousel.colorEnd = 0xFFFFFFD8; + mCarousel.colorGradientHorizontal = true; mCarousel.logoScale = 1.2f; mCarousel.logoRotation = 7.5; mCarousel.logoRotationOrigin.x() = -5; @@ -642,7 +645,14 @@ void SystemView::getCarouselFromTheme(const ThemeData::ThemeElement* elem) if (elem->has("origin")) mCarousel.origin = elem->get("origin"); if (elem->has("color")) + { mCarousel.color = elem->get("color"); + mCarousel.colorEnd = mCarousel.color; + } + if (elem->has("colorEnd")) + mCarousel.colorEnd = elem->get("colorEnd"); + if (elem->has("gradientType")) + mCarousel.colorGradientHorizontal = !(elem->get("gradientType").compare("horizontal")); if (elem->has("logoScale")) mCarousel.logoScale = elem->get("logoScale"); if (elem->has("logoSize")) diff --git a/es-app/src/views/SystemView.h b/es-app/src/views/SystemView.h index db1205424..85b0aca44 100644 --- a/es-app/src/views/SystemView.h +++ b/es-app/src/views/SystemView.h @@ -36,6 +36,8 @@ struct SystemViewCarousel Vector2f logoRotationOrigin; Alignment logoAlignment; unsigned int color; + unsigned int colorEnd; + bool colorGradientHorizontal; int maxLogoCount; // number of logos shown on the carousel Vector2f logoSize; float zIndex; diff --git a/es-app/src/views/ViewController.cpp b/es-app/src/views/ViewController.cpp index ada681e26..95ecbd861 100644 --- a/es-app/src/views/ViewController.cpp +++ b/es-app/src/views/ViewController.cpp @@ -422,8 +422,9 @@ void ViewController::render(const Transform4x4f& parentTrans) // fade out if(mFadeOpacity) { + unsigned int fadeColor = 0x00000000 | (unsigned char)(mFadeOpacity * 255); Renderer::setMatrix(parentTrans); - Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0x00000000 | (unsigned char)(mFadeOpacity * 255)); + Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), fadeColor, fadeColor); } } diff --git a/es-core/src/ThemeData.cpp b/es-core/src/ThemeData.cpp index 1d4f7628c..32faf12bb 100644 --- a/es-core/src/ThemeData.cpp +++ b/es-core/src/ThemeData.cpp @@ -24,6 +24,8 @@ std::map> The { "default", PATH }, { "tile", BOOLEAN }, { "color", COLOR }, + { "colorEnd", COLOR }, + { "gradientType", STRING }, { "visible", BOOLEAN }, { "zIndex", FLOAT } } }, { "imagegrid", { @@ -66,6 +68,8 @@ std::map> The { "selectorHeight", FLOAT }, { "selectorOffsetY", FLOAT }, { "selectorColor", COLOR }, + { "selectorColorEnd", COLOR }, + { "selectorGradientType", STRING }, { "selectorImagePath", PATH }, { "selectorImageTile", BOOLEAN }, { "selectedColor", COLOR }, @@ -148,6 +152,8 @@ std::map> The { "pos", NORMALIZED_PAIR }, { "origin", NORMALIZED_PAIR }, { "color", COLOR }, + { "colorEnd", COLOR }, + { "gradientType", STRING }, { "logoScale", FLOAT }, { "logoRotation", FLOAT }, { "logoRotationOrigin", NORMALIZED_PAIR }, diff --git a/es-core/src/Window.cpp b/es-core/src/Window.cpp index 0a510a5c1..35975c445 100644 --- a/es-core/src/Window.cpp +++ b/es-core/src/Window.cpp @@ -301,7 +301,7 @@ void Window::renderLoadingScreen(std::string text) { Transform4x4f trans = Transform4x4f::Identity(); Renderer::setMatrix(trans); - Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0x000000FF); + Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0x000000FF, 0x000000FF); ImageComponent splash(this, true); splash.setResize(Renderer::getScreenWidth() * 0.6f, 0.0f); diff --git a/es-core/src/components/ComponentList.cpp b/es-core/src/components/ComponentList.cpp index 74b6dfde6..c21c8308a 100644 --- a/es-core/src/components/ComponentList.cpp +++ b/es-core/src/components/ComponentList.cpp @@ -202,12 +202,12 @@ void ComponentList::render(const Transform4x4f& parentTrans) // (1 - dst) + 0x77 const float selectedRowHeight = getRowHeight(mEntries.at(mCursor).data); - Renderer::drawRect(0.0f, mSelectorBarOffset, mSize.x(), selectedRowHeight, 0xFFFFFFFF, Renderer::Blend::ONE_MINUS_DST_COLOR, Renderer::Blend::ZERO); - Renderer::drawRect(0.0f, mSelectorBarOffset, mSize.x(), selectedRowHeight, 0x777777FF, Renderer::Blend::ONE, Renderer::Blend::ONE); + Renderer::drawRect(0.0f, mSelectorBarOffset, mSize.x(), selectedRowHeight, 0xFFFFFFFF, 0xFFFFFFFF, false, Renderer::Blend::ONE_MINUS_DST_COLOR, Renderer::Blend::ZERO); + Renderer::drawRect(0.0f, mSelectorBarOffset, mSize.x(), selectedRowHeight, 0x777777FF, 0x777777FF, false, Renderer::Blend::ONE, Renderer::Blend::ONE); // hack to draw 2px dark on left/right of the bar - Renderer::drawRect(0.0f, mSelectorBarOffset, 2.0f, selectedRowHeight, 0x878787FF); - Renderer::drawRect(mSize.x() - 2.0f, mSelectorBarOffset, 2.0f, selectedRowHeight, 0x878787FF); + Renderer::drawRect(0.0f, mSelectorBarOffset, 2.0f, selectedRowHeight, 0x878787FF, 0x878787FF); + Renderer::drawRect(mSize.x() - 2.0f, mSelectorBarOffset, 2.0f, selectedRowHeight, 0x878787FF, 0x878787FF); for(auto it = drawAfterCursor.cbegin(); it != drawAfterCursor.cend(); it++) (*it)->render(trans); @@ -221,10 +221,10 @@ void ComponentList::render(const Transform4x4f& parentTrans) float y = 0; for(unsigned int i = 0; i < mEntries.size(); i++) { - Renderer::drawRect(0.0f, y, mSize.x(), 1.0f, 0xC6C7C6FF); + Renderer::drawRect(0.0f, y, mSize.x(), 1.0f, 0xC6C7C6FF, 0xC6C7C6FF); y += getRowHeight(mEntries.at(i).data); } - Renderer::drawRect(0.0f, y, mSize.x(), 1.0f, 0xC6C7C6FF); + Renderer::drawRect(0.0f, y, mSize.x(), 1.0f, 0xC6C7C6FF, 0xC6C7C6FF); Renderer::popClipRect(); } diff --git a/es-core/src/components/DateTimeEditComponent.cpp b/es-core/src/components/DateTimeEditComponent.cpp index fef38aa47..20440edc9 100644 --- a/es-core/src/components/DateTimeEditComponent.cpp +++ b/es-core/src/components/DateTimeEditComponent.cpp @@ -160,7 +160,7 @@ void DateTimeEditComponent::render(const Transform4x4f& parentTrans) if(mEditIndex >= 0 && (unsigned int)mEditIndex < mCursorBoxes.size()) { Renderer::drawRect((int)mCursorBoxes[mEditIndex][0], (int)mCursorBoxes[mEditIndex][1], - (int)mCursorBoxes[mEditIndex][2], (int)mCursorBoxes[mEditIndex][3], 0x00000022); + (int)mCursorBoxes[mEditIndex][2], (int)mCursorBoxes[mEditIndex][3], 0x00000022, 0x00000022); } } } diff --git a/es-core/src/components/ImageComponent.cpp b/es-core/src/components/ImageComponent.cpp index ced05a0cb..8f78aaac5 100644 --- a/es-core/src/components/ImageComponent.cpp +++ b/es-core/src/components/ImageComponent.cpp @@ -20,8 +20,8 @@ Vector2f ImageComponent::getSize() const ImageComponent::ImageComponent(Window* window, bool forceLoad, bool dynamic) : GuiComponent(window), mTargetIsMax(false), mTargetIsMin(false), mFlipX(false), mFlipY(false), mTargetSize(0, 0), mColorShift(0xFFFFFFFF), - mForceLoad(forceLoad), mDynamic(dynamic), mFadeOpacity(0), mFading(false), mRotateByTargetSize(false), - mTopLeftCrop(0.0f, 0.0f), mBottomRightCrop(1.0f, 1.0f) + mColorShiftEnd(0xFFFFFFFF), mColorGradientHorizontal(true), mForceLoad(forceLoad), mDynamic(dynamic), + mFadeOpacity(0), mFading(false), mRotateByTargetSize(false), mTopLeftCrop(0.0f, 0.0f), mBottomRightCrop(1.0f, 1.0f) { updateColors(); } @@ -253,6 +253,21 @@ void ImageComponent::setColorShift(unsigned int color) updateColors(); } +void ImageComponent::setColorShiftEnd(unsigned int color) +{ + mColorShiftEnd = color; + // Grab the opacity from the color shift because we may need to apply it if + // fading textures in + mOpacity = color & 0xff; + updateColors(); +} + +void ImageComponent::setColorGradientHorizontal(bool horizontal) +{ + mColorGradientHorizontal = horizontal; + updateColors(); +} + void ImageComponent::setOpacity(unsigned char opacity) { mOpacity = opacity; @@ -273,10 +288,11 @@ void ImageComponent::updateVertices() const float px = mTexture->isTiled() ? mSize.x() / getTextureSize().x() : 1.0f; const float py = mTexture->isTiled() ? mSize.y() / getTextureSize().y() : 1.0f; const unsigned int color = Renderer::convertColor(mColorShift); + const unsigned int colorEnd = Renderer::convertColor(mColorShiftEnd); mVertices[0] = { { topLeft.x(), topLeft.y() }, { mTopLeftCrop.x(), py - mTopLeftCrop.y() }, color }; - mVertices[1] = { { topLeft.x(), bottomRight.y() }, { mTopLeftCrop.x(), 1.0f - mBottomRightCrop.y() }, color }; - mVertices[2] = { { bottomRight.x(), topLeft.y() }, { mBottomRightCrop.x() * px, py - mTopLeftCrop.y() }, color }; + mVertices[1] = { { topLeft.x(), bottomRight.y() }, { mTopLeftCrop.x(), 1.0f - mBottomRightCrop.y() }, mColorGradientHorizontal ? colorEnd : color }; + mVertices[2] = { { bottomRight.x(), topLeft.y() }, { mBottomRightCrop.x() * px, py - mTopLeftCrop.y() }, mColorGradientHorizontal ? color : colorEnd }; mVertices[3] = { { bottomRight.x(), bottomRight.y() }, { mBottomRightCrop.x() * px, 1.0f - mBottomRightCrop.y() }, color }; if(mFlipX) @@ -293,10 +309,13 @@ void ImageComponent::updateVertices() void ImageComponent::updateColors() { - const unsigned int color = Renderer::convertColor(mColorShift); + const unsigned int color = Renderer::convertColor(mColorShift); + const unsigned int colorEnd = Renderer::convertColor(mColorShiftEnd); - for(int i = 0; i < 4; ++i) - mVertices[i].col = color; + mVertices[0].col = color; + mVertices[1].col = mColorGradientHorizontal ? colorEnd : color; + mVertices[2].col = mColorGradientHorizontal ? color : colorEnd; + mVertices[3].col = colorEnd; } void ImageComponent::render(const Transform4x4f& parentTrans) @@ -311,8 +330,8 @@ void ImageComponent::render(const Transform4x4f& parentTrans) { if(Settings::getInstance()->getBool("DebugImage")) { Vector2f targetSizePos = (mTargetSize - mSize) * mOrigin * -1; - Renderer::drawRect(targetSizePos.x(), targetSizePos.y(), mTargetSize.x(), mTargetSize.y(), 0xFF000033); - Renderer::drawRect(0.0f, 0.0f, mSize.x(), mSize.y(), 0x00000033); + Renderer::drawRect(targetSizePos.x(), targetSizePos.y(), mTargetSize.x(), mTargetSize.y(), 0xFF000033, 0xFF000033); + Renderer::drawRect(0.0f, 0.0f, mSize.x(), mSize.y(), 0x00000033, 0x00000033); } if(mTexture->isInitialized()) { @@ -420,8 +439,20 @@ void ImageComponent::applyTheme(const std::shared_ptr& theme, const s setImage(elem->get("path"), tile); } - if(properties & COLOR && elem->has("color")) - setColorShift(elem->get("color")); + if(properties & COLOR) + { + if(elem->has("color")) + { + setColorShift(elem->get("color")); + setColorShiftEnd(elem->get("color")); + } + + if (elem->has("colorEnd")) + setColorShiftEnd(elem->get("colorEnd")); + + if (elem->has("gradientType")) + setColorGradientHorizontal(!(elem->get("gradientType").compare("horizontal"))); + } if(properties & ThemeFlags::ROTATION) { if(elem->has("rotation")) diff --git a/es-core/src/components/ImageComponent.h b/es-core/src/components/ImageComponent.h index 9d3121c51..6d1945456 100644 --- a/es-core/src/components/ImageComponent.h +++ b/es-core/src/components/ImageComponent.h @@ -55,6 +55,8 @@ public: // Multiply all pixels in the image by this color when rendering. void setColorShift(unsigned int color); + void setColorShiftEnd(unsigned int color); + void setColorGradientHorizontal(bool horizontal); void setFlipX(bool flip); // Mirror on the X axis. void setFlipY(bool flip); // Mirror on the Y axis. @@ -89,6 +91,8 @@ private: void fadeIn(bool textureLoaded); unsigned int mColorShift; + unsigned int mColorShiftEnd; + bool mColorGradientHorizontal; std::string mDefaultPath; diff --git a/es-core/src/components/SliderComponent.cpp b/es-core/src/components/SliderComponent.cpp index bc4fa8d91..d027ee40c 100644 --- a/es-core/src/components/SliderComponent.cpp +++ b/es-core/src/components/SliderComponent.cpp @@ -72,7 +72,7 @@ void SliderComponent::render(const Transform4x4f& parentTrans) //render line const float lineWidth = 2; - Renderer::drawRect(mKnob.getSize().x() / 2, mSize.y() / 2 - lineWidth / 2, width, lineWidth, 0x777777FF); + Renderer::drawRect(mKnob.getSize().x() / 2, mSize.y() / 2 - lineWidth / 2, width, lineWidth, 0x777777FF, 0x777777FF); //render knob mKnob.render(trans); diff --git a/es-core/src/components/TextComponent.cpp b/es-core/src/components/TextComponent.cpp index 057e9c1e1..ba5c03f68 100644 --- a/es-core/src/components/TextComponent.cpp +++ b/es-core/src/components/TextComponent.cpp @@ -102,7 +102,7 @@ void TextComponent::render(const Transform4x4f& parentTrans) if (mRenderBackground) { Renderer::setMatrix(trans); - Renderer::drawRect(0.f, 0.f, mSize.x(), mSize.y(), mBgColor); + Renderer::drawRect(0.f, 0.f, mSize.x(), mSize.y(), mBgColor, mBgColor); } if(mTextCache) @@ -127,7 +127,7 @@ void TextComponent::render(const Transform4x4f& parentTrans) { // draw the "textbox" area, what we are aligned within Renderer::setMatrix(trans); - Renderer::drawRect(0.f, 0.f, mSize.x(), mSize.y(), 0xFF000033); + Renderer::drawRect(0.f, 0.f, mSize.x(), mSize.y(), 0xFF000033, 0xFF000033); } trans.translate(off); @@ -140,13 +140,13 @@ void TextComponent::render(const Transform4x4f& parentTrans) switch(mHorizontalAlignment) { case ALIGN_LEFT: - Renderer::drawRect(0.0f, 0.0f, mTextCache->metrics.size.x(), mTextCache->metrics.size.y(), 0x00000033); + Renderer::drawRect(0.0f, 0.0f, mTextCache->metrics.size.x(), mTextCache->metrics.size.y(), 0x00000033, 0x00000033); break; case ALIGN_CENTER: - Renderer::drawRect((mSize.x() - mTextCache->metrics.size.x()) / 2.0f, 0.0f, mTextCache->metrics.size.x(), mTextCache->metrics.size.y(), 0x00000033); + Renderer::drawRect((mSize.x() - mTextCache->metrics.size.x()) / 2.0f, 0.0f, mTextCache->metrics.size.x(), mTextCache->metrics.size.y(), 0x00000033, 0x00000033); break; case ALIGN_RIGHT: - Renderer::drawRect(mSize.x() - mTextCache->metrics.size.x(), 0.0f, mTextCache->metrics.size.x(), mTextCache->metrics.size.y(), 0x00000033); + Renderer::drawRect(mSize.x() - mTextCache->metrics.size.x(), 0.0f, mTextCache->metrics.size.x(), mTextCache->metrics.size.y(), 0x00000033, 0x00000033); break; } } diff --git a/es-core/src/components/TextEditComponent.cpp b/es-core/src/components/TextEditComponent.cpp index d30c293c8..dcd9b4647 100644 --- a/es-core/src/components/TextEditComponent.cpp +++ b/es-core/src/components/TextEditComponent.cpp @@ -279,7 +279,7 @@ void TextEditComponent::render(const Transform4x4f& parentTrans) } float cursorHeight = mFont->getHeight() * 0.8f; - Renderer::drawRect(cursorPos.x(), cursorPos.y() + (mFont->getHeight() - cursorHeight) / 2, 2.0f, cursorHeight, 0x000000FF); + Renderer::drawRect(cursorPos.x(), cursorPos.y() + (mFont->getHeight() - cursorHeight) / 2, 2.0f, cursorHeight, 0x000000FF, 0x000000FF); } } diff --git a/es-core/src/renderers/Renderer.cpp b/es-core/src/renderers/Renderer.cpp index 65b5fedf9..42c0fe698 100644 --- a/es-core/src/renderers/Renderer.cpp +++ b/es-core/src/renderers/Renderer.cpp @@ -236,21 +236,22 @@ namespace Renderer } // popClipRect - void drawRect(const float _x, const float _y, const float _w, const float _h, const unsigned int _color, const Blend::Factor _srcBlendFactor, const Blend::Factor _dstBlendFactor) + void drawRect(const float _x, const float _y, const float _w, const float _h, const unsigned int _color, const unsigned int _colorEnd, bool horizontalGradient, const Blend::Factor _srcBlendFactor, const Blend::Factor _dstBlendFactor) { - drawRect((int)Math::round(_x), (int)Math::round(_y), (int)Math::round(_w), (int)Math::round(_h), _color, _srcBlendFactor, _dstBlendFactor); + drawRect((int)Math::round(_x), (int)Math::round(_y), (int)Math::round(_w), (int)Math::round(_h), _color, _colorEnd, horizontalGradient, _srcBlendFactor, _dstBlendFactor); } // drawRect - void drawRect(const int _x, const int _y, const int _w, const int _h, const unsigned int _color, const Blend::Factor _srcBlendFactor, const Blend::Factor _dstBlendFactor) + void drawRect(const int _x, const int _y, const int _w, const int _h, const unsigned int _color, const unsigned int _colorEnd, bool horizontalGradient, const Blend::Factor _srcBlendFactor, const Blend::Factor _dstBlendFactor) { - const unsigned int color = convertColor(_color); + const unsigned int color = convertColor(_color); + const unsigned int colorEnd = convertColor(_colorEnd); Vertex vertices[4]; vertices[0] = { { (float)(_x ), (float)(_y ) }, { 0.0f, 0.0f }, color }; - vertices[1] = { { (float)(_x ), (float)(_y + _h) }, { 0.0f, 0.0f }, color }; - vertices[2] = { { (float)(_x + _w), (float)(_y ) }, { 0.0f, 0.0f }, color }; - vertices[3] = { { (float)(_x + _w), (float)(_y + _h) }, { 0.0f, 0.0f }, color }; + vertices[1] = { { (float)(_x ), (float)(_y + _h) }, { 0.0f, 0.0f }, horizontalGradient ? colorEnd : color }; + vertices[2] = { { (float)(_x + _w), (float)(_y ) }, { 0.0f, 0.0f }, horizontalGradient ? color : colorEnd }; + vertices[3] = { { (float)(_x + _w), (float)(_y + _h) }, { 0.0f, 0.0f }, colorEnd }; bindTexture(0); drawTriangleStrips(vertices, 4, _srcBlendFactor, _dstBlendFactor); diff --git a/es-core/src/renderers/Renderer.h b/es-core/src/renderers/Renderer.h index f54238575..4fcaa1a9b 100644 --- a/es-core/src/renderers/Renderer.h +++ b/es-core/src/renderers/Renderer.h @@ -66,8 +66,8 @@ namespace Renderer void deinit (); void pushClipRect (const Vector2i& _pos, const Vector2i& _size); void popClipRect (); - void drawRect (const float _x, const float _y, const float _w, const float _h, const unsigned int _color, const Blend::Factor _srcBlendFactor = Blend::SRC_ALPHA, const Blend::Factor _dstBlendFactor = Blend::ONE_MINUS_SRC_ALPHA); - void drawRect (const int _x, const int _y, const int _w, const int _h, const unsigned int _color, const Blend::Factor _srcBlendFactor = Blend::SRC_ALPHA, const Blend::Factor _dstBlendFactor = Blend::ONE_MINUS_SRC_ALPHA); + void drawRect (const float _x, const float _y, const float _w, const float _h, const unsigned int _color, const unsigned int _colorEnd, bool horizontalGradient = false, const Blend::Factor _srcBlendFactor = Blend::SRC_ALPHA, const Blend::Factor _dstBlendFactor = Blend::ONE_MINUS_SRC_ALPHA); + void drawRect (const int _x, const int _y, const int _w, const int _h, const unsigned int _color, const unsigned int _colorEnd, bool horizontalGradient = false, const Blend::Factor _srcBlendFactor = Blend::SRC_ALPHA, const Blend::Factor _dstBlendFactor = Blend::ONE_MINUS_SRC_ALPHA); SDL_Window* getSDLWindow (); int getWindowWidth ();