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