From c35801ef1c56b6c84063f47b490a8d2220b77ca7 Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Tue, 5 Nov 2013 19:26:23 -0800
Subject: [PATCH] fixed focus issue on inventory

---
 indra/llrender/llrender2dutils.cpp            | 383 ++++++++++--------
 indra/llrender/llrender2dutils.h              |   4 +-
 indra/llrender/lluiimage.cpp                  |  50 +--
 indra/llrender/lluiimage.h                    |  18 +-
 indra/llui/lliconctrl.cpp                     |  26 +-
 indra/llui/lliconctrl.h                       |  10 +-
 indra/llui/lllayoutstack.cpp                  | 118 ++++--
 indra/llui/llresizebar.cpp                    |  78 +---
 indra/llui/llresizebar.h                      |  15 +-
 indra/newview/app_settings/settings.xml       |  44 --
 indra/newview/llavatariconctrl.cpp            |  67 ++-
 indra/newview/llavatariconctrl.h              |  46 ++-
 indra/newview/llsidepanelinventory.cpp        |   2 +-
 indra/newview/llviewertexturelist.cpp         |  51 ++-
 indra/newview/llviewertexturelist.h           |  10 +-
 .../skins/default/textures/textures.xml       |  10 +-
 .../widgets/horizontal_drag_handle.png        | Bin 197 -> 217 bytes
 .../textures/widgets/vertical_drag_handle.png | Bin 196 -> 238 bytes
 .../default/xui/en/panel_main_inventory.xml   |   2 -
 .../default/xui/en/sidepanel_inventory.xml    | 105 +++--
 .../default/xui/en/widgets/avatar_icon.xml    |  12 +-
 21 files changed, 543 insertions(+), 508 deletions(-)

diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp
index 79db777f4b4..df5d79a4363 100644
--- a/indra/llrender/llrender2dutils.cpp
+++ b/indra/llrender/llrender2dutils.cpp
@@ -369,7 +369,7 @@ void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image,
 	gl_draw_scaled_rotated_image( x, y, width, height, 0.f, image, color, uv_rect );
 }
 
-void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect)
+void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect, bool scale_inner)
 {
 	if (NULL == image)
 	{
@@ -382,10 +382,10 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border
 	F32 border_height_fraction = (F32)border_height / (F32)image->getHeight(0);
 
 	LLRectf scale_rect(border_width_fraction, 1.f - border_height_fraction, 1.f - border_width_fraction, border_height_fraction);
-	gl_draw_scaled_image_with_border(x, y, width, height, image, color, solid_color, uv_rect, scale_rect);
+	gl_draw_scaled_image_with_border(x, y, width, height, image, color, solid_color, uv_rect, scale_rect, scale_inner);
 }
 
-void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_outer_rect, const LLRectf& center_rect)
+void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_outer_rect, const LLRectf& center_rect, bool scale_inner)
 {
 	stop_glerror();
 
@@ -395,56 +395,6 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
 		return;
 	}
 
-	// add in offset of current image to current UI translation
-	const LLVector3 ui_scale = gGL.getUIScale();
-	const LLVector3 ui_translation = (gGL.getUITranslation() + LLVector3(x, y, 0.f)).scaledVec(ui_scale);
-
-	F32 uv_width = uv_outer_rect.getWidth();
-	F32 uv_height = uv_outer_rect.getHeight();
-
-	// shrink scaling region to be proportional to clipped image region
-	LLRectf uv_center_rect(
-		uv_outer_rect.mLeft + (center_rect.mLeft * uv_width),
-		uv_outer_rect.mBottom + (center_rect.mTop * uv_height),
-		uv_outer_rect.mLeft + (center_rect.mRight * uv_width),
-		uv_outer_rect.mBottom + (center_rect.mBottom * uv_height));
-
-	F32 image_width = image->getWidth(0);
-	F32 image_height = image->getHeight(0);
-
-	S32 image_natural_width = llround(image_width * uv_width);
-	S32 image_natural_height = llround(image_height * uv_height);
-
-	LLRectf draw_center_rect(	uv_center_rect.mLeft * image_width,
-								uv_center_rect.mTop * image_height,
-								uv_center_rect.mRight * image_width,
-								uv_center_rect.mBottom * image_height);
-
-	{	// scale fixed region of image to drawn region
-		draw_center_rect.mRight += width - image_natural_width;
-		draw_center_rect.mTop += height - image_natural_height;
-
-		F32 border_shrink_width = llmax(0.f, draw_center_rect.mLeft - draw_center_rect.mRight);
-		F32 border_shrink_height = llmax(0.f, draw_center_rect.mBottom - draw_center_rect.mTop);
-
-		F32 shrink_width_ratio = center_rect.getWidth() == 1.f ? 0.f : border_shrink_width / ((F32)image_natural_width * (1.f - center_rect.getWidth()));
-		F32 shrink_height_ratio = center_rect.getHeight() == 1.f ? 0.f : border_shrink_height / ((F32)image_natural_height * (1.f - center_rect.getHeight()));
-
-		F32 shrink_scale = 1.f - llmax(shrink_width_ratio, shrink_height_ratio);
-
-		draw_center_rect.mLeft = llround(ui_translation.mV[VX] + (F32)draw_center_rect.mLeft * shrink_scale * ui_scale.mV[VX]);
-		draw_center_rect.mTop = llround(ui_translation.mV[VY] + lerp((F32)height, (F32)draw_center_rect.mTop, shrink_scale) * ui_scale.mV[VY]);
-		draw_center_rect.mRight = llround(ui_translation.mV[VX] + lerp((F32)width, (F32)draw_center_rect.mRight, shrink_scale) * ui_scale.mV[VX]);
-		draw_center_rect.mBottom = llround(ui_translation.mV[VY] + (F32)draw_center_rect.mBottom * shrink_scale * ui_scale.mV[VY]);
-	}
-
-	LLRectf draw_outer_rect(ui_translation.mV[VX], 
-							ui_translation.mV[VY] + height * ui_scale.mV[VY], 
-							ui_translation.mV[VX] + width * ui_scale.mV[VX], 
-							ui_translation.mV[VY]);
-
-	LLGLSUIDefault gls_ui;
-	
 	if (solid_color)
 	{
 		if (LLGLSLShader::sNoFixedFunction)
@@ -458,174 +408,247 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
 		}
 	}
 
-	gGL.getTexUnit(0)->bind(image, true);
+	if (center_rect.mLeft == 0.f
+		&& center_rect.mRight == 1.f
+		&& center_rect.mBottom == 0.f
+		&& center_rect.mTop == 1.f)
+	{
+		gl_draw_scaled_image(x, y, width, height, image, color, uv_outer_rect);
+	}
+	else
+	{
+		// add in offset of current image to current UI translation
+		const LLVector3 ui_scale = gGL.getUIScale();
+		const LLVector3 ui_translation = (gGL.getUITranslation() + LLVector3(x, y, 0.f)).scaledVec(ui_scale);
+
+		F32 uv_width = uv_outer_rect.getWidth();
+		F32 uv_height = uv_outer_rect.getHeight();
+
+		// shrink scaling region to be proportional to clipped image region
+		LLRectf uv_center_rect(	uv_outer_rect.mLeft + (center_rect.mLeft * uv_width),
+								uv_outer_rect.mBottom + (center_rect.mTop * uv_height),
+								uv_outer_rect.mLeft + (center_rect.mRight * uv_width),
+								uv_outer_rect.mBottom + (center_rect.mBottom * uv_height));
+
+		F32 image_width = image->getWidth(0);
+		F32 image_height = image->getHeight(0);
+
+		S32 image_natural_width = llround(image_width * uv_width);
+		S32 image_natural_height = llround(image_height * uv_height);
+
+		LLRectf draw_center_rect(	uv_center_rect.mLeft * image_width,
+									uv_center_rect.mTop * image_height,
+									uv_center_rect.mRight * image_width,
+									uv_center_rect.mBottom * image_height);
+		
+		if (scale_inner)
+		{
+			// scale center region of image to drawn region
+			draw_center_rect.mRight += width - image_natural_width;
+			draw_center_rect.mTop += height - image_natural_height;
+
+			const F32 border_shrink_width = llmax(0.f, draw_center_rect.mLeft - draw_center_rect.mRight);
+			const F32 border_shrink_height = llmax(0.f, draw_center_rect.mBottom - draw_center_rect.mTop);
 
-	gGL.color4fv(color.mV);
+			const F32 shrink_width_ratio = center_rect.getWidth() == 1.f ? 0.f : border_shrink_width / ((F32)image_natural_width * (1.f - center_rect.getWidth()));
+			const F32 shrink_height_ratio = center_rect.getHeight() == 1.f ? 0.f : border_shrink_height / ((F32)image_natural_height * (1.f - center_rect.getHeight()));
+
+			const F32 border_shrink_scale = 1.f - llmax(shrink_width_ratio, shrink_height_ratio);
+			draw_center_rect.mLeft *= border_shrink_scale;
+			draw_center_rect.mTop = lerp((F32)height, (F32)draw_center_rect.mTop, border_shrink_scale);
+			draw_center_rect.mRight = lerp((F32)width, (F32)draw_center_rect.mRight, border_shrink_scale);
+			draw_center_rect.mBottom *= border_shrink_scale;
+		}
+		else
+		{
+			// keep center region of image at fixed scale, but in same relative position
+			F32 scale_factor = llmin((F32)width / draw_center_rect.getWidth(), (F32)height / draw_center_rect.getHeight(), 1.f);
+			F32 scaled_width = draw_center_rect.getWidth() * scale_factor;
+			F32 scaled_height = draw_center_rect.getHeight() * scale_factor;
+			draw_center_rect.setCenterAndSize(uv_center_rect.getCenterX() * width, uv_center_rect.getCenterY() * height, scaled_width, scaled_height);
+		}
+
+		draw_center_rect.mLeft   = llround(ui_translation.mV[VX] + (F32)draw_center_rect.mLeft * ui_scale.mV[VX]);
+		draw_center_rect.mTop    = llround(ui_translation.mV[VY] + (F32)draw_center_rect.mTop * ui_scale.mV[VY]);
+		draw_center_rect.mRight  = llround(ui_translation.mV[VX] + (F32)draw_center_rect.mRight * ui_scale.mV[VX]);
+		draw_center_rect.mBottom = llround(ui_translation.mV[VY] + (F32)draw_center_rect.mBottom * ui_scale.mV[VY]);
+
+		LLRectf draw_outer_rect(ui_translation.mV[VX], 
+								ui_translation.mV[VY] + height * ui_scale.mV[VY], 
+								ui_translation.mV[VX] + width * ui_scale.mV[VX], 
+								ui_translation.mV[VY]);
+
+		LLGLSUIDefault gls_ui;
+
+		gGL.getTexUnit(0)->bind(image, true);
+
+		gGL.color4fv(color.mV);
 	
-	const S32 NUM_VERTICES = 9 * 4; // 9 quads
-	LLVector2 uv[NUM_VERTICES];
-	LLVector3 pos[NUM_VERTICES];
+		const S32 NUM_VERTICES = 9 * 4; // 9 quads
+		LLVector2 uv[NUM_VERTICES];
+		LLVector3 pos[NUM_VERTICES];
 
-	S32 index = 0;
+		S32 index = 0;
 
-	gGL.begin(LLRender::QUADS);
-	{
-		// draw bottom left
-		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mBottom);
-		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mBottom, 0.f);
-		index++;
+		gGL.begin(LLRender::QUADS);
+		{
+			// draw bottom left
+			uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mBottom);
+			pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		// draw bottom middle
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f);
-		index++;
+			// draw bottom middle
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		// draw bottom right
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f);
-		index++;
+			// draw bottom right
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mBottom);
-		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mBottom);
+			pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		// draw left 
-		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f);
-		index++;
+			// draw left 
+			uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f);
+			index++;
 
-		// draw middle
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);
-		index++;
+			// draw middle
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);
+			index++;
 
-		// draw right 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);
-		index++;
+			// draw right 
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom);
-		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom);
+			pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);
+			index++;
 
-		// draw top left
-		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f);
-		index++;
+			// draw top left
+			uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mTop);
-		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mTop);
+			pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mTop, 0.f);
+			index++;
 
-		// draw top middle
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);
-		index++;
+			// draw top middle
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f);
+			index++;
 
-		// draw top right
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);
-		index++;
+			// draw top right
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop);
-		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop);
+			pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mTop);
-		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mTop);
+			pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mTop, 0.f);
+			index++;
 
-		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop);
-		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f);
-		index++;
+			uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop);
+			pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f);
+			index++;
 
-		gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES);
+			gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES);
+		}
+		gGL.end();
 	}
-	gGL.end();
 
 	if (solid_color)
 	{
diff --git a/indra/llrender/llrender2dutils.h b/indra/llrender/llrender2dutils.h
index 2b8964742b5..cce3b4ed511 100644
--- a/indra/llrender/llrender2dutils.h
+++ b/indra/llrender/llrender2dutils.h
@@ -75,8 +75,8 @@ void gl_draw_scaled_target(S32 x, S32 y, S32 width, S32 height, LLRenderTarget*
 void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f));
 void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f));
 void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), LLRenderTarget* target = NULL);
-void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f));
-void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), const LLRectf& scale_rect = LLRectf(0.f, 1.f, 1.f, 0.f));
+void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), bool scale_inner = true);
+void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), const LLRectf& scale_rect = LLRectf(0.f, 1.f, 1.f, 0.f), bool scale_inner = true);
 
 void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase = 0.f ); 
 
diff --git a/indra/llrender/lluiimage.cpp b/indra/llrender/lluiimage.cpp
index b954b66350c..6f1fae92cd5 100644
--- a/indra/llrender/lluiimage.cpp
+++ b/indra/llrender/lluiimage.cpp
@@ -38,11 +38,9 @@ LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image)
 	mImage(image),
 	mScaleRegion(0.f, 1.f, 1.f, 0.f),
 	mClipRegion(0.f, 1.f, 1.f, 0.f),
-	mUniformScaling(TRUE),
-	mNoClip(TRUE),
-	mImageLoaded(NULL)
-{
-}
+	mImageLoaded(NULL),
+	mScaleStyle(SCALE_INNER)
+{}
 
 LLUIImage::~LLUIImage()
 {
@@ -52,44 +50,35 @@ LLUIImage::~LLUIImage()
 void LLUIImage::setClipRegion(const LLRectf& region) 
 { 
 	mClipRegion = region; 
-	mNoClip = mClipRegion.mLeft == 0.f
-				&& mClipRegion.mRight == 1.f
-				&& mClipRegion.mBottom == 0.f
-				&& mClipRegion.mTop == 1.f;
 }
 
 void LLUIImage::setScaleRegion(const LLRectf& region) 
 { 
 	mScaleRegion = region; 
-	mUniformScaling = mScaleRegion.mLeft == 0.f
-					&& mScaleRegion.mRight == 1.f
-					&& mScaleRegion.mBottom == 0.f
-					&& mScaleRegion.mTop == 1.f;
+}
+
+void LLUIImage::setScaleStyle(LLUIImage::EScaleStyle style)
+{
+	mScaleStyle = style;
 }
 
 //TODO: move drawing implementation inside class
 void LLUIImage::draw(S32 x, S32 y, const LLColor4& color) const
 {
-	gl_draw_scaled_image(x, y, getWidth(), getHeight(), mImage, color, mClipRegion);
+	draw(x, y, getWidth(), getHeight(), color);
 }
 
 void LLUIImage::draw(S32 x, S32 y, S32 width, S32 height, const LLColor4& color) const
 {
-	if (mUniformScaling)
-	{
-		gl_draw_scaled_image(x, y, width, height, mImage, color, mClipRegion);
-	}
-	else
-	{
-		gl_draw_scaled_image_with_border(
-			x, y, 
-			width, height, 
-			mImage, 
-			color,
-			FALSE,
-			mClipRegion,
-			mScaleRegion);
-	}
+	gl_draw_scaled_image_with_border(
+		x, y, 
+		width, height, 
+		mImage, 
+		color,
+		FALSE,
+		mClipRegion,
+		mScaleRegion,
+		mScaleStyle == SCALE_INNER);
 }
 
 void LLUIImage::drawSolid(S32 x, S32 y, S32 width, S32 height, const LLColor4& color) const
@@ -101,7 +90,8 @@ void LLUIImage::drawSolid(S32 x, S32 y, S32 width, S32 height, const LLColor4& c
 		color, 
 		TRUE,
 		mClipRegion,
-		mScaleRegion);
+		mScaleRegion,
+		mScaleStyle == SCALE_INNER);
 }
 
 void LLUIImage::drawBorder(S32 x, S32 y, S32 width, S32 height, const LLColor4& color, S32 border_width) const
diff --git a/indra/llrender/lluiimage.h b/indra/llrender/lluiimage.h
index 7817ba1c7b6..6f47385eb0f 100644
--- a/indra/llrender/lluiimage.h
+++ b/indra/llrender/lluiimage.h
@@ -42,6 +42,12 @@ extern const LLColor4 UI_VERTEX_COLOR;
 class LLUIImage : public LLRefCount
 {
 public:
+	enum EScaleStyle
+	{
+		SCALE_INNER,
+		SCALE_OUTER
+	};
+
 	typedef boost::signals2::signal<void (void)> image_loaded_signal_t;
 
 	LLUIImage(const std::string& name, LLPointer<LLTexture> image);
@@ -49,6 +55,7 @@ class LLUIImage : public LLRefCount
 
 	void setClipRegion(const LLRectf& region);
 	void setScaleRegion(const LLRectf& region);
+	void setScaleStyle(EScaleStyle style);
 
 	LLPointer<LLTexture> getImage() { return mImage; }
 	const LLPointer<LLTexture>& getImage() const { return mImage; }
@@ -83,12 +90,11 @@ class LLUIImage : public LLRefCount
 protected:
 	image_loaded_signal_t* mImageLoaded;
 
-	std::string			mName;
-	LLRectf				mScaleRegion;
-	LLRectf				mClipRegion;
-	LLPointer<LLTexture> mImage;
-	BOOL				mUniformScaling;
-	BOOL				mNoClip;
+	std::string				mName;
+	LLRectf					mScaleRegion;
+	LLRectf					mClipRegion;
+	LLPointer<LLTexture>	mImage;
+	EScaleStyle				mScaleStyle;
 };
 
 namespace LLInitParam
diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp
index 30b79b4d20d..58b66f60caa 100755
--- a/indra/llui/lliconctrl.cpp
+++ b/indra/llui/lliconctrl.cpp
@@ -42,7 +42,9 @@ LLIconCtrl::Params::Params()
 :	image("image_name"),
 	color("color"),
 	use_draw_context_alpha("use_draw_context_alpha", true),
-	scale_image("scale_image")
+	scale_image("scale_image"),
+	min_width("min_width", 0),
+	min_height("min_height", 0)
 {}
 
 LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)
@@ -51,8 +53,8 @@ LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)
 	mImagep(p.image),
 	mUseDrawContextAlpha(p.use_draw_context_alpha),
 	mPriority(0),
-	mDrawWidth(0),
-	mDrawHeight(0)
+	mMinWidth(p.min_width),
+	mMinHeight(p.min_height)
 {
 	if (mImagep.notNull())
 	{
@@ -97,7 +99,13 @@ void LLIconCtrl::setValue(const LLSD& value )
 		mImagep = LLUI::getUIImage(tvalue.asString(), mPriority);
 	}
 
-	setIconImageDrawSize();
+	if(mImagep.notNull() 
+		&& mImagep->getImage().notNull() 
+		&& mMinWidth 
+		&& mMinHeight)
+	{
+		mImagep->getImage()->setKnownDrawSize(llmax(mMinWidth, mImagep->getWidth()), llmax(mMinHeight, mImagep->getHeight()));
+	}
 }
 
 std::string LLIconCtrl::getImageName() const
@@ -108,14 +116,4 @@ std::string LLIconCtrl::getImageName() const
 		return std::string();
 }
 
-void LLIconCtrl::setIconImageDrawSize()
-{
-	if(mImagep.notNull() && mDrawWidth && mDrawHeight)
-	{
-		if(mImagep->getImage().notNull())
-		{
-			mImagep->getImage()->setKnownDrawSize(mDrawWidth, mDrawHeight) ;
-		}
-	}
-}
 
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index a19bb99d9dc..8b1092df46f 100755
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -49,7 +49,10 @@ class LLIconCtrl
 		Optional<LLUIImage*>	image;
 		Optional<LLUIColor>		color;
 		Optional<bool>			use_draw_context_alpha;
+		Optional<S32>			min_width,
+								min_height;
 		Ignored					scale_image;
+
 		Params();
 	};
 protected:
@@ -71,15 +74,12 @@ class LLIconCtrl
 	void			setImage(LLPointer<LLUIImage> image) { mImagep = image; }
 	const LLPointer<LLUIImage> getImage() { return mImagep; }
 	
-private:
-	void setIconImageDrawSize() ;
-
 protected:
 	S32 mPriority;
 
 	//the output size of the icon image if set.
-	S32 mDrawWidth ;
-	S32 mDrawHeight ;
+	S32 mMinWidth,
+		mMinHeight;
 
 	// If set to true (default), use the draw context transparency.
 	// If false, will use transparency returned by getCurrentTransparency(). See STORM-698.
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index b13f61ea7e2..c59286fc600 100755
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -33,6 +33,7 @@
 #include "lllocalcliprect.h"
 #include "llpanel.h"
 #include "llcriticaldamp.h"
+#include "lliconctrl.h"
 #include "boost/foreach.hpp"
 
 static const F32 MIN_FRACTIONAL_SIZE = 0.00001f;
@@ -268,25 +269,9 @@ void LLLayoutStack::draw()
 			// only force drawing invisible children if visible amount is non-zero
 			drawChild(panelp, 0, 0, !clip_rect.isEmpty());
 		}
-	}
-
-	const LLView::child_list_t * child_listp = getChildList();
-	BOOST_FOREACH(LLView * childp, * child_listp)
-	{
-		LLResizeBar * resize_barp = dynamic_cast<LLResizeBar*>(childp);
-		if (resize_barp && resize_barp->isShowDragHandle() && resize_barp->getVisible() && resize_barp->getRect().isValid())
+		if (panelp->getResizeBar()->getVisible())
 		{
-			LLRect screen_rect = resize_barp->calcScreenRect();
-			if (LLUI::getRootView()->getLocalRect().overlaps(screen_rect) && LLUI::sDirtyRect.overlaps(screen_rect))
-			{
-				LLUI::pushMatrix();
-				{
-					const LLRect& rb_rect(resize_barp->getRect());
-					LLUI::translate(rb_rect.mLeft, rb_rect.mBottom);
-					resize_barp->draw();
-				}
-				LLUI::popMatrix();
-			}
+			drawChild(panelp->getResizeBar());
 		}
 	}
 }
@@ -351,6 +336,31 @@ void LLLayoutStack::collapsePanel(LLPanel* panel, BOOL collapsed)
 
 static LLTrace::BlockTimerStatHandle FTM_UPDATE_LAYOUT("Update LayoutStacks");
 
+class LLImagePanel : public LLPanel
+{
+public:
+	struct Params :	public LLInitParam::Block<Params, LLPanel::Params>
+	{
+		Optional<bool> horizontal;
+		Params() : horizontal("horizontal", false) {}
+	};
+	LLImagePanel(const Params& p) : LLPanel(p), mHorizontal(p.horizontal) {}
+	virtual ~LLImagePanel() {}
+
+	void draw()
+	{
+		const LLRect& parent_rect = getParent()->getRect();
+		const LLRect& rect = getRect();
+		LLRect clip_rect( -rect.mLeft, parent_rect.getHeight() - rect.mBottom - 2
+			, parent_rect.getWidth() - rect.mLeft - (mHorizontal ? 2 : 0), -rect.mBottom);
+		LLLocalClipRect clip(clip_rect);
+		LLPanel::draw();
+	}
+
+private:
+	bool mHorizontal;
+};
+
 void LLLayoutStack::updateLayout()
 {	
 	LL_RECORD_BLOCK_TIME(FTM_UPDATE_LAYOUT);
@@ -435,8 +445,6 @@ void LLLayoutStack::updateLayout()
 		}
 
 		LLRect resize_bar_rect(panel_rect);
-		LLResizeBar * resize_barp = panelp->getResizeBar();
-		bool show_drag_handle = resize_barp->isShowDragHandle();
 		F32 panel_spacing = (F32)mPanelSpacing * panelp->getVisibleAmount();
 		F32 panel_visible_dim = panelp->getVisibleDim();
 		S32 panel_spacing_round = (S32)(llround(panel_spacing));
@@ -445,7 +453,7 @@ void LLLayoutStack::updateLayout()
 		{
 			cur_pos += panel_visible_dim + panel_spacing;
 
-			if (show_drag_handle && panel_spacing_round > mDragHandleThickness)
+			if (mShowDragHandle && panel_spacing_round > mDragHandleThickness)
 			{
 				resize_bar_rect.mLeft = panel_rect.mRight + mDragHandleShift;
 				resize_bar_rect.mRight = resize_bar_rect.mLeft + mDragHandleThickness;
@@ -456,7 +464,7 @@ void LLLayoutStack::updateLayout()
 				resize_bar_rect.mRight = panel_rect.mRight + panel_spacing_round + mResizeBarOverlap;
 			}
 
-			if (show_drag_handle)
+			if (mShowDragHandle)
 			{
 				resize_bar_rect.mBottom += mDragHandleSecondIndent;
 				resize_bar_rect.mTop -= mDragHandleFirstIndent;
@@ -467,7 +475,7 @@ void LLLayoutStack::updateLayout()
 		{
 			cur_pos -= panel_visible_dim + panel_spacing;
 
-			if (show_drag_handle && panel_spacing_round > mDragHandleThickness)
+			if (mShowDragHandle && panel_spacing_round > mDragHandleThickness)
 			{
 				resize_bar_rect.mTop = panel_rect.mBottom - mDragHandleShift;
 				resize_bar_rect.mBottom = resize_bar_rect.mTop - mDragHandleThickness;
@@ -478,7 +486,7 @@ void LLLayoutStack::updateLayout()
 				resize_bar_rect.mBottom = panel_rect.mBottom - panel_spacing_round - mResizeBarOverlap;
 			}
 
-			if (show_drag_handle)
+			if (mShowDragHandle)
 			{
 				resize_bar_rect.mLeft += mDragHandleFirstIndent;
 				resize_bar_rect.mRight -= mDragHandleSecondIndent;
@@ -541,9 +549,69 @@ void LLLayoutStack::createResizeBar(LLLayoutPanel* panelp)
 			resize_params.min_size(lp->getRelevantMinDim());
 			resize_params.side((mOrientation == HORIZONTAL) ? LLResizeBar::RIGHT : LLResizeBar::BOTTOM);
 			resize_params.snapping_enabled(false);
-			resize_params.show_drag_handle(mShowDragHandle);
 			LLResizeBar* resize_bar = LLUICtrlFactory::create<LLResizeBar>(resize_params);
 			lp->mResizeBar = resize_bar;
+
+			if (mShowDragHandle)
+			{
+				LLPanel::Params resize_bar_bg_panel_p;
+				resize_bar_bg_panel_p.name = "resize_handle_bg_panel";
+				resize_bar_bg_panel_p.rect = lp->mResizeBar->getLocalRect();
+				resize_bar_bg_panel_p.follows.flags = FOLLOWS_ALL;
+				resize_bar_bg_panel_p.tab_stop = false;
+				resize_bar_bg_panel_p.background_visible = true;
+				resize_bar_bg_panel_p.bg_alpha_color = LLUIColorTable::instance().getColor("ResizebarBody");
+				resize_bar_bg_panel_p.has_border = true;
+				resize_bar_bg_panel_p.border.border_thickness = 1;
+				resize_bar_bg_panel_p.border.highlight_light_color = LLUIColorTable::instance().getColor("ResizebarBorderLight");
+				resize_bar_bg_panel_p.border.shadow_dark_color = LLUIColorTable::instance().getColor("ResizebarBorderDark");
+
+				LLPanel* resize_bar_bg_panel = LLUICtrlFactory::create<LLPanel>(resize_bar_bg_panel_p);
+
+				LLIconCtrl::Params icon_p;
+				icon_p.name = "resize_handle_image";
+				icon_p.rect = lp->mResizeBar->getLocalRect();
+				icon_p.follows.flags = FOLLOWS_ALL;
+				icon_p.image = LLUI::getUIImage(mOrientation == HORIZONTAL ? "Vertical Drag Handle" : "Horizontal Drag Handle");
+				resize_bar_bg_panel->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_p));
+
+				lp->mResizeBar->addChild(resize_bar_bg_panel);
+			}
+
+			/*if (mShowDragHandle)
+			{
+				LLViewBorder::Params border_params;
+				border_params.border_thickness = 1;
+				border_params.highlight_light_color = LLUIColorTable::instance().getColor("ResizebarBorderLight");
+				border_params.shadow_dark_color = LLUIColorTable::instance().getColor("ResizebarBorderDark");
+
+				addBorder(border_params);
+				setBorderVisible(TRUE);
+
+				LLImagePanel::Params image_panel;
+				mDragHandleImage = LLUI::getUIImage(LLResizeBar::RIGHT == mSide ? "Vertical Drag Handle" : "Horizontal Drag Handle");
+				image_panel.bg_alpha_image = mDragHandleImage;
+				image_panel.background_visible = true;
+				image_panel.horizontal = (LLResizeBar::BOTTOM == mSide);
+				mImagePanel = LLUICtrlFactory::create<LLImagePanel>(image_panel);
+				setImagePanel(mImagePanel);
+			}*/
+
+			//if (mShowDragHandle)
+			//{
+			//	setBackgroundVisible(TRUE);
+			//	setTransparentColor(LLUIColorTable::instance().getColor("ResizebarBody"));
+			//}
+
+			/*if (mShowDragHandle)
+			{
+			S32 image_width = mDragHandleImage->getTextureWidth();
+			S32 image_height = mDragHandleImage->getTextureHeight();
+			const LLRect& panel_rect = getRect();
+			S32 image_left = (panel_rect.getWidth() - image_width) / 2 - 1;
+			S32 image_bottom = (panel_rect.getHeight() - image_height) / 2;
+			mImagePanel->setRect(LLRect(image_left, image_bottom + image_height, image_left + image_width, image_bottom));
+			}*/
 			LLView::addChild(resize_bar, 0);
 		}
 	}
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index e67b22c9776..115c4e23bea 100755
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -35,46 +35,18 @@
 #include "llfocusmgr.h"
 #include "llwindow.h"
 
-class LLImagePanel : public LLPanel
-{
-public:
-	struct Params :	public LLInitParam::Block<Params, LLPanel::Params>
-	{
-		Optional<bool> horizontal;
-		Params() : horizontal("horizontal", false) {}
-	};
-	LLImagePanel(const Params& p) : LLPanel(p), mHorizontal(p.horizontal) {}
-	virtual ~LLImagePanel() {}
-
-	void draw()
-	{
-		const LLRect& parent_rect = getParent()->getRect();
-		const LLRect& rect = getRect();
-		LLRect clip_rect( -rect.mLeft, parent_rect.getHeight() - rect.mBottom - 2
-						 , parent_rect.getWidth() - rect.mLeft - (mHorizontal ? 2 : 0), -rect.mBottom);
-		LLLocalClipRect clip(clip_rect);
-		LLPanel::draw();
-	}
-
-private:
-	bool mHorizontal;
-};
-
-static LLDefaultChildRegistry::Register<LLImagePanel> t1("resize_bar_image_panel");
-
 LLResizeBar::Params::Params()
 :	max_size("max_size", S32_MAX),
 	snapping_enabled("snapping_enabled", true),
 	resizing_view("resizing_view"),
 	side("side"),
-	allow_double_click_snapping("allow_double_click_snapping", true),
-	show_drag_handle("show_drag_handle", false)
+	allow_double_click_snapping("allow_double_click_snapping", true)
 {
 	name = "resize_bar";
 }
 
 LLResizeBar::LLResizeBar(const LLResizeBar::Params& p)
-:	LLPanel(p),
+:	LLView(p),
 	mDragLastScreenX( 0 ),
 	mDragLastScreenY( 0 ),
 	mLastMouseScreenX( 0 ),
@@ -86,7 +58,6 @@ LLResizeBar::LLResizeBar(const LLResizeBar::Params& p)
 	mAllowDoubleClickSnapping(p.allow_double_click_snapping),
 	mResizingView(p.resizing_view),
 	mResizeListener(NULL),
-	mShowDragHandle(p.show_drag_handle),
 	mImagePanel(NULL)
 {
 	setFollowsNone();
@@ -116,36 +87,6 @@ LLResizeBar::LLResizeBar(const LLResizeBar::Params& p)
 	default:
 		break;
 	}
-
-	if (mShowDragHandle)
-	{
-		LLViewBorder::Params border_params;
-		border_params.border_thickness = 1;
-		border_params.highlight_light_color = LLUIColorTable::instance().getColor("ResizebarBorderLight");
-		border_params.shadow_dark_color = LLUIColorTable::instance().getColor("ResizebarBorderDark");
-
-		addBorder(border_params);
-		setBorderVisible(TRUE);
-
-		LLImagePanel::Params image_panel;
-		mDragHandleImage = LLUI::getUIImage(LLResizeBar::RIGHT == mSide ? "Vertical Drag Handle" : "Horizontal Drag Handle");
-		image_panel.bg_alpha_image = mDragHandleImage;
-		image_panel.background_visible = true;
-		image_panel.horizontal = (LLResizeBar::BOTTOM == mSide);
-		mImagePanel = LLUICtrlFactory::create<LLImagePanel>(image_panel);
-		setImagePanel(mImagePanel);
-	}
-}
-
-BOOL LLResizeBar::postBuild()
-{
-	if (mShowDragHandle)
-	{
-		setBackgroundVisible(TRUE);
-		setTransparentColor(LLUIColorTable::instance().getColor("ResizebarBody"));
-	}
-
-	return LLPanel::postBuild();
 }
 
 BOOL LLResizeBar::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -433,18 +374,3 @@ LLPanel * LLResizeBar::getImagePanel() const
 {
 	return getChildCount() > 0 ? (LLPanel *)getChildList()->back() : NULL;
 }
-
-void LLResizeBar::draw()
-{
-	if (mShowDragHandle)
-	{
-		S32 image_width = mDragHandleImage->getTextureWidth();
-		S32 image_height = mDragHandleImage->getTextureHeight();
-		const LLRect& panel_rect = getRect();
-		S32 image_left = (panel_rect.getWidth() - image_width) / 2 - 1;
-		S32 image_bottom = (panel_rect.getHeight() - image_height) / 2;
-		mImagePanel->setRect(LLRect(image_left, image_bottom + image_height, image_left + image_width, image_bottom));
-	}
-
-	LLPanel::draw();
-}
diff --git a/indra/llui/llresizebar.h b/indra/llui/llresizebar.h
index bcf8ea0b40e..20a2406484a 100755
--- a/indra/llui/llresizebar.h
+++ b/indra/llui/llresizebar.h
@@ -27,14 +27,14 @@
 #ifndef LL_RESIZEBAR_H
 #define LL_RESIZEBAR_H
 
-#include "llpanel.h"
+#include "llview.h"
 
-class LLResizeBar : public LLPanel
+class LLResizeBar : public LLView
 {
 public:
 	enum Side { LEFT, TOP, RIGHT, BOTTOM };
 
-	struct Params : public LLInitParam::Block<Params, LLPanel::Params>
+	struct Params : public LLInitParam::Block<Params, LLView::Params>
 	{
 		Mandatory<LLView*> resizing_view;
 		Mandatory<Side>	side;
@@ -43,7 +43,6 @@ class LLResizeBar : public LLPanel
 		Optional<S32>	max_size;
 		Optional<bool>	snapping_enabled;
 		Optional<bool>	allow_double_click_snapping;
-		Optional<bool>	show_drag_handle;
 
 		Params();
 	};
@@ -52,10 +51,8 @@ class LLResizeBar : public LLPanel
 	LLResizeBar(const LLResizeBar::Params& p);
 	friend class LLUICtrlFactory;
 
-	/*virtual*/ BOOL postBuild();
 public:
 
-	virtual void	draw();
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
@@ -66,7 +63,6 @@ class LLResizeBar : public LLPanel
 	void			setAllowDoubleClickSnapping(BOOL allow) { mAllowDoubleClickSnapping = allow; }
 	bool			canResize() { return getEnabled() && mMaxSize > mMinSize; }
 	void            setResizeListener(boost::function<void(void*)> listener) {mResizeListener = listener;}
-	BOOL			isShowDragHandle() const { return mShowDragHandle; }
 	void			setImagePanel(LLPanel * panelp);
 	LLPanel *		getImagePanel() const;
 
@@ -79,9 +75,8 @@ class LLResizeBar : public LLPanel
 	S32								mMinSize;
 	S32								mMaxSize;
 	const Side						mSide;
-	BOOL							mSnappingEnabled;
-	BOOL							mAllowDoubleClickSnapping;
-	BOOL							mShowDragHandle;
+	bool							mSnappingEnabled,
+									mAllowDoubleClickSnapping;
 	LLView*							mResizingView;
 	boost::function<void(void*)>	mResizeListener;
 	LLPointer<LLUIImage>			mDragHandleImage;
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 09d74a7f5e8..df9dd3e1b50 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -12004,50 +12004,6 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-    <key>UIAvatariconctrlSymbolHPad</key>
-    <map>
-      <key>Comment</key>
-      <string>UI Avatar Icon Control Symbol Horizontal Pad</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>S32</string>
-      <key>Value</key>
-      <real>2</real>
-    </map>    
-    <key>UIAvatariconctrlSymbolVPad</key>
-    <map>
-      <key>Comment</key>
-      <string>UI Avatar Icon Control Symbol Vertical Pad</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>S32</string>
-      <key>Value</key>
-      <real>2</real>
-    </map>    
-    <key>UIAvatariconctrlSymbolSize</key>
-    <map>
-      <key>Comment</key>
-      <string>UI Avatar Icon Control Symbol Size</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>S32</string>
-      <key>Value</key>
-      <real>5</real>
-    </map>    
-    <key>UIAvatariconctrlSymbolPosition</key>
-    <map>
-      <key>Comment</key>
-      <string>UI Avatar Icon Control Symbol Position (TopLeft|TopRight|BottomLeft|BottomRight)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>BottomRight</string>
-    </map>
     <key>UIButtonOrigHPad</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 7a49b774909..746b541f9d2 100755
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -49,6 +49,18 @@
 
 static LLDefaultChildRegistry::Register<LLAvatarIconCtrl> r("avatar_icon");
 
+namespace LLInitParam
+{
+	void TypeValues<LLAvatarIconCtrlEnums::ESymbolPos>::declareValues()
+	{
+		declare("BottomLeft",   LLAvatarIconCtrlEnums::BOTTOM_LEFT);
+		declare("BottomRight",  LLAvatarIconCtrlEnums::BOTTOM_RIGHT);
+		declare("TopLeft",		LLAvatarIconCtrlEnums::TOP_LEFT);
+		declare("TopRight",		LLAvatarIconCtrlEnums::TOP_RIGHT);
+	}
+}
+
+
 bool LLAvatarIconIDCache::LLAvatarIconIDCacheItem::expired()
 {
 	const F64 SEC_PER_DAY_PLUS_HOUR = (24.0 + 1.0) * 60.0 * 60.0;
@@ -145,52 +157,63 @@ void LLAvatarIconIDCache::remove	(const LLUUID& avatar_id)
 LLAvatarIconCtrl::Params::Params()
 :	avatar_id("avatar_id"),
 	draw_tooltip("draw_tooltip", true),
-	default_icon_name("default_icon_name")
+	default_icon_name("default_icon_name"),
+	symbol_hpad("symbol_hpad"),
+	symbol_vpad("symbol_vpad"),
+	symbol_size("symbol_size", 1),
+	symbol_pos("symbol_pos", LLAvatarIconCtrlEnums::BOTTOM_RIGHT)
 {
+	changeDefault(min_width, 32);
+	changeDefault(min_height, 32);
 }
 
 
 LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
-	: LLIconCtrl(p),
+:	LLIconCtrl(p),
 	LLAvatarPropertiesObserver(),
 	mAvatarId(),
 	mFullName(),
 	mDrawTooltip(p.draw_tooltip),
 	mDefaultIconName(p.default_icon_name),
-	mAvatarNameCacheConnection()
+	mAvatarNameCacheConnection(),
+	mSymbolHpad(p.symbol_hpad),
+	mSymbolVpad(p.symbol_vpad),
+	mSymbolSize(p.symbol_size),
+	mSymbolPos(p.symbol_pos)
 {
 	mPriority = LLViewerFetchedTexture::BOOST_ICON;
 	
 	LLRect rect = p.rect;
-	mDrawWidth  = llmax(32, rect.getWidth()) ;
-	mDrawHeight = llmax(32, rect.getHeight()) ;
-
-	static LLUICachedControl<S32> llavatariconctrl_symbol_hpad("UIAvatariconctrlSymbolHPad", 2);
-	static LLUICachedControl<S32> llavatariconctrl_symbol_vpad("UIAvatariconctrlSymbolVPad", 2);
-	static LLUICachedControl<S32> llavatariconctrl_symbol_size("UIAvatariconctrlSymbolSize", 5);
-	static LLUICachedControl<std::string> llavatariconctrl_symbol_pos("UIAvatariconctrlSymbolPosition", "BottomRight");
 
 	// BottomRight is the default position
-	S32 left = rect.getWidth() - llavatariconctrl_symbol_size - llavatariconctrl_symbol_hpad;
-	S32 bottom = llavatariconctrl_symbol_vpad;
+	S32 left = rect.getWidth() - mSymbolSize - mSymbolHpad;
+	S32 bottom = mSymbolVpad;
 
-	if ("BottomLeft" == (std::string)llavatariconctrl_symbol_pos)
+	switch(mSymbolPos)
+	{
+	case LLAvatarIconCtrlEnums::BOTTOM_LEFT:
 	{
-		left = llavatariconctrl_symbol_hpad;
-		bottom = llavatariconctrl_symbol_vpad;
+		left = mSymbolHpad;
+		bottom = mSymbolVpad;
 	}
-	else if ("TopLeft" == (std::string)llavatariconctrl_symbol_pos)
+
+	case LLAvatarIconCtrlEnums::TOP_LEFT:
 	{
-		left = llavatariconctrl_symbol_hpad;
-		bottom = rect.getHeight() - llavatariconctrl_symbol_size - llavatariconctrl_symbol_vpad;
+		left = mSymbolHpad;
+		bottom = rect.getHeight() - mSymbolSize - mSymbolVpad;
 	}
-	else if ("TopRight" == (std::string)llavatariconctrl_symbol_pos)
+
+	case LLAvatarIconCtrlEnums::TOP_RIGHT:
 	{
-		left = rect.getWidth() - llavatariconctrl_symbol_size - llavatariconctrl_symbol_hpad;
-		bottom = rect.getHeight() - llavatariconctrl_symbol_size - llavatariconctrl_symbol_vpad;
+		left = rect.getWidth() - mSymbolSize - mSymbolHpad;
+		bottom = rect.getHeight() - mSymbolSize - mSymbolVpad;
 	}
 
-	rect.setOriginAndSize(left, bottom, llavatariconctrl_symbol_size, llavatariconctrl_symbol_size);
+	case LLAvatarIconCtrlEnums::BOTTOM_RIGHT:
+		// fallthrough, is default
+	default:
+		rect.setOriginAndSize(left, bottom, mSymbolSize, mSymbolSize);
+	}
 
 	if (p.avatar_id.isProvided())
 	{
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 4929efb7d03..5b5720f4ac8 100755
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -29,7 +29,7 @@
 
 #include <boost/signals2.hpp>
 
-#include "../llui/lliconctrl.h"
+#include "lliconctrl.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llviewermenu.h"
 
@@ -41,14 +41,14 @@ class LLAvatarIconIDCache: public LLSingleton<LLAvatarIconIDCache>
 	struct LLAvatarIconIDCacheItem
 	{
 		LLUUID icon_id;
-		LLDate cached_time;	
+		LLDate cached_time;
 
 		bool expired();
 	};
 
-	LLAvatarIconIDCache():mFilename("avatar_icons_cache.txt")
-	{
-	}
+	LLAvatarIconIDCache()
+	:	mFilename("avatar_icons_cache.txt")
+	{}
 
 	void				load	();
 	void				save	();
@@ -64,15 +64,41 @@ class LLAvatarIconIDCache: public LLSingleton<LLAvatarIconIDCache>
 	std::map<LLUUID,LLAvatarIconIDCacheItem> mCache;//we cache only LLUID and time
 };
 
+namespace LLAvatarIconCtrlEnums
+{
+	enum ESymbolPos
+	{
+		BOTTOM_LEFT,
+		BOTTOM_RIGHT,
+		TOP_LEFT,
+		TOP_RIGHT
+	};
+}
+
+
+namespace LLInitParam
+{
+	template<>
+	struct TypeValues<LLAvatarIconCtrlEnums::ESymbolPos> : public TypeValuesHelper<LLAvatarIconCtrlEnums::ESymbolPos>
+	{
+		static void declareValues();
+	};
+}
+
 class LLAvatarIconCtrl
 : public LLIconCtrl, public LLAvatarPropertiesObserver
 {
 public:
 	struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params>
 	{
-		Optional <LLUUID> avatar_id;
-		Optional <bool> draw_tooltip;
-		Optional <std::string> default_icon_name;
+		Optional<LLUUID>		avatar_id;
+		Optional<bool>			draw_tooltip;
+		Optional<std::string>	default_icon_name;
+		Optional<S32>			symbol_hpad,
+								symbol_vpad,
+								symbol_size;
+		Optional<LLAvatarIconCtrlEnums::ESymbolPos>	symbol_pos;
+
 		Params();
 	};
 	
@@ -98,6 +124,10 @@ class LLAvatarIconCtrl
 	std::string                 mFullName;
 	bool                        mDrawTooltip;
 	std::string                 mDefaultIconName;
+	S32							mSymbolHpad,
+								mSymbolVpad,
+								mSymbolSize;
+	LLAvatarIconCtrlEnums::ESymbolPos	mSymbolPos;
 
 	bool updateFromCache();
 
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index d20f89456bc..71218220154 100755
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -161,7 +161,7 @@ BOOL LLSidepanelInventory::postBuild()
 {
 	// UI elements from inventory panel
 	{
-		mInventoryPanel = getChild<LLPanel>("sidepanel__inventory_panel");
+		mInventoryPanel = getChild<LLPanel>("sidepanel_inventory_panel");
 
 		mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn");
 		mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this));
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 2f887d71856..dae76272ec1 100755
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -70,6 +70,7 @@ S32 LLViewerTextureList::sNumImages = 0;
 LLViewerTextureList gTextureList;
 static LLTrace::BlockTimerStatHandle FTM_PROCESS_IMAGES("Process Images");
 
+
 ///////////////////////////////////////////////////////////////////////////////
 
 LLViewerTextureList::LLViewerTextureList() 
@@ -1587,28 +1588,31 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori
 }
 
 LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename,
-											  BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority )
+											  BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority,
+											  LLUIImage::EScaleStyle scale_style)
 {
 	if (boost_priority == LLGLTexture::BOOST_NONE)
 	{
 		boost_priority = LLGLTexture::BOOST_UI;
 	}
 	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, FTT_LOCAL_FILE, MIPMAP_NO, boost_priority);
-	return loadUIImage(imagep, name, use_mips, scale_rect, clip_rect);
+	return loadUIImage(imagep, name, use_mips, scale_rect, clip_rect, scale_style);
 }
 
 LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,
-											BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority)
+											BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority,
+											LLUIImage::EScaleStyle scale_style)
 {
 	if (boost_priority == LLGLTexture::BOOST_NONE)
 	{
 		boost_priority = LLGLTexture::BOOST_UI;
 	}
 	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, MIPMAP_NO, boost_priority);
-	return loadUIImage(imagep, id.asString(), use_mips, scale_rect, clip_rect);
+	return loadUIImage(imagep, id.asString(), use_mips, scale_rect, clip_rect, scale_style);
 }
 
-LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect)
+LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect,
+										LLUIImage::EScaleStyle scale_style)
 {
 	if (!imagep) return NULL;
 
@@ -1621,6 +1625,8 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st
 	imagep->setNoDelete();
 
 	LLUIImagePtr new_imagep = new LLUIImage(name, imagep);
+	new_imagep->setScaleStyle(scale_style);
+
 	mUIImages.insert(std::make_pair(name, new_imagep));
 	mUITextureList.push_back(imagep);
 
@@ -1639,7 +1645,7 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st
 	return new_imagep;
 }
 
-LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect)
+LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLUIImage::EScaleStyle scale_style)
 {
 	// look for existing image
 	uuid_ui_image_map_t::iterator found_it = mUIImages.find(name);
@@ -1649,7 +1655,7 @@ LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::s
 		LL_ERRS() << "UI Image " << name << " already loaded." << LL_ENDL;
 	}
 
-	return loadUIImageByName(name, filename, use_mips, scale_rect, clip_rect);
+	return loadUIImageByName(name, filename, use_mips, scale_rect, clip_rect, LLGLTexture::BOOST_UI, scale_style);
 }
 
 //static 
@@ -1709,14 +1715,28 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v
 	}
 }
 
+namespace LLInitParam
+{
+	template<>
+	struct TypeValues<LLUIImage::EScaleStyle> : public TypeValuesHelper<LLUIImage::EScaleStyle>
+	{
+		static void declareValues()
+		{
+			declare("scale_inner",	LLUIImage::SCALE_INNER);
+			declare("scale_outer",	LLUIImage::SCALE_OUTER);
+		}
+	};
+}
+
 struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>
 {
-	Mandatory<std::string>	name;
-	Optional<std::string>	file_name;
-	Optional<bool>			preload;
-	Optional<LLRect>		scale;
-	Optional<LLRect>		clip;
-	Optional<bool>			use_mips;
+	Mandatory<std::string>		name;
+	Optional<std::string>		file_name;
+	Optional<bool>				preload;
+	Optional<LLRect>			scale;
+	Optional<LLRect>			clip;
+	Optional<bool>				use_mips;
+	Optional<LLUIImage::EScaleStyle> scale_type;
 
 	UIImageDeclaration()
 	:	name("name"),
@@ -1724,7 +1744,8 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>
 		preload("preload", false),
 		scale("scale"),
 		clip("clip"),
-		use_mips("use_mips", false)
+		use_mips("use_mips", false),
+		scale_type("scale_type", LLUIImage::SCALE_INNER)
 	{}
 };
 
@@ -1812,7 +1833,7 @@ bool LLUIImageList::initFromFile()
 			{
 				continue;
 			}
-			preloadUIImage(image.name, file_name, image.use_mips, image.scale, image.clip);
+			preloadUIImage(image.name, file_name, image.use_mips, image.scale, image.clip, image.scale_type);
 		}
 
 		if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload"))
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 9dd3a9ee8b1..2f84d0947a9 100755
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -218,20 +218,22 @@ class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIIm
 
 	bool initFromFile();
 
-	LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect);
+	LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLUIImage::EScaleStyle stype);
 	
 	static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
 private:
 	LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename,
 		                           BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, 
 								   const LLRect& clip_rect = LLRect::null,
-		                           LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_UI);
+		                           LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_UI,
+								   LLUIImage::EScaleStyle = LLUIImage::SCALE_INNER);
 	LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id,
 								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, 
 								 const LLRect& clip_rect = LLRect::null,
-								 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_UI);
+								 LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_UI,
+								 LLUIImage::EScaleStyle = LLUIImage::SCALE_INNER);
 
-	LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, const LLRect& clip_rect = LLRect::null);
+	LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, const LLRect& clip_rect = LLRect::null, LLUIImage::EScaleStyle = LLUIImage::SCALE_INNER);
 
 
 	struct LLUIImageLoadData
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 54f60f4441f..ff0a692741e 100755
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -29,7 +29,7 @@ with the same filename but different name
 -->
 
 <textures version="101">
-  <!-- Please add new files alphabetically to prevent merge conflicts. JC -->
+	<!-- Please add new files alphabetically to prevent merge conflicts. JC -->
   <texture name="Accordion_ArrowClosed_Off" file_name="containers/Accordion_ArrowClosed_Off.png" preload="false" />
   <texture name="Accordion_ArrowClosed_Press" file_name="containers/Accordion_ArrowClosed_Press.png" preload="false" />
   <texture name="Accordion_ArrowOpened_Off" file_name="containers/Accordion_ArrowOpened_Off.png" preload="false" />
@@ -231,8 +231,9 @@ with the same filename but different name
 
 
   <texture name="Home_Off" file_name="navbar/Home_Off.png" preload="false" />
+	<texture name="Horizontal Drag Handle" file_name="widgets/horizontal_drag_handle.png" scale.left="8" scale.right="120" scale.bottom="1" scale.top="6" scale_type="scale_outer"/>
 
-  <texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" />
+	<texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" />
   <texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" />
   <texture name="Icon_Close_Toast" file_name="windows/Icon_Close_Toast.png" preload="true" />
 
@@ -646,8 +647,9 @@ with the same filename but different name
   <texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />
 
   <texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" />
+	<texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png" scale.left="2" scale.right="7" scale.bottom="8" scale.top="120"  scale_type="scale_outer"/>
 
-    <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
+	<texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
            scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />
 
   <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
@@ -775,6 +777,4 @@ with the same filename but different name
   <texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
   <texture name="NavBar Separator" file_name="navbar/separator.png"/>
 
-  <texture name="Horizontal Drag Handle" file_name="widgets/horizontal_drag_handle.png"/>
-  <texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png"/>
 </textures>
diff --git a/indra/newview/skins/default/textures/widgets/horizontal_drag_handle.png b/indra/newview/skins/default/textures/widgets/horizontal_drag_handle.png
index 642eac406553f2d704edf23cc04a9eba2272ca43..5f5a33be42831857a1087c4d6c90ead2b9770baf 100644
GIT binary patch
delta 202
zcmX@gc$0C0cs&OP8v_G_;oa|bK#C>Z(btiIVPik{pF~z5pR>RtvY3H^TL^?1FWs&C
z0~BO0@$_|NzstfUX3X@f-9j5EBv#@YQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`PW{o-pT
zP=%YPi(^QH``e2fIT;K%Tmrw}KaeS`!ZpcRtI4VBzk|h=9Zrl43mihHyVo4}SJ*%Q
y*WM{lq<_vhG4pM5%~k#BJ<}KV)HAFQxS74Z^<lw;gBO5CGI+ZBxvX<aXaWF?g-B8W

delta 182
zcmcb~c$9I1cs&aT8v_G_o4h$IkYX$ja(7}_cTVOdki(Yb?e4<x9|RZdT|OBo!dc)E
zS<Jw|Eeyhp4727)00r4gJbhi+@3L@-88iKAx6lR(xq7-dhIkxLPLN<#mNJ;MIP=+=
zng1_ezAWk9oL|r|(>VQ~ySTDh-Ha1kdGu#5y&+?AYMHEbc*^8SmXa^0UUFls^<oNo
b%*=3dP4>puS0|+cO=R$N^>bP0l+XkK!4Esz

diff --git a/indra/newview/skins/default/textures/widgets/vertical_drag_handle.png b/indra/newview/skins/default/textures/widgets/vertical_drag_handle.png
index b06b70cf36630d0dd7d43fa66fc5777c9db37805..2ce5208c21bb54812f5cd6ff2dd44e24d7c38294 100644
GIT binary patch
literal 238
zcmeAS@N?(olHy`uVBq!ia0vp^96;Q_!3HGF-e}kXDVB6cUq=Rpjs4tz5?O(K&H|6f
zVg?3oArNM~bhqvgP>{XE)7O>#E(@2Kq1u;C`znA!VkNE-CBgY=CFO}lsSE{)nRz98
zd8s7|CVB?eFTQ31RYZHbIEF;Hzdaww)u152_Hgfi-fvr4AK0~8hD02x@o%#CYmJ*a
zGumEm>*<FJ^w#eWSk`<#`UAU~g75^+6D%oAMvOBXd>qsk)T_LkS(hL^r!UJuW}*16
dK>qF<jI$zJA8uF~eH>^FgQu&X%Q~loCIGbHP51x+

literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^EI{1A!3HFCE}Yl^q!^2X+?^QKos)S9<gg`qySp&_
z2f+n<mrn+Ya29w(7Bet#3xhBt!>l<HKtc8rPhVH|yDVH{hH76n?W+I^xp=xbhIkxL
zPLPmGcy?yyf60lKJV4NMLS_fUE(PW|$5p$FLQb!k7O1;8%57_pitZ8V6D}LXlAW&2
jnm6y9$MRd<Vhjuy_vf*0Ri5+$XdZ*7tDnm{r-UW|{r^1%

diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 1c882bb099a..0518688f45a 100755
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
- default_tab_group="1"
  follows="all"
  height="423"
  label="Things"
@@ -57,7 +56,6 @@
      left="7"
      name="inventory filter tabs"
      tab_height="30"
-     tab_group="1"
      tab_position="top"
      tab_min_width="100"
      top_pad="10"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 14bd3494804..d3e24a19efd 100755
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -12,17 +12,19 @@
 		 follows="all"
 		 layout="topleft"
 		 left="0"
-		 name="sidepanel__inventory_panel"
+		 name="sidepanel_inventory_panel"
 		 top="0"
 		 label=""
 		 height="570"
 		 visible="true"
+		 default_tab_group="1"
 		 width="330">
-         <layout_stack
+      <layout_stack
               follows="left|right|top|bottom"
               layout="topleft"
               left="0"
               top="0"
+							tab_group="1"
               orientation="vertical"
               name="inventory_layout_stack"
               height="535"
@@ -75,7 +77,7 @@
                      <button
                         control_name="InventoryInboxToggleState"
                         label="Received items"
-						font="SansSerifMedium"
+												font="SansSerifMedium"
                         name="inbox_btn"
                         height="35"
                         width="308"
@@ -116,61 +118,56 @@
                         background_opaque="true"
                         tool_tip="Drag and drop items to your inventory to use them"
                         >
-                        <text
-							name="inbox_inventory_placeholder"
-							type="string"
-							follows="all"
-							layout="topleft"
-							top="0"
-							left="0"
-							width="308"
-							height="200"
-							wrap="true"
-							halign="center">
-							Purchases from the marketplace will be delivered here.
-						</text>
+                        <text name="inbox_inventory_placeholder"
+															type="string"
+															follows="all"
+															layout="topleft"
+															top="0"
+															left="0"
+															width="308"
+															height="200"
+															wrap="true"
+															halign="center">
+Purchases from the marketplace will be delivered here.
+												</text>
                     </panel>
                  </panel>
              </layout_panel>
          </layout_stack>
-		<panel
-		     follows="bottom|left|right"
-			 height="30"
-			 layout="topleft"
-			 name="button_panel"
-			 left="9"
-             top_pad="7"
-			 width="308">
-			<layout_stack
-     	         follows="bottom|left|right"
-		         height="23"
-		         layout="topleft"
-		         mouse_opaque="false"
-		         name="button_panel_ls"
-		         left="0"
-		         orientation="horizontal"
-		         top="0"
-		         width="308">	
-			    <layout_panel
-			         follows="bottom|left|right"
-			         height="23"
-                     layout="bottomleft"
-                     left="0"			
-                     mouse_opaque="false"
-                     name="info_btn_lp"
-                     auto_resize="true"
-                     width="101">
-                    <button
-                         enabled="true"
-                         follows="bottom|left|right"
-                         height="23"
-                         label="Profile"
-                         layout="topleft"
-                         left="1"
-                         name="info_btn"
-                         tool_tip="Show object profile"
-                         top="0"
-                         width="100" />
+			<panel follows="bottom|left|right"
+					 height="30"
+					 layout="topleft"
+					 name="button_panel"
+					 left="9"
+					 top_pad="7"
+					 width="308">
+				<layout_stack follows="bottom|left|right"
+											height="23"
+											layout="topleft"
+											mouse_opaque="false"
+											name="button_panel_ls"
+											left="0"
+											orientation="horizontal"
+											top="0"
+											width="308">	
+			    <layout_panel follows="bottom|left|right"
+												height="23"
+												layout="bottomleft"
+												left="0"			
+												mouse_opaque="false"
+												name="info_btn_lp"
+												auto_resize="true"
+												width="101">
+						<button enabled="true"
+										follows="bottom|left|right"
+										height="23"
+										label="Profile"
+										layout="topleft"
+										left="1"
+										name="info_btn"
+										tool_tip="Show object profile"
+										top="0"
+										width="100" />
 			    </layout_panel>
 			    <layout_panel
                      follows="bottom|left|right"
diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
index 4d69dda7eb4..7f8fac04d0e 100755
--- a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
+++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 
-<avatar_icon
-    name="avatar_icon"
-    default_icon_name="Generic_Person_Large"
-    use_draw_context_alpha="false">
-</avatar_icon>
+<avatar_icon name="avatar_icon"
+						 default_icon_name="Generic_Person_Large"
+						 use_draw_context_alpha="false"
+						 symbol_hpad = "2"
+						 symbol_vpad = "1"
+						 symbol_size = "5"/>
+
-- 
GitLab