// Render out the fixed bitmap borders based on a multiplier into the bitmap array // It renders left and right caps, with a sizable fill area in the middle to reach // the x extent. It does not stretch in the y direction. void renderFixedBitmapBordersFilled( const RectI &bounds, S32 baseMultiplier, GuiControlProfile *profile ) { // Indices into the bitmap array S32 numBitmaps = 3; S32 borderLeft = numBitmaps * baseMultiplier - numBitmaps; S32 fill = 1 + borderLeft; S32 borderRight = 2 + borderLeft; GFXDrawUtil *drawer = GFX->getDrawUtil(); drawer->clearBitmapModulation(); if(profile->mBitmapArrayRects.size() >= (numBitmaps * baseMultiplier)) { RectI destRect; RectI stretchRect; RectI* mBitmapBounds = profile->mBitmapArrayRects.address(); // Draw all corners first. //left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y),mBitmapBounds[borderLeft]); //right border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x + bounds.extent.x - mBitmapBounds[borderRight].extent.x,bounds.point.y),mBitmapBounds[borderRight]); // End drawing corners // Begin drawing fill //fill stretch destRect.point.x = bounds.point.x + mBitmapBounds[borderLeft].extent.x; destRect.extent.x = (bounds.extent.x) - mBitmapBounds[borderLeft].extent.x - mBitmapBounds[borderRight].extent.x; destRect.extent.y = mBitmapBounds[fill].extent.y; destRect.point.y = bounds.point.y; //stretch it stretchRect = mBitmapBounds[fill]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); // End drawing fill } }
void GuiProgressBitmapCtrl::onRender(Point2I offset, const RectI &updateRect) { RectI ctrlRect(offset, getExtent()); //grab lowest dimension if(getHeight() <= getWidth()) mDim = getHeight(); else mDim = getWidth(); GFXDrawUtil* drawUtil = GFX->getDrawUtil(); drawUtil->clearBitmapModulation(); if(mNumberOfBitmaps == 1) { //draw the progress with image S32 width = (S32)((F32)(getWidth()) * mProgress); if (width > 0) { //drawing stretch bitmap RectI progressRect = ctrlRect; progressRect.extent.x = width; drawUtil->drawBitmapStretchSR(mProfile->mTextureObject, progressRect, mProfile->mBitmapArrayRects[0]); } } else if(mNumberOfBitmaps >= 3) { //drawing left-end bitmap RectI progressRectLeft(ctrlRect.point.x, ctrlRect.point.y, mDim, mDim); drawUtil->drawBitmapStretchSR(mProfile->mTextureObject, progressRectLeft, mProfile->mBitmapArrayRects[0]); //draw the progress with image S32 width = (S32)((F32)(getWidth()) * mProgress); if (width > mDim) { //drawing stretch bitmap RectI progressRect = ctrlRect; progressRect.point.x += mDim; progressRect.extent.x = (width - mDim - mDim); if (progressRect.extent.x < 0) progressRect.extent.x = 0; drawUtil->drawBitmapStretchSR(mProfile->mTextureObject, progressRect, mProfile->mBitmapArrayRects[1]); //drawing right-end bitmap RectI progressRectRight(progressRect.point.x + progressRect.extent.x, ctrlRect.point.y, mDim, mDim ); drawUtil->drawBitmapStretchSR(mProfile->mTextureObject, progressRectRight, mProfile->mBitmapArrayRects[2]); } } else Con::warnf("guiProgressBitmapCtrl only processes an array of bitmaps == 1 or >= 3"); //if there's a border, draw it if (mProfile->mBorder) drawUtil->drawRect(ctrlRect, mProfile->mBorderColor); Parent::onRender( offset, updateRect ); //render the children renderChildControls(offset, updateRect); }
void renderBorder( const RectI &bounds, GuiControlProfile *profile ) { S32 l = bounds.point.x, r = bounds.point.x + bounds.extent.x - 1; S32 t = bounds.point.y, b = bounds.point.y + bounds.extent.y - 1; GFXDrawUtil *drawer = GFX->getDrawUtil(); switch(profile->mBorder) { case 1: drawer->drawRect(bounds, profile->mBorderColor); break; case 2: drawer->drawLine(l + 1, t + 1, l + 1, b - 2, profile->mBevelColorHL); drawer->drawLine(l + 2, t + 1, r - 2, t + 1, profile->mBevelColorHL); drawer->drawLine(r, t, r, b, profile->mBevelColorHL); drawer->drawLine(l, b, r - 1, b, profile->mBevelColorHL); drawer->drawLine(l, t, r - 1, t, profile->mBorderColorNA); drawer->drawLine(l, t + 1, l, b - 1, profile->mBorderColorNA); drawer->drawLine(l + 1, b - 1, r - 1, b - 1, profile->mBorderColorNA); drawer->drawLine(r - 1, t + 1, r - 1, b - 2, profile->mBorderColorNA); break; case 3: drawer->drawLine(l, b, r, b, profile->mBevelColorHL); drawer->drawLine(r, t, r, b - 1, profile->mBevelColorHL); drawer->drawLine(l + 1, b - 1, r - 1, b - 1, profile->mFillColor); drawer->drawLine(r - 1, t + 1, r - 1, b - 2, profile->mFillColor); drawer->drawLine(l, t, l, b - 1, profile->mBorderColorNA); drawer->drawLine(l + 1, t, r - 1, t, profile->mBorderColorNA); drawer->drawLine(l + 1, t + 1, l + 1, b - 2, profile->mBevelColorLL); drawer->drawLine(l + 2, t + 1, r - 2, t + 1, profile->mBevelColorLL); break; case 4: drawer->drawLine(l, t, l, b - 1, profile->mBevelColorHL); drawer->drawLine(l + 1, t, r, t, profile->mBevelColorHL); drawer->drawLine(l, b, r, b, profile->mBevelColorLL); drawer->drawLine(r, t + 1, r, b - 1, profile->mBevelColorLL); drawer->drawLine(l + 1, b - 1, r - 1, b - 1, profile->mBorderColor); drawer->drawLine(r - 1, t + 1, r - 1, b - 2, profile->mBorderColor); break; case 5: renderFilledBorder( bounds, profile ); break; // case -1: // Draw a simple sizable border with corners // Taken from the 'Skinnable GUI Controls in TGE' resource by Justin DuJardin if(profile->mBitmapArrayRects.size() >= 8) { drawer->clearBitmapModulation(); RectI destRect; RectI stretchRect; RectI* mBitmapBounds = profile->mBitmapArrayRects.address(); // Indices into the bitmap array enum { BorderTopLeft = 0, BorderTop, BorderTopRight, BorderLeft, //Fill, BorderRight, BorderBottomLeft, BorderBottom, BorderBottomRight, NumBitmaps }; // Draw all corners first. //top left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y),mBitmapBounds[BorderTopLeft]); //top right border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x + bounds.extent.x - mBitmapBounds[BorderTopRight].extent.x,bounds.point.y),mBitmapBounds[BorderTopRight]); //bottom left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y + bounds.extent.y - mBitmapBounds[BorderBottomLeft].extent.y),mBitmapBounds[BorderBottomLeft]); //bottom right border drawer->drawBitmapSR(profile->mTextureObject,Point2I( bounds.point.x + bounds.extent.x - mBitmapBounds[BorderBottomRight].extent.x, bounds.point.y + bounds.extent.y - mBitmapBounds[BorderBottomRight].extent.y), mBitmapBounds[BorderBottomRight]); // End drawing corners // Begin drawing sides and top stretched borders //start with top line stretch destRect.point.x = bounds.point.x + mBitmapBounds[BorderTopLeft].extent.x; destRect.extent.x = bounds.extent.x - mBitmapBounds[BorderTopRight].extent.x - mBitmapBounds[BorderTopLeft].extent.x; destRect.extent.y = mBitmapBounds[BorderTop].extent.y; destRect.point.y = bounds.point.y; //stretch it stretchRect = mBitmapBounds[BorderTop]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //bottom line stretch destRect.point.x = bounds.point.x + mBitmapBounds[BorderBottomLeft].extent.x; destRect.extent.x = bounds.extent.x - mBitmapBounds[BorderBottomRight].extent.x - mBitmapBounds[BorderBottomLeft].extent.x; destRect.extent.y = mBitmapBounds[BorderBottom].extent.y; destRect.point.y = bounds.point.y + bounds.extent.y - mBitmapBounds[BorderBottom].extent.y; //stretch it stretchRect = mBitmapBounds[BorderBottom]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //left line stretch destRect.point.x = bounds.point.x; destRect.extent.x = mBitmapBounds[BorderLeft].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[BorderTopLeft].extent.y - mBitmapBounds[BorderBottomLeft].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[BorderTopLeft].extent.y; //stretch it stretchRect = mBitmapBounds[BorderLeft]; stretchRect.inset(0,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //right line stretch destRect.point.x = bounds.point.x + bounds.extent.x - mBitmapBounds[BorderRight].extent.x; destRect.extent.x = mBitmapBounds[BorderRight].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[BorderTopRight].extent.y - mBitmapBounds[BorderBottomRight].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[BorderTopRight].extent.y; //stretch it stretchRect = mBitmapBounds[BorderRight]; stretchRect.inset(0,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); // End drawing sides and top stretched borders break; } case -2: // Draw a simple sizable border with corners that is filled in renderSizableBitmapBordersFilled(bounds, 1, profile); break; case -3: // Draw a simple fixed height border with center fill horizontally. renderFixedBitmapBordersFilled( bounds, 1, profile ); break; } }
// Render out the sizable bitmap borders based on a multiplier into the bitmap array // Based on the 'Skinnable GUI Controls in TGE' resource by Justin DuJardin void renderSizableBitmapBordersFilledIndex( const RectI &bounds, S32 startIndex, GuiControlProfile *profile ) { // Indices into the bitmap array S32 numBitmaps = 9; S32 borderTopLeft = startIndex; S32 borderTop = 1 + borderTopLeft; S32 borderTopRight = 2 + borderTopLeft; S32 borderLeft = 3 + borderTopLeft; S32 fill = 4 + borderTopLeft; S32 borderRight = 5 + borderTopLeft; S32 borderBottomLeft = 6 + borderTopLeft; S32 borderBottom = 7 + borderTopLeft; S32 borderBottomRight = 8 + borderTopLeft; GFXDrawUtil *drawer = GFX->getDrawUtil(); drawer->clearBitmapModulation(); if(profile->mBitmapArrayRects.size() >= (startIndex + numBitmaps)) { RectI destRect; RectI stretchRect; RectI* mBitmapBounds = profile->mBitmapArrayRects.address(); // Draw all corners first. //top left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y),mBitmapBounds[borderTopLeft]); //top right border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x + bounds.extent.x - mBitmapBounds[borderTopRight].extent.x,bounds.point.y),mBitmapBounds[borderTopRight]); //bottom left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y + bounds.extent.y - mBitmapBounds[borderBottomLeft].extent.y),mBitmapBounds[borderBottomLeft]); //bottom right border drawer->drawBitmapSR(profile->mTextureObject,Point2I( bounds.point.x + bounds.extent.x - mBitmapBounds[borderBottomRight].extent.x, bounds.point.y + bounds.extent.y - mBitmapBounds[borderBottomRight].extent.y), mBitmapBounds[borderBottomRight]); // End drawing corners // Begin drawing sides and top stretched borders //start with top line stretch destRect.point.x = bounds.point.x + mBitmapBounds[borderTopLeft].extent.x; destRect.extent.x = bounds.extent.x - mBitmapBounds[borderTopRight].extent.x - mBitmapBounds[borderTopLeft].extent.x; destRect.extent.y = mBitmapBounds[borderTop].extent.y; destRect.point.y = bounds.point.y; //stretch it stretchRect = mBitmapBounds[borderTop]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //bottom line stretch destRect.point.x = bounds.point.x + mBitmapBounds[borderBottomLeft].extent.x; destRect.extent.x = bounds.extent.x - mBitmapBounds[borderBottomRight].extent.x - mBitmapBounds[borderBottomLeft].extent.x; destRect.extent.y = mBitmapBounds[borderBottom].extent.y; destRect.point.y = bounds.point.y + bounds.extent.y - mBitmapBounds[borderBottom].extent.y; //stretch it stretchRect = mBitmapBounds[borderBottom]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //left line stretch destRect.point.x = bounds.point.x; destRect.extent.x = mBitmapBounds[borderLeft].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[borderTopLeft].extent.y - mBitmapBounds[borderBottomLeft].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[borderTopLeft].extent.y; //stretch it stretchRect = mBitmapBounds[borderLeft]; stretchRect.inset(0,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //left line stretch destRect.point.x = bounds.point.x + bounds.extent.x - mBitmapBounds[borderRight].extent.x; destRect.extent.x = mBitmapBounds[borderRight].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[borderTopRight].extent.y - mBitmapBounds[borderBottomRight].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[borderTopRight].extent.y; //stretch it stretchRect = mBitmapBounds[borderRight]; stretchRect.inset(0,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //fill stretch destRect.point.x = bounds.point.x + mBitmapBounds[borderLeft].extent.x; destRect.extent.x = (bounds.extent.x) - mBitmapBounds[borderLeft].extent.x - mBitmapBounds[borderRight].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[borderTop].extent.y - mBitmapBounds[borderBottom].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[borderTop].extent.y; //stretch it stretchRect = mBitmapBounds[fill]; stretchRect.inset(1,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); // End drawing sides and top stretched borders } }
void GuiGameListMenuCtrl::onRender(Point2I offset, const RectI &updateRect) { GuiGameListMenuProfile * profile = (GuiGameListMenuProfile *) mProfile; GFXDrawUtil* drawUtil = GFX->getDrawUtil(); F32 xScale = (float) getWidth() / profile->getRowWidth(); bool profileHasIcons = profile->hasArrows(); S32 rowHeight = profile->getRowHeight(); Point2I currentOffset = offset; Point2I extent = getExtent(); Point2I rowExtent(extent.x, rowHeight); Point2I textOffset(profile->mTextOffset.x * xScale, profile->mTextOffset.y); Point2I textExtent(extent.x - textOffset.x, rowHeight); Point2I iconExtent, iconOffset(0.0f, 0.0f); if (profileHasIcons) { iconExtent = profile->getIconExtent(); // icon is centered vertically plus any specified offset S32 iconOffsetY = (rowHeight - iconExtent.y) >> 1; iconOffsetY += profile->mIconOffset.y; iconOffset = Point2I(profile->mIconOffset.x * xScale, iconOffsetY); } for (Vector<Row *>::iterator row = mRows.begin(); row < mRows.end(); ++row) { if (row != mRows.begin()) { // rows other than the first can have padding above them currentOffset.y += (*row)->mHeightPad; currentOffset.y += rowHeight; } // select appropriate colors and textures ColorI fontColor; U32 buttonTextureIndex; S32 iconIndex = (*row)->mIconIndex; bool useHighlightIcon = (*row)->mUseHighlightIcon; if (! (*row)->mEnabled) { buttonTextureIndex = Profile::TEX_DISABLED; fontColor = profile->mFontColorNA; } else if (row == &mRows[mSelected]) { if (iconIndex != NO_ICON) { iconIndex++; } buttonTextureIndex = Profile::TEX_SELECTED; fontColor = profile->mFontColorSEL; } else if ((mHighlighted != NO_ROW) && (row == &mRows[mHighlighted])) { if (iconIndex != NO_ICON && useHighlightIcon) { iconIndex++; } buttonTextureIndex = Profile::TEX_HIGHLIGHT; fontColor = profile->mFontColorHL; } else { buttonTextureIndex = Profile::TEX_NORMAL; fontColor = profile->mFontColor; } // render the row bitmap drawUtil->clearBitmapModulation(); drawUtil->drawBitmapStretchSR(profile->mTextureObject, RectI(currentOffset, rowExtent), profile->getBitmapArrayRect(buttonTextureIndex)); // render the row icon if it has one if ((iconIndex != NO_ICON) && profileHasIcons && (! profile->getBitmapArrayRect((U32)iconIndex).extent.isZero())) { iconIndex += Profile::TEX_FIRST_ICON; drawUtil->clearBitmapModulation(); drawUtil->drawBitmapStretchSR(profile->mTextureObject, RectI(currentOffset + iconOffset, iconExtent), profile->getBitmapArrayRect(iconIndex)); } // render the row text drawUtil->setBitmapModulation(fontColor); renderJustifiedText(currentOffset + textOffset, textExtent, (*row)->mLabel); } if (mDebugRender) { onDebugRender(offset); } renderChildControls(offset, updateRect); }