Index: src/views/SkStackViewLayout.cpp |
diff --git a/src/views/SkStackViewLayout.cpp b/src/views/SkStackViewLayout.cpp |
deleted file mode 100644 |
index b0c8c8ce02333c87b5117777c9efe3c0d406ca9e..0000000000000000000000000000000000000000 |
--- a/src/views/SkStackViewLayout.cpp |
+++ /dev/null |
@@ -1,273 +0,0 @@ |
- |
-/* |
- * Copyright 2011 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
-#include "SkStackViewLayout.h" |
- |
-SkStackViewLayout::SkStackViewLayout() |
-{ |
- fMargin.set(0, 0, 0, 0); |
- fSpacer = 0; |
- fOrient = kHorizontal_Orient; |
- fPack = kStart_Pack; |
- fAlign = kStart_Align; |
- fRound = false; |
-} |
- |
-void SkStackViewLayout::setOrient(Orient ori) |
-{ |
- SkASSERT((unsigned)ori < kOrientCount); |
- fOrient = SkToU8(ori); |
-} |
- |
-void SkStackViewLayout::getMargin(SkRect* margin) const |
-{ |
- if (margin) |
- *margin = fMargin; |
-} |
- |
-void SkStackViewLayout::setMargin(const SkRect& margin) |
-{ |
- fMargin = margin; |
-} |
- |
-void SkStackViewLayout::setSpacer(SkScalar spacer) |
-{ |
- fSpacer = spacer; |
-} |
- |
-void SkStackViewLayout::setPack(Pack pack) |
-{ |
- SkASSERT((unsigned)pack < kPackCount); |
- fPack = SkToU8(pack); |
-} |
- |
-void SkStackViewLayout::setAlign(Align align) |
-{ |
- SkASSERT((unsigned)align < kAlignCount); |
- fAlign = SkToU8(align); |
-} |
- |
-void SkStackViewLayout::setRound(bool r) |
-{ |
- fRound = SkToU8(r); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-typedef SkScalar (*AlignProc)(SkScalar childLimit, SkScalar parentLimit); |
-typedef SkScalar (SkView::*GetSizeProc)() const; |
-typedef void (SkView::*SetLocProc)(SkScalar coord); |
-typedef void (SkView::*SetSizeProc)(SkScalar coord); |
- |
-static SkScalar left_align_proc(SkScalar childLimit, SkScalar parentLimit) { return 0; } |
-static SkScalar center_align_proc(SkScalar childLimit, SkScalar parentLimit) { return SkScalarHalf(parentLimit - childLimit); } |
-static SkScalar right_align_proc(SkScalar childLimit, SkScalar parentLimit) { return parentLimit - childLimit; } |
-static SkScalar fill_align_proc(SkScalar childLimit, SkScalar parentLimit) { return 0; } |
- |
-/* Measure the main-dimension for all the children. If a child is marked flex in that direction |
- ignore its current value but increment the counter for flexChildren |
-*/ |
-static SkScalar compute_children_limit(SkView* parent, GetSizeProc sizeProc, int* count, |
- uint32_t flexMask, int* flexCount) |
-{ |
- SkView::B2FIter iter(parent); |
- SkView* child; |
- SkScalar limit = 0; |
- int n = 0, flex = 0; |
- |
- while ((child = iter.next()) != nullptr) |
- { |
- n += 1; |
- if (child->getFlags() & flexMask) |
- flex += 1; |
- else |
- limit += (child->*sizeProc)(); |
- } |
- if (count) |
- *count = n; |
- if (flexCount) |
- *flexCount = flex; |
- return limit; |
-} |
- |
-void SkStackViewLayout::onLayoutChildren(SkView* parent) |
-{ |
- static AlignProc gAlignProcs[] = { |
- left_align_proc, |
- center_align_proc, |
- right_align_proc, |
- fill_align_proc |
- }; |
- |
- SkScalar startM, endM, crossStartM, crossLimit; |
- GetSizeProc mainGetSizeP, crossGetSizeP; |
- SetLocProc mainLocP, crossLocP; |
- SetSizeProc mainSetSizeP, crossSetSizeP; |
- SkView::Flag_Mask flexMask; |
- |
- if (fOrient == kHorizontal_Orient) |
- { |
- startM = fMargin.fLeft; |
- endM = fMargin.fRight; |
- crossStartM = fMargin.fTop; |
- crossLimit = -fMargin.fTop - fMargin.fBottom; |
- |
- mainGetSizeP = &SkView::width; |
- crossGetSizeP = &SkView::height; |
- mainLocP = &SkView::setLocX; |
- crossLocP = &SkView::setLocY; |
- |
- mainSetSizeP = &SkView::setWidth; |
- crossSetSizeP = &SkView::setHeight; |
- |
- flexMask = SkView::kFlexH_Mask; |
- } |
- else |
- { |
- startM = fMargin.fTop; |
- endM = fMargin.fBottom; |
- crossStartM = fMargin.fLeft; |
- crossLimit = -fMargin.fLeft - fMargin.fRight; |
- |
- mainGetSizeP = &SkView::height; |
- crossGetSizeP = &SkView::width; |
- mainLocP = &SkView::setLocY; |
- crossLocP = &SkView::setLocX; |
- |
- mainSetSizeP = &SkView::setHeight; |
- crossSetSizeP = &SkView::setWidth; |
- |
- flexMask = SkView::kFlexV_Mask; |
- } |
- crossLimit += (parent->*crossGetSizeP)(); |
- if (fAlign != kStretch_Align) |
- crossSetSizeP = nullptr; |
- |
- int childCount, flexCount; |
- SkScalar childLimit = compute_children_limit(parent, mainGetSizeP, &childCount, flexMask, &flexCount); |
- |
- if (childCount == 0) |
- return; |
- |
- childLimit += (childCount - 1) * fSpacer; |
- |
- SkScalar parentLimit = (parent->*mainGetSizeP)() - startM - endM; |
- SkScalar pos = startM + gAlignProcs[fPack](childLimit, parentLimit); |
- SkScalar flexAmount = 0; |
- SkView::B2FIter iter(parent); |
- SkView* child; |
- |
- if (flexCount > 0 && parentLimit > childLimit) |
- flexAmount = (parentLimit - childLimit) / flexCount; |
- |
- while ((child = iter.next()) != nullptr) |
- { |
- if (fRound) |
- pos = SkScalarRoundToScalar(pos); |
- (child->*mainLocP)(pos); |
- SkScalar crossLoc = crossStartM + gAlignProcs[fAlign]((child->*crossGetSizeP)(), crossLimit); |
- if (fRound) |
- crossLoc = SkScalarRoundToScalar(crossLoc); |
- (child->*crossLocP)(crossLoc); |
- |
- if (crossSetSizeP) |
- (child->*crossSetSizeP)(crossLimit); |
- if (child->getFlags() & flexMask) |
- (child->*mainSetSizeP)(flexAmount); |
- pos += (child->*mainGetSizeP)() + fSpacer; |
- } |
-} |
- |
-////////////////////////////////////////////////////////////////////////////////////// |
- |
-#ifdef SK_DEBUG |
- static void assert_no_attr(const SkDOM& dom, const SkDOM::Node* node, const char attr[]) |
- { |
- const char* value = dom.findAttr(node, attr); |
- if (value) |
- SkDebugf("unknown attribute %s=\"%s\"\n", attr, value); |
- } |
-#else |
- #define assert_no_attr(dom, node, attr) |
-#endif |
- |
-void SkStackViewLayout::onInflate(const SkDOM& dom, const SkDOM::Node* node) |
-{ |
- int index; |
- SkScalar value[4]; |
- |
- if ((index = dom.findList(node, "orient", "horizontal,vertical")) >= 0) |
- this->setOrient((Orient)index); |
- else { |
- assert_no_attr(dom, node, "orient"); |
- } |
- |
- if (dom.findScalars(node, "margin", value, 4)) |
- { |
- SkRect margin; |
- margin.set(value[0], value[1], value[2], value[3]); |
- this->setMargin(margin); |
- } |
- else { |
- assert_no_attr(dom, node, "margin"); |
- } |
- |
- if (dom.findScalar(node, "spacer", value)) |
- this->setSpacer(value[0]); |
- else { |
- assert_no_attr(dom, node, "spacer"); |
- } |
- |
- if ((index = dom.findList(node, "pack", "start,center,end")) >= 0) |
- this->setPack((Pack)index); |
- else { |
- assert_no_attr(dom, node, "pack"); |
- } |
- |
- if ((index = dom.findList(node, "align", "start,center,end,stretch")) >= 0) |
- this->setAlign((Align)index); |
- else { |
- assert_no_attr(dom, node, "align"); |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////////////////// |
- |
-SkFillViewLayout::SkFillViewLayout() |
-{ |
- fMargin.setEmpty(); |
-} |
- |
-void SkFillViewLayout::getMargin(SkRect* r) const |
-{ |
- if (r) |
- *r = fMargin; |
-} |
- |
-void SkFillViewLayout::setMargin(const SkRect& margin) |
-{ |
- fMargin = margin; |
-} |
- |
-void SkFillViewLayout::onLayoutChildren(SkView* parent) |
-{ |
- SkView::B2FIter iter(parent); |
- SkView* child; |
- |
- while ((child = iter.next()) != nullptr) |
- { |
- child->setLoc(fMargin.fLeft, fMargin.fTop); |
- child->setSize( parent->width() - fMargin.fRight - fMargin.fLeft, |
- parent->height() - fMargin.fBottom - fMargin.fTop); |
- } |
-} |
- |
-void SkFillViewLayout::onInflate(const SkDOM& dom, const SkDOM::Node* node) |
-{ |
- this->INHERITED::onInflate(dom, node); |
- (void)dom.findScalars(node, "margin", (SkScalar*)&fMargin, 4); |
-} |