//----------------------------------------------------------------------------- // Purpose: Draw the current image //----------------------------------------------------------------------------- void AnimatingImagePanel::PaintBackground() { if ( m_Frames.IsValidIndex( m_iCurrentImage ) && m_Frames[m_iCurrentImage] != NULL ) { IImage *pImage = m_Frames[m_iCurrentImage]; surface()->DrawSetColor( 255, 255, 255, 255 ); pImage->SetPos(0, 0); if ( m_bScaleImage ) { // Image size is stored in the bitmap, so temporarily set its size // to our panel size and then restore after we draw it. int imageWide, imageTall; pImage->GetSize( imageWide, imageTall ); int wide, tall; GetSize( wide, tall ); pImage->SetSize( wide, tall ); pImage->SetColor( Color( 255,255,255,255 ) ); pImage->Paint(); pImage->SetSize( imageWide, imageTall ); } else { pImage->Paint(); } } }
void WorkWithImage(IImage & image) { auto size = image.GetSize(); cout << "Image size:" << size.width << "x" << size.height << endl; image.Draw(); }
//----------------------------------------------------------------------------- // Purpose: Calculates where in the panel the content resides // Input : &tx0 - [out] position of the content // &ty0 - // &tx1 - // &ty1 - // Note: horizontal alignment is west if the image dar has // more than one image in it, this is because we use image sizes // to determine layout in classes for example, Menu. //----------------------------------------------------------------------------- void Label::ComputeAlignment(int &tx0, int &ty0, int &tx1, int &ty1) { int wide, tall; GetPaintSize(wide, tall); int tWide,tTall; // text bounding box tx0 = 0; ty0 = 0; // loop through all the images and calculate the complete bounds int maxX = 0, maxY = 0; int actualXAlignment = _contentAlignment; for (int i = 0; i < _imageDar.Count(); i++) { TImageInfo &imageInfo = _imageDar[i]; IImage *image = imageInfo.image; if (!image) continue; // skip over null images // add up the bounds int iWide, iTall; image->GetSize(iWide, iTall); if (iWide > wide) // if the image is larger than the label just do a west alignment actualXAlignment = Label::a_west; // get the max height maxY = max(maxY, iTall); maxX += iWide; // add the offset to x maxX += imageInfo.offset; } tWide = maxX; tTall = maxY; // x align text switch (actualXAlignment) { // left case Label::a_northwest: case Label::a_west: case Label::a_southwest: { tx0 = 0; break; } // center case Label::a_north: case Label::a_center: case Label::a_south: { tx0 = (wide - tWide) / 2; break; } // right case Label::a_northeast: case Label::a_east: case Label::a_southeast: { tx0 = wide - tWide; break; } } // y align text switch (_contentAlignment) { //top case Label::a_northwest: case Label::a_north: case Label::a_northeast: { ty0 = 0; break; } // center case Label::a_west: case Label::a_center: case Label::a_east: { ty0 = (tall - tTall) / 2; break; } // south case Label::a_southwest: case Label::a_south: case Label::a_southeast: { ty0 = tall - tTall; break; } } tx1 = tx0 + tWide; ty1 = ty0 + tTall; }
//----------------------------------------------------------------------------- // Purpose: overridden main drawing function for the panel //----------------------------------------------------------------------------- void Label::Paint() { int tx0, ty0, tx1, ty1; ComputeAlignment(tx0, ty0, tx1, ty1); // calculate who our associate is if we haven't already if (_associateName) { SetAssociatedControl(FindSiblingByName(_associateName)); delete [] _associateName; _associateName = NULL; } int labelWide, labelTall; GetSize(labelWide, labelTall); int x = tx0, y = _textInset[1] + ty0; int imageYPos = 0; // a place to save the y offset for when we draw the disable version of the image // draw the set of images for (int i = 0; i < _imageDar.Count(); i++) { TImageInfo &imageInfo = _imageDar[i]; IImage *image = imageInfo.image; if (!image) continue; // skip over null images // add the offset to x x += imageInfo.offset; // if this is the text image then add its inset to the left or from the right if (i == _textImageIndex) { switch ( _contentAlignment ) { // left case Label::a_northwest: case Label::a_west: case Label::a_southwest: { x += _textInset[0]; break; } // right case Label::a_northeast: case Label::a_east: case Label::a_southeast: { x -= _textInset[0]; break; } } } // see if the image is in a fixed position if (imageInfo.xpos >= 0) { x = imageInfo.xpos; } // draw imageYPos = y; image->SetPos(x, y); // fix up y for center-aligned text if (_contentAlignment == Label::a_west || _contentAlignment == Label::a_center || _contentAlignment == Label::a_east) { int iw, it; image->GetSize(iw, it); if (it < (ty1 - ty0)) { imageYPos = ((ty1 - ty0) - it) / 2 + y; image->SetPos(x, ((ty1 - ty0) - it) / 2 + y); } } // don't resize the image unless its too big if (imageInfo.width >= 0) { int w, t; image->GetSize(w, t); if (w > imageInfo.width) { image->SetSize(imageInfo.width, t); } } // if it's the basic text image then draw specially if (image == _textImage) { if (IsEnabled()) { if (_associate.Get() && ipanel()->HasParent(input()->GetFocus(), _associate->GetVPanel())) { _textImage->SetColor(_associateColor); } else { _textImage->SetColor(GetFgColor()); } _textImage->Paint(); } else { // draw disabled version, with embossed look // offset image _textImage->SetPos(x + 1, imageYPos + 1); _textImage->SetColor(_disabledFgColor1); _textImage->Paint(); surface()->DrawFlushText(); // overlayed image _textImage->SetPos(x, imageYPos); _textImage->SetColor(_disabledFgColor2); _textImage->Paint(); } } else { image->Paint(); } // add the image size to x int wide, tall; image->GetSize(wide, tall); x += wide; } }
//----------------------------------------------------------------------------- // Purpose: If a label has images in _imageDar, the size // must take those into account as well as the textImage part // Textimage part will shrink ONLY if there is not enough room. //----------------------------------------------------------------------------- void Label::PerformLayout() { int wide, tall; Panel::GetSize(wide, tall); wide -= _textInset[0]; // take inset into account // if we just have a textImage, this is trivial. if (_imageDar.Count() == 1 && _textImageIndex == 0) { if ( m_bWrap || m_bCenterWrap ) { int twide, ttall; _textImage->GetContentSize(twide, ttall); _textImage->SetSize(wide, ttall); } else { int twide, ttall; _textImage->GetContentSize(twide, ttall); // tell the textImage how much space we have to draw in if ( wide < twide) _textImage->SetSize(wide, ttall); else _textImage->SetSize(twide, ttall); } HandleAutoSizing(); HandleAutoSizing(); return; } // assume the images in the dar cannot be resized, and if // the images + the textimage are too wide we shring the textimage part if (_textImageIndex < 0) return; // get the size of the images int widthOfImages = 0; for (int i = 0; i < _imageDar.Count(); i++) { TImageInfo &imageInfo = _imageDar[i]; IImage *image = imageInfo.image; if (!image) continue; // skip over null images if (i == _textImageIndex) continue; // add up the bounds int iWide, iTall; image->GetSize(iWide, iTall); widthOfImages += iWide; } // so this is how much room we have to draw the textimage part int spaceAvail = wide - widthOfImages; // if we have no space at all just leave everything as is. if (spaceAvail < 0) return; int twide, ttall; _textImage->GetSize (twide, ttall); // tell the textImage how much space we have to draw in _textImage->SetSize(spaceAvail, ttall); HandleAutoSizing(); }