示例#1
0
void Text::updateLayout_FromParent(const Bound& parentBound)
{
	Widget::updateLayout_FromParent(parentBound);
	
	if((autoSizeX | autoSizeY | autoFontScaleByX | autoFontScaleByY) == 0 || wrapping)
		return;
	
	Library* lib = getLibrary();
	if(!lib)
		return;

	Font* fnt = lib->getFont(font);
	if(!fnt)
		return;

	screen->lenghts.tmpSet(parentBound.size());
	Vector maxSize(screen->lenghts.lenghts[maxSizeXType].x * maxSizeX, screen->lenghts.lenghts[maxSizeXType].y * maxSizeY);
	Vector marginLow, marginHi;
	margin.getLowAndHi(marginLow, marginHi, parentBound.size(), screen->lenghts);
	maxSize -= marginLow + marginHi;

	Vector2i stringSize = fnt->stringSize(text);
	stringSize.x += 2;
	stringSize.y += 2;
	
	Scalar maxFontScaleByX = -1;
	if(autoFontScaleByX)
	{
		if(autoSizeX && maxSizeXType)
			maxFontScaleByX = maxSize.x / Scalar(stringSize.x);
		else
			maxFontScaleByX = size.x / Scalar(stringSize.x);
	}

	Scalar maxFontScaleByY = -1;
	if(autoFontScaleByY)
	{
		uint h = autoFontScaleByYConsiderateNewLines ? stringSize.y : fnt->characterHeight();
		if(autoSizeY && maxSizeYType)
			maxFontScaleByY = maxSize.y / Scalar(h);
		else
			maxFontScaleByY = size.y / Scalar(h);
	}

	if(maxFontScaleByX > 0)
	{
		if(maxFontScaleByY > 0)
			fontScale = min(maxFontScaleByX, maxFontScaleByY);
		else
			fontScale = maxFontScaleByX;
	}
	else if(maxFontScaleByY > 0)
	{
		fontScale = maxFontScaleByY;
	}
	
	if(autoSizeX)
	{
		if(maxSizeXType)
			size.x = min(stringSize.x * fontScale, maxSize.x);
		else
			size.x = stringSize.x * fontScale;
	}

	if(autoSizeY)
	{
		if(maxSizeYType)
			size.y = min(stringSize.y * fontScale, maxSize.y);
		else
			size.y = stringSize.y * fontScale;
	}

	Widget::updateLayout_FromParent(parentBound);
}