11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkStackViewLayout.h"
90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkStackViewLayout::SkStackViewLayout()
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fMargin.set(0, 0, 0, 0);
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fSpacer	= 0;
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fOrient	= kHorizontal_Orient;
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fPack	= kStart_Pack;
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fAlign	= kStart_Align;
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fRound	= false;
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkStackViewLayout::setOrient(Orient ori)
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkASSERT((unsigned)ori < kOrientCount);
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fOrient = SkToU8(ori);
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkStackViewLayout::getMargin(SkRect* margin) const
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (margin)
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		*margin = fMargin;
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkStackViewLayout::setMargin(const SkRect& margin)
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fMargin = margin;
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkStackViewLayout::setSpacer(SkScalar spacer)
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fSpacer = spacer;
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkStackViewLayout::setPack(Pack pack)
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkASSERT((unsigned)pack < kPackCount);
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fPack = SkToU8(pack);
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkStackViewLayout::setAlign(Align align)
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkASSERT((unsigned)align < kAlignCount);
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fAlign = SkToU8(align);
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkStackViewLayout::setRound(bool r)
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fRound = SkToU8(r);
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////////
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergertypedef SkScalar (*AlignProc)(SkScalar childLimit, SkScalar parentLimit);
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergertypedef SkScalar (SkView::*GetSizeProc)() const;
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergertypedef void (SkView::*SetLocProc)(SkScalar coord);
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergertypedef void (SkView::*SetSizeProc)(SkScalar coord);
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkScalar left_align_proc(SkScalar childLimit, SkScalar parentLimit) { return 0; }
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkScalar center_align_proc(SkScalar childLimit, SkScalar parentLimit) { return SkScalarHalf(parentLimit - childLimit); }
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkScalar right_align_proc(SkScalar childLimit, SkScalar parentLimit) { return parentLimit - childLimit; }
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkScalar fill_align_proc(SkScalar childLimit, SkScalar parentLimit) { return 0; }
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*	Measure the main-dimension for all the children. If a child is marked flex in that direction
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	ignore its current value but increment the counter for flexChildren
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger*/
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkScalar compute_children_limit(SkView* parent, GetSizeProc sizeProc, int* count,
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger									   uint32_t flexMask, int* flexCount)
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkView::B2FIter	iter(parent);
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkView*			child;
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkScalar		limit = 0;
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	int				n = 0, flex = 0;
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	while ((child = iter.next()) != NULL)
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	{
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		n += 1;
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		if (child->getFlags() & flexMask)
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			flex += 1;
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		else
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			limit += (child->*sizeProc)();
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	}
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (count)
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		*count = n;
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (flexCount)
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		*flexCount = flex;
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	return limit;
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkStackViewLayout::onLayoutChildren(SkView* parent)
980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	static AlignProc gAlignProcs[] = {
1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		left_align_proc,
1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		center_align_proc,
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		right_align_proc,
1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		fill_align_proc
1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	};
1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkScalar			startM, endM, crossStartM, crossLimit;
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	GetSizeProc			mainGetSizeP, crossGetSizeP;
1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SetLocProc			mainLocP, crossLocP;
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SetSizeProc			mainSetSizeP, crossSetSizeP;
1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkView::Flag_Mask	flexMask;
1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (fOrient == kHorizontal_Orient)
1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	{
1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		startM		= fMargin.fLeft;
1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		endM		= fMargin.fRight;
1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossStartM	= fMargin.fTop;
1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossLimit	= -fMargin.fTop - fMargin.fBottom;
1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		mainGetSizeP	= &SkView::width;
1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossGetSizeP	= &SkView::height;
1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		mainLocP	= &SkView::setLocX;
1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossLocP	= &SkView::setLocY;
1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		mainSetSizeP  = &SkView::setWidth;
1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossSetSizeP = &SkView::setHeight;
1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		flexMask	= SkView::kFlexH_Mask;
1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	}
1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	else
1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	{
1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		startM		= fMargin.fTop;
1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		endM		= fMargin.fBottom;
1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossStartM	= fMargin.fLeft;
1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossLimit	= -fMargin.fLeft - fMargin.fRight;
1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		mainGetSizeP	= &SkView::height;
1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossGetSizeP	= &SkView::width;
1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		mainLocP	= &SkView::setLocY;
1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossLocP	= &SkView::setLocX;
1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		mainSetSizeP  = &SkView::setHeight;
1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossSetSizeP = &SkView::setWidth;
1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		flexMask	= SkView::kFlexV_Mask;
1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	}
1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	crossLimit += (parent->*crossGetSizeP)();
1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (fAlign != kStretch_Align)
1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		crossSetSizeP = NULL;
1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	int			childCount, flexCount;
1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkScalar	childLimit = compute_children_limit(parent, mainGetSizeP, &childCount, flexMask, &flexCount);
1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (childCount == 0)
1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		return;
1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	childLimit += (childCount - 1) * fSpacer;
1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkScalar		parentLimit = (parent->*mainGetSizeP)() - startM - endM;
1590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkScalar		pos = startM + gAlignProcs[fPack](childLimit, parentLimit);
1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkScalar		flexAmount = 0;
1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkView::B2FIter	iter(parent);
1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkView*			child;
1630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (flexCount > 0 && parentLimit > childLimit)
1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		flexAmount = (parentLimit - childLimit) / flexCount;
1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	while ((child = iter.next()) != NULL)
1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	{
1690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		if (fRound)
1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			pos = SkIntToScalar(SkScalarRound(pos));
1710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		(child->*mainLocP)(pos);
1720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkScalar crossLoc = crossStartM + gAlignProcs[fAlign]((child->*crossGetSizeP)(), crossLimit);
1730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		if (fRound)
1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			crossLoc = SkIntToScalar(SkScalarRound(crossLoc));
1750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		(child->*crossLocP)(crossLoc);
1760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		if (crossSetSizeP)
1780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			(child->*crossSetSizeP)(crossLimit);
1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		if (child->getFlags() & flexMask)
1800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			(child->*mainSetSizeP)(flexAmount);
1810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		pos += (child->*mainGetSizeP)() + fSpacer;
1820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	}
1830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////////////
1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifdef SK_DEBUG
1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	static void assert_no_attr(const SkDOM& dom, const SkDOM::Node* node, const char attr[])
1890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	{
1900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		const char* value = dom.findAttr(node, attr);
1910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		if (value)
1920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger			SkDebugf("unknown attribute %s=\"%s\"\n", attr, value);
1930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	}
1940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#else
1950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	#define assert_no_attr(dom, node, attr)
1960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
1970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkStackViewLayout::onInflate(const SkDOM& dom, const SkDOM::Node* node)
1990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
2000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	int			index;
2010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkScalar	value[4];
2020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if ((index = dom.findList(node, "orient", "horizontal,vertical")) >= 0)
2040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		this->setOrient((Orient)index);
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger	else {
2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		assert_no_attr(dom, node, "orient");
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (dom.findScalars(node, "margin", value, 4))
2100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	{
2110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		SkRect	margin;
2120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		margin.set(value[0], value[1], value[2], value[3]);
2130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		this->setMargin(margin);
2140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	}
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger	else {
2160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		assert_no_attr(dom, node, "margin");
2171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (dom.findScalar(node, "spacer", value))
2200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		this->setSpacer(value[0]);
2211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger	else {
2220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		assert_no_attr(dom, node, "spacer");
2231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if ((index = dom.findList(node, "pack", "start,center,end")) >= 0)
2260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		this->setPack((Pack)index);
2271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger	else {
2280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		assert_no_attr(dom, node, "pack");
2291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if ((index = dom.findList(node, "align", "start,center,end,stretch")) >= 0)
2320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		this->setAlign((Align)index);
2331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger	else {
2340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		assert_no_attr(dom, node, "align");
2351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger///////////////////////////////////////////////////////////////////////////////////////////
2390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2400b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkFillViewLayout::SkFillViewLayout()
2410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
2420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fMargin.setEmpty();
2430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkFillViewLayout::getMargin(SkRect* r) const
2460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
2470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	if (r)
2480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		*r = fMargin;
2490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkFillViewLayout::setMargin(const SkRect& margin)
2520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
2530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	fMargin = margin;
2540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkFillViewLayout::onLayoutChildren(SkView* parent)
2570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
2580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkView::B2FIter	iter(parent);
2590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	SkView*			child;
2600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	while ((child = iter.next()) != NULL)
2620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	{
2630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		child->setLoc(fMargin.fLeft, fMargin.fTop);
2640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger		child->setSize(	parent->width() - fMargin.fRight - fMargin.fLeft,
2650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger						parent->height() - fMargin.fBottom - fMargin.fTop);
2660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	}
2670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkFillViewLayout::onInflate(const SkDOM& dom, const SkDOM::Node* node)
2700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{
2710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	this->INHERITED::onInflate(dom, node);
2720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	(void)dom.findScalars(node, "margin", (SkScalar*)&fMargin, 4);
2730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
2740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
275