void GuiBitmapCtrl::onRender(Point2I offset, const RectI &updateRect) { GFXDEBUGEVENT_SCOPE_EX( GuiBitmapCtrl_onRender, ColorI::GREEN, avar("GuiBitmapCtrl: %s", mBitmapName.c_str()) ); if (mTextureObject) { GFX->getDrawUtil()->clearBitmapModulation(); if(mWrap) { // We manually draw each repeat because non power of two textures will // not tile correctly when rendered with GFX->drawBitmapTile(). The non POT // bitmap will be padded by the hardware, and we'll see lots of slack // in the texture. So... lets do what we must: draw each repeat by itself: GFXTextureObject* texture = mTextureObject; RectI srcRegion; RectI dstRegion; float xdone = ((float)getExtent().x/(float)texture->mBitmapSize.x)+1; float ydone = ((float)getExtent().y/(float)texture->mBitmapSize.y)+1; int xshift = mStartPoint.x%texture->mBitmapSize.x; int yshift = mStartPoint.y%texture->mBitmapSize.y; for(int y = 0; y < ydone; ++y) for(int x = 0; x < xdone; ++x) { srcRegion.set(0,0,texture->mBitmapSize.x,texture->mBitmapSize.y); dstRegion.set( ((texture->mBitmapSize.x*x)+offset.x)-xshift, ((texture->mBitmapSize.y*y)+offset.y)-yshift, texture->mBitmapSize.x, texture->mBitmapSize.y); GFX->getDrawUtil()->drawBitmapStretchSR(texture,dstRegion, srcRegion, GFXBitmapFlip_None, GFXTextureFilterLinear); } } else { RectI rect(offset, getExtent()); GFX->getDrawUtil()->drawBitmapStretch(mTextureObject, rect, GFXBitmapFlip_None, GFXTextureFilterLinear, false); } } if (mProfile->mBorder || !mTextureObject) { RectI rect(offset.x, offset.y, getExtent().x, getExtent().y); GFX->getDrawUtil()->drawRect(rect, mProfile->mBorderColor); } renderChildControls(offset, updateRect); }
void onRender(Point2I offset, const RectI &updateRect) { U32 elapsed = Platform::getRealMilliseconds() - wakeTime; U32 alpha; if (doFadeOut && elapsed < fadeoutTime) { // fade out alpha = 255 - (255 * (F32(elapsed) / F32(fadeoutTime))); } else if (doFadeIn && elapsed < fadeinTime) { // fade in alpha = 255 * F32(elapsed) / F32(fadeinTime); } else { // done state alpha = doFadeIn ? 255 : 0; done = true; } ColorI color(255,255,255,alpha); if (mTextureObject) { GFX->getDrawUtil()->setBitmapModulation(color); if(mWrap) { GFXTextureObject* texture = mTextureObject; RectI srcRegion; RectI dstRegion; F32 xdone = ((F32)getExtent().x/(F32)texture->mBitmapSize.x)+1; F32 ydone = ((F32)getExtent().y/(F32)texture->mBitmapSize.y)+1; S32 xshift = mStartPoint.x%texture->mBitmapSize.x; S32 yshift = mStartPoint.y%texture->mBitmapSize.y; for(S32 y = 0; y < ydone; ++y) for(S32 x = 0; x < xdone; ++x) { srcRegion.set(0,0,texture->mBitmapSize.x,texture->mBitmapSize.y); dstRegion.set( ((texture->mBitmapSize.x*x)+offset.x)-xshift, ((texture->mBitmapSize.y*y)+offset.y)-yshift, texture->mBitmapSize.x, texture->mBitmapSize.y); GFX->getDrawUtil()->drawBitmapStretchSR(texture,dstRegion, srcRegion); } } else { RectI rect(offset, getExtent()); GFX->getDrawUtil()->drawBitmapStretch(mTextureObject, rect); } } if (mProfile->mBorder || !mTextureObject) { RectI rect(offset.x, offset.y, getExtent().x, getExtent().y); ColorI borderCol(mProfile->mBorderColor); borderCol.alpha = alpha; GFX->getDrawUtil()->drawRect(rect, borderCol); } renderChildControls(offset, updateRect); }
bool GuiContainer::dockControl( GuiContainer *control, S32 dockingMode, RectI &clientRect ) { if( !control ) return false; // Make sure this class support docking of this type if( !(dockingMode & getValidDockingMask())) return false; // If our client rect has run out of room, we can't dock any more if( !clientRect.isValidRect() ) return false; // Dock Appropriately RectI dockRect; RectSpacingI rectShrinker; ControlSizing sizingOptions = control->getSizingOptions(); switch( dockingMode ) { case Docking::dockClient: // Inset by padding sizingOptions.mPadding.insetRect(clientRect); // Dock to entirety of client rectangle control->resize( clientRect.point, clientRect.extent ); // Remove Client Rect, can only have one client dock clientRect.set(0,0,0,0); break; case Docking::dockTop: dockRect = clientRect; dockRect.extent.y = getMin( control->getHeight() + sizingOptions.mPadding.top + sizingOptions.mPadding.bottom , clientRect.extent.y ); // Subtract our rect clientRect.point.y += dockRect.extent.y; clientRect.extent.y -= dockRect.extent.y; // Inset by padding sizingOptions.mPadding.insetRect(dockRect); // Resize control->resize( dockRect.point, dockRect.extent ); break; case Docking::dockBottom: dockRect = clientRect; dockRect.extent.y = getMin( control->getHeight() + sizingOptions.mPadding.top + sizingOptions.mPadding.bottom, clientRect.extent.y ); dockRect.point.y += clientRect.extent.y - dockRect.extent.y; // Subtract our rect clientRect.extent.y -= dockRect.extent.y; // Inset by padding sizingOptions.mPadding.insetRect(dockRect); // Resize control->resize( dockRect.point, dockRect.extent ); break; case Docking::dockLeft: dockRect = clientRect; dockRect.extent.x = getMin( control->getWidth() + sizingOptions.mPadding.left + sizingOptions.mPadding.right, clientRect.extent.x ); // Subtract our rect clientRect.point.x += dockRect.extent.x; clientRect.extent.x -= dockRect.extent.x; // Inset by padding sizingOptions.mPadding.insetRect(dockRect); // Resize control->resize( dockRect.point, dockRect.extent ); break; case Docking::dockRight: dockRect = clientRect; dockRect.extent.x = getMin( control->getWidth() + sizingOptions.mPadding.left + sizingOptions.mPadding.right, clientRect.extent.x ); dockRect.point.x += clientRect.extent.x - dockRect.extent.x; // Subtract our rect clientRect.extent.x -= dockRect.extent.x; // Inset by padding sizingOptions.mPadding.insetRect(dockRect); // Resize control->resize( dockRect.point, dockRect.extent ); break; case Docking::dockNone: control->setUpdateLayout(); break; } return true; }