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);
}
示例#2
0
   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);
   }
示例#3
0
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;
}