mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-29 07:42:04 +00:00
bug 163614 - Changed DeleteChildsNextInFlow to DeleteNextInFlowChild, params, and callers. sr=kin, r=alexsavulov,dcone
This commit is contained in:
parent
753fba95f6
commit
40902d04df
@ -3705,11 +3705,11 @@ nsBlockFrame::DoReflowInlineFrames(nsBlockReflowState& aState,
|
||||
}
|
||||
if (LINE_REFLOW_OK != lineReflowStatus) {
|
||||
// It is possible that one or more of next lines are empty
|
||||
// (because of DeleteChildsNextInFlow). If so, delete them now
|
||||
// (because of DeleteNextInFlowChild). If so, delete them now
|
||||
// in case we are finished.
|
||||
++aLine;
|
||||
while ((aLine != end_lines()) && (0 == aLine->GetChildCount())) {
|
||||
// XXX Is this still necessary now that DeleteChildsNextInFlow
|
||||
// XXX Is this still necessary now that DeleteNextInFlowChild
|
||||
// uses DoRemoveFrame?
|
||||
nsLineBox *toremove = aLine;
|
||||
aLine = mLines.erase(aLine);
|
||||
@ -5271,36 +5271,21 @@ nsBlockFrame::DoRemoveFrame(nsIPresContext* aPresContext,
|
||||
}
|
||||
|
||||
void
|
||||
nsBlockFrame::DeleteChildsNextInFlow(nsIPresContext* aPresContext,
|
||||
nsIFrame* aChild)
|
||||
nsBlockFrame::DeleteNextInFlowChild(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
// out-of-flow and placeholders frames don't satisfy the IsChild condition because
|
||||
// DeleteChildsNextInFlow needs to be called on the parent of the next-in-flow
|
||||
nsFrameState childState;
|
||||
aChild->GetFrameState(&childState);
|
||||
nsCOMPtr<nsIAtom> frameType;
|
||||
aChild->GetFrameType(getter_AddRefs(frameType));
|
||||
if ((nsLayoutAtoms::placeholderFrame != frameType) && !(childState & NS_FRAME_OUT_OF_FLOW)) {
|
||||
NS_PRECONDITION(IsChild(aPresContext, aChild), "bad geometric parent");
|
||||
}
|
||||
#endif
|
||||
nsIFrame* prevInFlow;
|
||||
aNextInFlow->GetPrevInFlow(&prevInFlow);
|
||||
NS_PRECONDITION(prevInFlow, "bad next-in-flow");
|
||||
NS_PRECONDITION(IsChild(aPresContext, aNextInFlow), "bad geometric parent");
|
||||
|
||||
nsIFrame* nextInFlow;
|
||||
aChild->GetNextInFlow(&nextInFlow);
|
||||
NS_PRECONDITION(nsnull != nextInFlow, "null next-in-flow");
|
||||
#ifdef IBMBIDI
|
||||
nsIFrame* nextBidi;
|
||||
aChild->GetBidiProperty(aPresContext, nsLayoutAtoms::nextBidi,
|
||||
(void**) &nextBidi,sizeof(nextBidi));
|
||||
if (nextBidi != nextInFlow) {
|
||||
prevInFlow->GetBidiProperty(aPresContext, nsLayoutAtoms::nextBidi,
|
||||
(void**) &nextBidi,sizeof(nextBidi));
|
||||
if (nextBidi != aNextInFlow) {
|
||||
#endif // IBMBIDI
|
||||
nsBlockFrame* parent;
|
||||
nextInFlow->GetParent((nsIFrame**)&parent);
|
||||
NS_PRECONDITION(nsnull != parent, "next-in-flow with no parent");
|
||||
NS_PRECONDITION(! parent->mLines.empty(), "next-in-flow with weird parent");
|
||||
// NS_PRECONDITION(nsnull == parent->mOverflowLines, "parent with overflow");
|
||||
parent->DoRemoveFrame(aPresContext, nextInFlow);
|
||||
DoRemoveFrame(aPresContext, aNextInFlow);
|
||||
#ifdef IBMBIDI
|
||||
}
|
||||
#endif // IBMBIDI
|
||||
@ -5321,11 +5306,10 @@ nsBlockFrame::ReflowFloater(nsBlockReflowState& aState,
|
||||
nsIFrame* nextInFlow;
|
||||
aPlaceholder->GetNextInFlow(&nextInFlow);
|
||||
if (nextInFlow) {
|
||||
// Use nextInFlow's parent since it always will be able to find nextInFlow.
|
||||
// If aPlaceholder's parent is an inline, nextInFlow's will be a block.
|
||||
nsHTMLContainerFrame* parent;
|
||||
nextInFlow->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteChildsNextInFlow(aState.mPresContext, aPlaceholder);
|
||||
parent->DeleteNextInFlowChild(aState.mPresContext, nextInFlow);
|
||||
}
|
||||
// Reflow the floater.
|
||||
nsIFrame* floater = aPlaceholder->GetOutOfFlowFrame();
|
||||
@ -6239,7 +6223,7 @@ nsBlockFrame::ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild)
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Debugging
|
||||
// Start Debugging
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
static PRBool
|
||||
@ -6278,16 +6262,34 @@ InSiblingList(nsLineList& aLines, nsIFrame* aFrame)
|
||||
PRBool
|
||||
nsBlockFrame::IsChild(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
||||
{
|
||||
// Continued out-of-flows don't satisfy InLineList(), continued out-of-flows
|
||||
// and placeholders don't satisfy InSiblingList().
|
||||
PRBool skipLineList = PR_FALSE;
|
||||
PRBool skipSiblingList = PR_FALSE;
|
||||
nsIFrame* prevInFlow;
|
||||
aFrame->GetPrevInFlow(&prevInFlow);
|
||||
if (prevInFlow) {
|
||||
nsFrameState state;
|
||||
aFrame->GetFrameState(&state);
|
||||
nsCOMPtr<nsIAtom> frameType;
|
||||
aFrame->GetFrameType(getter_AddRefs(frameType));
|
||||
skipLineList = (state & NS_FRAME_OUT_OF_FLOW);
|
||||
skipSiblingList = (nsLayoutAtoms::placeholderFrame == frameType) ||
|
||||
(state & NS_FRAME_OUT_OF_FLOW);
|
||||
}
|
||||
|
||||
nsIFrame* parent;
|
||||
aFrame->GetParent(&parent);
|
||||
if (parent != (nsIFrame*)this) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
if (InLineList(mLines, aFrame) && InSiblingList(mLines, aFrame)) {
|
||||
if ((skipLineList || InLineList(mLines, aFrame)) &&
|
||||
(skipSiblingList || InSiblingList(mLines, aFrame))) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
nsLineList* overflowLines = GetOverflowLines(aPresContext, PR_FALSE);
|
||||
if (overflowLines && InLineList(*overflowLines, aFrame) && InSiblingList(*overflowLines, aFrame)) {
|
||||
if (overflowLines && (skipLineList || InLineList(*overflowLines, aFrame)) &&
|
||||
(skipSiblingList || InSiblingList(*overflowLines, aFrame))) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
return PR_FALSE;
|
||||
@ -6323,7 +6325,8 @@ nsBlockFrame::SizeOf(nsISizeOfHandler* aHandler, PRUint32* aResult) const
|
||||
}
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// End Debugging
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBlockFrame::Init(nsIPresContext* aPresContext,
|
||||
|
@ -180,8 +180,8 @@ public:
|
||||
|
||||
#endif
|
||||
|
||||
virtual void DeleteChildsNextInFlow(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow);
|
||||
virtual void DeleteNextInFlowChild(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow);
|
||||
|
||||
/** return the topmost block child based on y-index.
|
||||
* almost always the first or second line, if there is one.
|
||||
|
@ -626,8 +626,8 @@ nsBlockReflowContext::ReflowBlock(const nsRect& aSpace,
|
||||
// parent is not this because we are executing pullup code)
|
||||
/* XXX promote DeleteChildsNextInFlow to nsIFrame to elminate this cast */
|
||||
nsHTMLContainerFrame* parent;
|
||||
mFrame->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteChildsNextInFlow(mPresContext, mFrame);
|
||||
kidNextInFlow->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteNextInFlowChild(mPresContext, kidNextInFlow);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -883,7 +883,7 @@ nsContainerFrame::FrameNeedsView(nsIPresContext* aPresContext,
|
||||
/**
|
||||
* Invokes the WillReflow() function, positions the frame and its view (if
|
||||
* requested), and then calls Reflow(). If the reflow succeeds and the child
|
||||
* frame is complete, deletes any next-in-flows using DeleteChildsNextInFlow()
|
||||
* frame is complete, deletes any next-in-flows using DeleteNextInFlowChild()
|
||||
*/
|
||||
nsresult
|
||||
nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
|
||||
@ -953,10 +953,9 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
|
||||
// Remove all of the childs next-in-flows. Make sure that we ask
|
||||
// the right parent to do the removal (it's possible that the
|
||||
// parent is not this because we are executing pullup code)
|
||||
nsIFrame* parent;
|
||||
aKidFrame->GetParent(&parent);
|
||||
((nsContainerFrame*)parent)->DeleteChildsNextInFlow(aPresContext,
|
||||
aKidFrame);
|
||||
nsContainerFrame* parent;
|
||||
kidNextInFlow->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteNextInFlowChild(aPresContext, kidNextInFlow);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -1051,69 +1050,64 @@ nsContainerFrame::FinishReflowChild(nsIFrame* aKidFrame,
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove and delete aChild's next-in-flow(s). Updates the sibling and flow
|
||||
* Remove and delete aNextInFlow and its next-in-flows. Updates the sibling and flow
|
||||
* pointers
|
||||
*
|
||||
* @param aChild child this child's next-in-flow
|
||||
* @return PR_TRUE if successful and PR_FALSE otherwise
|
||||
*/
|
||||
void
|
||||
nsContainerFrame::DeleteChildsNextInFlow(nsIPresContext* aPresContext,
|
||||
nsIFrame* aChild)
|
||||
nsContainerFrame::DeleteNextInFlowChild(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow)
|
||||
{
|
||||
NS_PRECONDITION(mFrames.ContainsFrame(aChild), "bad geometric parent");
|
||||
|
||||
nsIFrame* nextInFlow;
|
||||
nsContainerFrame* parent;
|
||||
|
||||
aChild->GetNextInFlow(&nextInFlow);
|
||||
NS_PRECONDITION(nsnull != nextInFlow, "null next-in-flow");
|
||||
nextInFlow->GetParent((nsIFrame**)&parent);
|
||||
nsIFrame* prevInFlow;
|
||||
aNextInFlow->GetPrevInFlow(&prevInFlow);
|
||||
NS_PRECONDITION(prevInFlow, "bad prev-in-flow");
|
||||
NS_PRECONDITION(mFrames.ContainsFrame(aNextInFlow), "bad geometric parent");
|
||||
|
||||
// If the next-in-flow has a next-in-flow then delete it, too (and
|
||||
// delete it first).
|
||||
nsIFrame* nextNextInFlow;
|
||||
|
||||
nextInFlow->GetNextInFlow(&nextNextInFlow);
|
||||
if (nsnull != nextNextInFlow) {
|
||||
parent->DeleteChildsNextInFlow(aPresContext, nextInFlow);
|
||||
aNextInFlow->GetNextInFlow(&nextNextInFlow);
|
||||
if (nextNextInFlow) {
|
||||
nsContainerFrame* parent;
|
||||
nextNextInFlow->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteNextInFlowChild(aPresContext, nextNextInFlow);
|
||||
}
|
||||
|
||||
#ifdef IBMBIDI
|
||||
nsIFrame* nextBidi;
|
||||
aChild->GetBidiProperty(aPresContext, nsLayoutAtoms::nextBidi,
|
||||
(void**) &nextBidi,sizeof(nextBidi));
|
||||
if (nextBidi == nextInFlow) {
|
||||
prevInFlow->GetBidiProperty(aPresContext, nsLayoutAtoms::nextBidi,
|
||||
(void**) &nextBidi,sizeof(nextBidi));
|
||||
if (nextBidi == aNextInFlow) {
|
||||
return;
|
||||
}
|
||||
#endif // IBMBIDI
|
||||
|
||||
// Disconnect the next-in-flow from the flow list
|
||||
nsSplittableFrame::BreakFromPrevFlow(nextInFlow);
|
||||
nsSplittableFrame::BreakFromPrevFlow(aNextInFlow);
|
||||
|
||||
// Take the next-in-flow out of the parent's child list
|
||||
PRBool result = parent->mFrames.RemoveFrame(nextInFlow);
|
||||
PRBool result = mFrames.RemoveFrame(aNextInFlow);
|
||||
if (!result) {
|
||||
// We didn't find the child in the parent's principal child list.
|
||||
// Maybe it's on the overflow list?
|
||||
nsFrameList overflowFrames(parent->GetOverflowFrames(aPresContext, PR_TRUE));
|
||||
nsFrameList overflowFrames(GetOverflowFrames(aPresContext, PR_TRUE));
|
||||
|
||||
if (overflowFrames.IsEmpty() || !overflowFrames.RemoveFrame(nextInFlow)) {
|
||||
if (overflowFrames.IsEmpty() || !overflowFrames.RemoveFrame(aNextInFlow)) {
|
||||
NS_ASSERTION(result, "failed to remove frame");
|
||||
}
|
||||
|
||||
// Set the overflow property again
|
||||
if (overflowFrames.NotEmpty()) {
|
||||
parent->SetOverflowFrames(aPresContext, overflowFrames.FirstChild());
|
||||
SetOverflowFrames(aPresContext, overflowFrames.FirstChild());
|
||||
}
|
||||
}
|
||||
|
||||
// Delete the next-in-flow frame
|
||||
nextInFlow->Destroy(aPresContext);
|
||||
aNextInFlow->Destroy(aPresContext);
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
aChild->GetNextInFlow(&nextInFlow);
|
||||
NS_POSTCONDITION(nsnull == nextInFlow, "non null next-in-flow");
|
||||
nsIFrame* nextInFlow;
|
||||
prevInFlow->GetNextInFlow(&nextInFlow);
|
||||
NS_POSTCONDITION(!nextInFlow, "non null next-in-flow");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -88,8 +88,8 @@ public:
|
||||
#endif
|
||||
|
||||
// nsContainerFrame methods
|
||||
virtual void DeleteChildsNextInFlow(nsIPresContext* aPresContext,
|
||||
nsIFrame* aChild);
|
||||
virtual void DeleteNextInFlowChild(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow);
|
||||
|
||||
static PRInt32 LengthOf(nsIFrame* aFrameList) {
|
||||
nsFrameList tmp(aFrameList);
|
||||
@ -143,7 +143,7 @@ public:
|
||||
/**
|
||||
* Invokes the WillReflow() function, positions the frame and its view (if
|
||||
* requested), and then calls Reflow(). If the reflow succeeds and the child
|
||||
* frame is complete, deletes any next-in-flows using DeleteChildsNextInFlow()
|
||||
* frame is complete, deletes any next-in-flows using DeleteNextInFlowChild()
|
||||
*
|
||||
* Flags:
|
||||
* NS_FRAME_NO_MOVE_VIEW - don't position the frame's view. Set this if you
|
||||
|
@ -275,7 +275,7 @@ nsFirstLetterFrame::Reflow(nsIPresContext* aPresContext,
|
||||
kid->GetNextInFlow(&kidNextInFlow);
|
||||
if (nsnull != kidNextInFlow) {
|
||||
// Remove all of the childs next-in-flows
|
||||
DeleteChildsNextInFlow(aPresContext, kid);
|
||||
DeleteNextInFlowChild(aPresContext, kidNextInFlow);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -1288,8 +1288,8 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
|
||||
// the right parent to do the removal (it's possible that the
|
||||
// parent is not this because we are executing pullup code)
|
||||
nsHTMLContainerFrame* parent;
|
||||
aFrame->GetParent((nsIFrame**) &parent);
|
||||
parent->DeleteChildsNextInFlow(mPresContext, aFrame);
|
||||
kidNextInFlow->GetParent((nsIFrame**) &parent);
|
||||
parent->DeleteNextInFlowChild(mPresContext, kidNextInFlow);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3705,11 +3705,11 @@ nsBlockFrame::DoReflowInlineFrames(nsBlockReflowState& aState,
|
||||
}
|
||||
if (LINE_REFLOW_OK != lineReflowStatus) {
|
||||
// It is possible that one or more of next lines are empty
|
||||
// (because of DeleteChildsNextInFlow). If so, delete them now
|
||||
// (because of DeleteNextInFlowChild). If so, delete them now
|
||||
// in case we are finished.
|
||||
++aLine;
|
||||
while ((aLine != end_lines()) && (0 == aLine->GetChildCount())) {
|
||||
// XXX Is this still necessary now that DeleteChildsNextInFlow
|
||||
// XXX Is this still necessary now that DeleteNextInFlowChild
|
||||
// uses DoRemoveFrame?
|
||||
nsLineBox *toremove = aLine;
|
||||
aLine = mLines.erase(aLine);
|
||||
@ -5271,36 +5271,21 @@ nsBlockFrame::DoRemoveFrame(nsIPresContext* aPresContext,
|
||||
}
|
||||
|
||||
void
|
||||
nsBlockFrame::DeleteChildsNextInFlow(nsIPresContext* aPresContext,
|
||||
nsIFrame* aChild)
|
||||
nsBlockFrame::DeleteNextInFlowChild(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
// out-of-flow and placeholders frames don't satisfy the IsChild condition because
|
||||
// DeleteChildsNextInFlow needs to be called on the parent of the next-in-flow
|
||||
nsFrameState childState;
|
||||
aChild->GetFrameState(&childState);
|
||||
nsCOMPtr<nsIAtom> frameType;
|
||||
aChild->GetFrameType(getter_AddRefs(frameType));
|
||||
if ((nsLayoutAtoms::placeholderFrame != frameType) && !(childState & NS_FRAME_OUT_OF_FLOW)) {
|
||||
NS_PRECONDITION(IsChild(aPresContext, aChild), "bad geometric parent");
|
||||
}
|
||||
#endif
|
||||
nsIFrame* prevInFlow;
|
||||
aNextInFlow->GetPrevInFlow(&prevInFlow);
|
||||
NS_PRECONDITION(prevInFlow, "bad next-in-flow");
|
||||
NS_PRECONDITION(IsChild(aPresContext, aNextInFlow), "bad geometric parent");
|
||||
|
||||
nsIFrame* nextInFlow;
|
||||
aChild->GetNextInFlow(&nextInFlow);
|
||||
NS_PRECONDITION(nsnull != nextInFlow, "null next-in-flow");
|
||||
#ifdef IBMBIDI
|
||||
nsIFrame* nextBidi;
|
||||
aChild->GetBidiProperty(aPresContext, nsLayoutAtoms::nextBidi,
|
||||
(void**) &nextBidi,sizeof(nextBidi));
|
||||
if (nextBidi != nextInFlow) {
|
||||
prevInFlow->GetBidiProperty(aPresContext, nsLayoutAtoms::nextBidi,
|
||||
(void**) &nextBidi,sizeof(nextBidi));
|
||||
if (nextBidi != aNextInFlow) {
|
||||
#endif // IBMBIDI
|
||||
nsBlockFrame* parent;
|
||||
nextInFlow->GetParent((nsIFrame**)&parent);
|
||||
NS_PRECONDITION(nsnull != parent, "next-in-flow with no parent");
|
||||
NS_PRECONDITION(! parent->mLines.empty(), "next-in-flow with weird parent");
|
||||
// NS_PRECONDITION(nsnull == parent->mOverflowLines, "parent with overflow");
|
||||
parent->DoRemoveFrame(aPresContext, nextInFlow);
|
||||
DoRemoveFrame(aPresContext, aNextInFlow);
|
||||
#ifdef IBMBIDI
|
||||
}
|
||||
#endif // IBMBIDI
|
||||
@ -5321,11 +5306,10 @@ nsBlockFrame::ReflowFloater(nsBlockReflowState& aState,
|
||||
nsIFrame* nextInFlow;
|
||||
aPlaceholder->GetNextInFlow(&nextInFlow);
|
||||
if (nextInFlow) {
|
||||
// Use nextInFlow's parent since it always will be able to find nextInFlow.
|
||||
// If aPlaceholder's parent is an inline, nextInFlow's will be a block.
|
||||
nsHTMLContainerFrame* parent;
|
||||
nextInFlow->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteChildsNextInFlow(aState.mPresContext, aPlaceholder);
|
||||
parent->DeleteNextInFlowChild(aState.mPresContext, nextInFlow);
|
||||
}
|
||||
// Reflow the floater.
|
||||
nsIFrame* floater = aPlaceholder->GetOutOfFlowFrame();
|
||||
@ -6239,7 +6223,7 @@ nsBlockFrame::ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild)
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Debugging
|
||||
// Start Debugging
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
static PRBool
|
||||
@ -6278,16 +6262,34 @@ InSiblingList(nsLineList& aLines, nsIFrame* aFrame)
|
||||
PRBool
|
||||
nsBlockFrame::IsChild(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
||||
{
|
||||
// Continued out-of-flows don't satisfy InLineList(), continued out-of-flows
|
||||
// and placeholders don't satisfy InSiblingList().
|
||||
PRBool skipLineList = PR_FALSE;
|
||||
PRBool skipSiblingList = PR_FALSE;
|
||||
nsIFrame* prevInFlow;
|
||||
aFrame->GetPrevInFlow(&prevInFlow);
|
||||
if (prevInFlow) {
|
||||
nsFrameState state;
|
||||
aFrame->GetFrameState(&state);
|
||||
nsCOMPtr<nsIAtom> frameType;
|
||||
aFrame->GetFrameType(getter_AddRefs(frameType));
|
||||
skipLineList = (state & NS_FRAME_OUT_OF_FLOW);
|
||||
skipSiblingList = (nsLayoutAtoms::placeholderFrame == frameType) ||
|
||||
(state & NS_FRAME_OUT_OF_FLOW);
|
||||
}
|
||||
|
||||
nsIFrame* parent;
|
||||
aFrame->GetParent(&parent);
|
||||
if (parent != (nsIFrame*)this) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
if (InLineList(mLines, aFrame) && InSiblingList(mLines, aFrame)) {
|
||||
if ((skipLineList || InLineList(mLines, aFrame)) &&
|
||||
(skipSiblingList || InSiblingList(mLines, aFrame))) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
nsLineList* overflowLines = GetOverflowLines(aPresContext, PR_FALSE);
|
||||
if (overflowLines && InLineList(*overflowLines, aFrame) && InSiblingList(*overflowLines, aFrame)) {
|
||||
if (overflowLines && (skipLineList || InLineList(*overflowLines, aFrame)) &&
|
||||
(skipSiblingList || InSiblingList(*overflowLines, aFrame))) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
return PR_FALSE;
|
||||
@ -6323,7 +6325,8 @@ nsBlockFrame::SizeOf(nsISizeOfHandler* aHandler, PRUint32* aResult) const
|
||||
}
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// End Debugging
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBlockFrame::Init(nsIPresContext* aPresContext,
|
||||
|
@ -180,8 +180,8 @@ public:
|
||||
|
||||
#endif
|
||||
|
||||
virtual void DeleteChildsNextInFlow(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow);
|
||||
virtual void DeleteNextInFlowChild(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow);
|
||||
|
||||
/** return the topmost block child based on y-index.
|
||||
* almost always the first or second line, if there is one.
|
||||
|
@ -626,8 +626,8 @@ nsBlockReflowContext::ReflowBlock(const nsRect& aSpace,
|
||||
// parent is not this because we are executing pullup code)
|
||||
/* XXX promote DeleteChildsNextInFlow to nsIFrame to elminate this cast */
|
||||
nsHTMLContainerFrame* parent;
|
||||
mFrame->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteChildsNextInFlow(mPresContext, mFrame);
|
||||
kidNextInFlow->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteNextInFlowChild(mPresContext, kidNextInFlow);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -883,7 +883,7 @@ nsContainerFrame::FrameNeedsView(nsIPresContext* aPresContext,
|
||||
/**
|
||||
* Invokes the WillReflow() function, positions the frame and its view (if
|
||||
* requested), and then calls Reflow(). If the reflow succeeds and the child
|
||||
* frame is complete, deletes any next-in-flows using DeleteChildsNextInFlow()
|
||||
* frame is complete, deletes any next-in-flows using DeleteNextInFlowChild()
|
||||
*/
|
||||
nsresult
|
||||
nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
|
||||
@ -953,10 +953,9 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
|
||||
// Remove all of the childs next-in-flows. Make sure that we ask
|
||||
// the right parent to do the removal (it's possible that the
|
||||
// parent is not this because we are executing pullup code)
|
||||
nsIFrame* parent;
|
||||
aKidFrame->GetParent(&parent);
|
||||
((nsContainerFrame*)parent)->DeleteChildsNextInFlow(aPresContext,
|
||||
aKidFrame);
|
||||
nsContainerFrame* parent;
|
||||
kidNextInFlow->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteNextInFlowChild(aPresContext, kidNextInFlow);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -1051,69 +1050,64 @@ nsContainerFrame::FinishReflowChild(nsIFrame* aKidFrame,
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove and delete aChild's next-in-flow(s). Updates the sibling and flow
|
||||
* Remove and delete aNextInFlow and its next-in-flows. Updates the sibling and flow
|
||||
* pointers
|
||||
*
|
||||
* @param aChild child this child's next-in-flow
|
||||
* @return PR_TRUE if successful and PR_FALSE otherwise
|
||||
*/
|
||||
void
|
||||
nsContainerFrame::DeleteChildsNextInFlow(nsIPresContext* aPresContext,
|
||||
nsIFrame* aChild)
|
||||
nsContainerFrame::DeleteNextInFlowChild(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow)
|
||||
{
|
||||
NS_PRECONDITION(mFrames.ContainsFrame(aChild), "bad geometric parent");
|
||||
|
||||
nsIFrame* nextInFlow;
|
||||
nsContainerFrame* parent;
|
||||
|
||||
aChild->GetNextInFlow(&nextInFlow);
|
||||
NS_PRECONDITION(nsnull != nextInFlow, "null next-in-flow");
|
||||
nextInFlow->GetParent((nsIFrame**)&parent);
|
||||
nsIFrame* prevInFlow;
|
||||
aNextInFlow->GetPrevInFlow(&prevInFlow);
|
||||
NS_PRECONDITION(prevInFlow, "bad prev-in-flow");
|
||||
NS_PRECONDITION(mFrames.ContainsFrame(aNextInFlow), "bad geometric parent");
|
||||
|
||||
// If the next-in-flow has a next-in-flow then delete it, too (and
|
||||
// delete it first).
|
||||
nsIFrame* nextNextInFlow;
|
||||
|
||||
nextInFlow->GetNextInFlow(&nextNextInFlow);
|
||||
if (nsnull != nextNextInFlow) {
|
||||
parent->DeleteChildsNextInFlow(aPresContext, nextInFlow);
|
||||
aNextInFlow->GetNextInFlow(&nextNextInFlow);
|
||||
if (nextNextInFlow) {
|
||||
nsContainerFrame* parent;
|
||||
nextNextInFlow->GetParent((nsIFrame**)&parent);
|
||||
parent->DeleteNextInFlowChild(aPresContext, nextNextInFlow);
|
||||
}
|
||||
|
||||
#ifdef IBMBIDI
|
||||
nsIFrame* nextBidi;
|
||||
aChild->GetBidiProperty(aPresContext, nsLayoutAtoms::nextBidi,
|
||||
(void**) &nextBidi,sizeof(nextBidi));
|
||||
if (nextBidi == nextInFlow) {
|
||||
prevInFlow->GetBidiProperty(aPresContext, nsLayoutAtoms::nextBidi,
|
||||
(void**) &nextBidi,sizeof(nextBidi));
|
||||
if (nextBidi == aNextInFlow) {
|
||||
return;
|
||||
}
|
||||
#endif // IBMBIDI
|
||||
|
||||
// Disconnect the next-in-flow from the flow list
|
||||
nsSplittableFrame::BreakFromPrevFlow(nextInFlow);
|
||||
nsSplittableFrame::BreakFromPrevFlow(aNextInFlow);
|
||||
|
||||
// Take the next-in-flow out of the parent's child list
|
||||
PRBool result = parent->mFrames.RemoveFrame(nextInFlow);
|
||||
PRBool result = mFrames.RemoveFrame(aNextInFlow);
|
||||
if (!result) {
|
||||
// We didn't find the child in the parent's principal child list.
|
||||
// Maybe it's on the overflow list?
|
||||
nsFrameList overflowFrames(parent->GetOverflowFrames(aPresContext, PR_TRUE));
|
||||
nsFrameList overflowFrames(GetOverflowFrames(aPresContext, PR_TRUE));
|
||||
|
||||
if (overflowFrames.IsEmpty() || !overflowFrames.RemoveFrame(nextInFlow)) {
|
||||
if (overflowFrames.IsEmpty() || !overflowFrames.RemoveFrame(aNextInFlow)) {
|
||||
NS_ASSERTION(result, "failed to remove frame");
|
||||
}
|
||||
|
||||
// Set the overflow property again
|
||||
if (overflowFrames.NotEmpty()) {
|
||||
parent->SetOverflowFrames(aPresContext, overflowFrames.FirstChild());
|
||||
SetOverflowFrames(aPresContext, overflowFrames.FirstChild());
|
||||
}
|
||||
}
|
||||
|
||||
// Delete the next-in-flow frame
|
||||
nextInFlow->Destroy(aPresContext);
|
||||
aNextInFlow->Destroy(aPresContext);
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
aChild->GetNextInFlow(&nextInFlow);
|
||||
NS_POSTCONDITION(nsnull == nextInFlow, "non null next-in-flow");
|
||||
nsIFrame* nextInFlow;
|
||||
prevInFlow->GetNextInFlow(&nextInFlow);
|
||||
NS_POSTCONDITION(!nextInFlow, "non null next-in-flow");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -88,8 +88,8 @@ public:
|
||||
#endif
|
||||
|
||||
// nsContainerFrame methods
|
||||
virtual void DeleteChildsNextInFlow(nsIPresContext* aPresContext,
|
||||
nsIFrame* aChild);
|
||||
virtual void DeleteNextInFlowChild(nsIPresContext* aPresContext,
|
||||
nsIFrame* aNextInFlow);
|
||||
|
||||
static PRInt32 LengthOf(nsIFrame* aFrameList) {
|
||||
nsFrameList tmp(aFrameList);
|
||||
@ -143,7 +143,7 @@ public:
|
||||
/**
|
||||
* Invokes the WillReflow() function, positions the frame and its view (if
|
||||
* requested), and then calls Reflow(). If the reflow succeeds and the child
|
||||
* frame is complete, deletes any next-in-flows using DeleteChildsNextInFlow()
|
||||
* frame is complete, deletes any next-in-flows using DeleteNextInFlowChild()
|
||||
*
|
||||
* Flags:
|
||||
* NS_FRAME_NO_MOVE_VIEW - don't position the frame's view. Set this if you
|
||||
|
@ -275,7 +275,7 @@ nsFirstLetterFrame::Reflow(nsIPresContext* aPresContext,
|
||||
kid->GetNextInFlow(&kidNextInFlow);
|
||||
if (nsnull != kidNextInFlow) {
|
||||
// Remove all of the childs next-in-flows
|
||||
DeleteChildsNextInFlow(aPresContext, kid);
|
||||
DeleteNextInFlowChild(aPresContext, kidNextInFlow);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -1288,8 +1288,8 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
|
||||
// the right parent to do the removal (it's possible that the
|
||||
// parent is not this because we are executing pullup code)
|
||||
nsHTMLContainerFrame* parent;
|
||||
aFrame->GetParent((nsIFrame**) &parent);
|
||||
parent->DeleteChildsNextInFlow(mPresContext, aFrame);
|
||||
kidNextInFlow->GetParent((nsIFrame**) &parent);
|
||||
parent->DeleteNextInFlowChild(mPresContext, kidNextInFlow);
|
||||
}
|
||||
}
|
||||
|
||||
|
2
layout/html/tests/block/images/black_1pix.html
Normal file
2
layout/html/tests/block/images/black_1pix.html
Normal file
@ -0,0 +1,2 @@
|
||||
<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1"><TITLE>Not Found</TITLE></HEAD>
|
||||
<H1>Not Found</H1> The requested object does not exist on this server. The link you followed is either outdated, inaccurate, or the server has been instructed not to let you have it.
|
BIN
layout/html/tests/block/images/continue.jpg
Normal file
BIN
layout/html/tests/block/images/continue.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
BIN
layout/html/tests/block/images/fig1s.jpg
Normal file
BIN
layout/html/tests/block/images/fig1s.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
layout/html/tests/block/images/fig2s.jpg
Normal file
BIN
layout/html/tests/block/images/fig2s.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
BIN
layout/html/tests/block/images/fig3s.jpg
Normal file
BIN
layout/html/tests/block/images/fig3s.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
layout/html/tests/block/images/tech-banner1.gif
Normal file
BIN
layout/html/tests/block/images/tech-banner1.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
BIN
layout/html/tests/block/images/tech-banner2.gif
Normal file
BIN
layout/html/tests/block/images/tech-banner2.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
192
layout/html/tests/block/printing/163614.html
Normal file
192
layout/html/tests/block/printing/163614.html
Normal file
@ -0,0 +1,192 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><!-- saved from url=(0058)http://www-i.nist.gov/admin/pba/kelly/divhome_template.htm -->
|
||||
<meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
|
||||
<meta name="generator" content="Adobe GoLive 4">
|
||||
<title>II. The Hall Effect</title></head>
|
||||
|
||||
|
||||
<body bgcolor="white" leftmargin="0" topmargin="0" marginheight="0" marginwidth="0">
|
||||
<table cellspacing="0" cellpadding="0" width="1005" align="center" border="0" hspace="0" vspace="0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width="1005"><img alt="Technical Activities" src="../images/tech-banner1.gif" border="0" usemap="#Navigation"><map name="Navigation"><area href="http://www.eeel.nist.gov/812/tech.html" coords="447,63,603,84" shape="rect" alt="Technical Activities"><area href="http://www.eeel.nist.gov/812/research.html" coords="220,63,446,84" shape="rect" alt="Research Projects / Facilities"><area href="http://www.eeel.nist.gov/812/about-sed.html" coords="97,63,217,84" shape="rect" alt="About SED"><area href="http://www.eeel.nist.gov/812/index.html" coords="3,63,95,84" shape="rect" alt="Home"></map><img alt="National Institute of Standards and Technology" src="../images/tech-banner2.gif" usemap="#NIST" border="0"><map name="NIST"><area href="http://www.eeel.nist.gov/812/search.html" coords="125,63,225,84" shape="rect" alt="Search"><area href="http://www.eeel.nist.gov/812/outputs.html" coords="18,63,123,84" shape="rect" alt="Outputs"><area href="http://www.eeel.nist.gov/812/tech.html" coords="2,63,16,84" shape="rect" alt="Technical Activities"><area href="http://www.nist.gov/" coords="2,4,138,60" shape="rect" alt="NIST home page"></map></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table cellspacing="0" cellpadding="0" align="center" border="0" width="98%">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td valign="top" width="1"><img height="5" src="../images/black_1pix.html" width="1" border="0"></td>
|
||||
<td valign="top" width="1000">
|
||||
<table cellspacing="0" cellpadding="0" width="95%" align="center" border="0">
|
||||
<tbody>
|
||||
<tr valign="top" align="left">
|
||||
<td>
|
||||
<div align="left">
|
||||
<h1>II. The Hall Effect</h1>
|
||||
</div>
|
||||
<dir>
|
||||
<p><a href="#evol">Evolution of Resistance Concepts</a><br>
|
||||
<a href="#lore">The Hall Effect and the Lorentz Force</a><br>
|
||||
<a href="#vand">The van der Pauw Technique</a></p>
|
||||
</dir>
|
||||
<h3><a name="evol"></a>Evolution of Resistance Concepts</h3>
|
||||
<p><b>Electrical characterization</b> of materials evolved in three levels of understanding. In the early 1800s, the resistance <i>R</i> and conductance <i>G</i> were treated as measurable physical quantities obtainable from two-terminal <i>I-V</i> measurements (i.e., current <i>I</i>, voltage <i>V</i>).
|
||||
Later, it became obvious that the resistance alone was not comprehensive
|
||||
enough since different sample shapes gave different resistance values. This
|
||||
led to the understanding (second level) that an intrinsic material property
|
||||
like resistivity (or conductivity) is required that is not influenced by
|
||||
the particular geometry of the sample. For the first time, this allowed scientists
|
||||
to quantify the current-carrying capability of the material and carry out
|
||||
meaningful comparisons between different samples.</p>
|
||||
<p>By the
|
||||
early 1900s, it was realized that resistivity was not a fundamental material
|
||||
parameter, since different materials can have the same resistivity. Also,
|
||||
a given material might exhibit different values of resistivity, depending
|
||||
upon how it was synthesized. This is especially true for semiconductors,
|
||||
where resistivity alone could not explain all observations. Theories of electrical
|
||||
conduction were constructed with varying degrees of success, but until the
|
||||
advent of quantum mechanics, no generally acceptable solution to the problem
|
||||
of electrical transport was developed. This led to the definitions of carrier
|
||||
density <i>n</i> and mobility <i>µ </i> (third level of understanding) which are capable of dealing with even the most complex electrical measurements today.<a href="http://www.eeel.nist.gov/812/fig1.htm"><img src="../images/fig1s.jpg" align="right" hspace="10" vspace="70" border="0" alt="Schematic of the Hall effect in a long, thin bar of semiconductor with four ohmic contacts. The direction of the magnetic field B is along the z-axis and the sample has a finite thickness d"></a></p>
|
||||
<h3><a name="lore"></a>The Hall Effect and the Lorentz Force</h3>
|
||||
<p>The
|
||||
basic physical principle underlying the Hall effect is the Lorentz force.
|
||||
When an electron moves along a direction perpendicular to an applied magnetic
|
||||
field, it experiences a force acting normal to both directions and moves
|
||||
in response to this force and the force effected by the internal electric
|
||||
field. For an <i>n</i>-type, bar-shaped semiconductor shown in <a href="http://www.eeel.nist.gov/812/fig1.htm">Fig.1</a>, the carriers are predominately electrons of bulk density <i>n</i>. We assume that a constant current <i>I</i>
|
||||
flows along the x-axis from left to right in the presence of a z-directed
|
||||
magnetic field. Electrons subject to the Lorentz force initially drift away
|
||||
from the current line toward the negative y-axis, resulting in an excess
|
||||
surface electrical charge on the side of the sample. This charge results
|
||||
in the Hall voltage, a potential drop across the two sides of the sample.
|
||||
(Note that the force on holes is toward the same side because of their opposite
|
||||
velocity and positive charge.) This transverse voltage is the Hall voltage
|
||||
<i>V</i><font size="2"><sub>H</sub></font> and its magnitude is equal to <i>IB/qnd</i>, where <i>I</i> is the current, <i>B</i> is the magnetic field, <i>d</i> is the sample thickness, and <i>q</i> (1.602 x 10<font size="2"><sup>-19</sup></font> C) is the elementary charge. In some cases, it is convenient to use layer or sheet density (<i>n</i><sub>s</sub> = <i>nd</i>) instead of bulk density. One then obtains the equation</p>
|
||||
<p>
|
||||
<table border="0" cellpadding="0" cellspacing="2">
|
||||
<tbody><tr>
|
||||
<td width="40"></td>
|
||||
<td width="480"><i>n</i><sub>s</sub> = <i>IB</i>/<i>q</i>|<i>V</i><font size="2"><sub>H</sub></font>|.</td>
|
||||
<td width="20"></td>
|
||||
<td>(1)</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
</p>
|
||||
<p>Thus, by measuring the Hall voltage <i>V</i><sub>H</sub> and from the known values of <i>I</i>, <i>B</i>, and <i>q</i>, one can determine the sheet density <i>n</i><sub>s</sub>
|
||||
of charge carriers in semiconductors. If the measurement apparatus is set
|
||||
up as described later in Section III, the Hall voltage is negative for <i>n</i>-type semiconductors and positive for <i>p</i>-type semiconductors. The sheet resistance <i>R</i><font size="2"><sub>S</sub></font>
|
||||
of the semiconductor can be conveniently determined by use of the van der
|
||||
Pauw resistivity measurement technique. Since sheet resistance involves both
|
||||
sheet density and mobility, one can determine the Hall mobility from the
|
||||
equation</p>
|
||||
<p>
|
||||
<table border="0" cellpadding="0" cellspacing="2" align="left">
|
||||
<tbody><tr>
|
||||
<td width="40"></td>
|
||||
<td width="480"><font face="Symbol"><i> </i></font><i>µ </i> = |<i>V</i><font size="2"><sub>H</sub></font>|/<i>R</i><font size="2"><sub>S</sub></font><i>IB</i> = 1/(<i>qn</i><font size="2"><sub>S</sub></font><i>R</i><font size="2"><sub>S</sub></font>).</td>
|
||||
<td width="20"></td>
|
||||
<td>(2)</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br>
|
||||
<br>
|
||||
</p>
|
||||
<p>If the conducting layer thickness <i>d</i> is known, one can determine the bulk resistivity (<font face="Symbol"><i>r</i></font> = <i>R</i><font size="2"><sub>S</sub></font><i>d</i>) and the bulk density (<i>n</i> = <i>n</i><font size="2"><sub>S</sub></font>/<i>d</i>). <a href="http://www.eeel.nist.gov/812/fig2.htm"><img src="../images/fig2s.jpg" align="right" hspace="10" vspace="70" border="0" alt="Schematic of a van der Pauw configuration used in the determination of the two characteristic resistances RA and RB"></a></p>
|
||||
<h3><a name="vand"></a>The van der Pauw Technique</h3>
|
||||
<p>In order to determine both the mobility <i>µ</i> and the sheet density <i>n</i><sub>s</sub>, a combination of a <a href="http://www.eeel.nist.gov/812/meas.htm#resi">resistivity measurement</a> and a <a href="http://www.eeel.nist.gov/812/meas.htm#halm">Hall measurement</a>
|
||||
is needed. We discuss here the van der Pauw technique which, due to its convenience,
|
||||
is widely used in the semiconductor industry to determine the resistivity
|
||||
of uniform samples (References 3 and 4). As originally devised by van der
|
||||
Pauw, one uses an arbitrarily shaped (but simply connected, i.e., no holes
|
||||
or nonconducting islands or inclusions), thin-plate sample containing four
|
||||
very small ohmic contacts placed on the periphery (preferably in the corners)
|
||||
of the plate. A schematic of a rectangular van der Pauw configuration is
|
||||
shown in <a href="http://www.eeel.nist.gov/812/fig2.htm">Fig. 2</a>.</p>
|
||||
<p>The objective of the <a href="http://www.eeel.nist.gov/812/meas.htm#resi">resistivity measurement</a> is to determine the sheet resistance <i>R</i><font size="2"><sub>S</sub></font>. Van der Pauw demonstrated that there are actually two characteristic resistances <i>R</i><font size="2"><sub>A</sub></font> and <i>R</i><font size="2"><sub>B</sub>,</font> associated with the corresponding terminals shown in <a href="http://www.eeel.nist.gov/812/fig2.htm">Fig. 2</a>. <i>R</i><font size="2"><sub>A</sub></font> and <i>R</i><font size="2"><sub>B</sub></font> are related to the sheet resistance <i>R</i><font size="2"><sub>S</sub></font> through the van der Pauw equation</p>
|
||||
<p>
|
||||
<table border="0" cellpadding="0" cellspacing="2">
|
||||
<tbody><tr>
|
||||
<td width="40"></td>
|
||||
<td width="480">exp(-<font face="Symbol">p</font><i>R</i><font size="2"><sub>A</sub></font>/<i>R</i><font size="2"><sub>S</sub></font>) + exp(-<font face="Symbol">p</font><i>R</i><font size="2"><sub>B</sub></font>/<i>R</i><font size="2"><sub>S</sub></font>) = 1</td>
|
||||
<td width="20"></td>
|
||||
<td>(3)</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
</p>
|
||||
<p>which can be solved numerically for <i>R</i><font size="2"><sub>S</sub></font>.</p>
|
||||
<p>The bulk electrical resistivity <font face="Symbol"><i>r</i></font> can be calculated using</p>
|
||||
<p>
|
||||
<table border="0" cellpadding="0" cellspacing="2">
|
||||
<tbody><tr>
|
||||
<td width="40"></td>
|
||||
<td width="480"><font face="Symbol"><i>r</i></font> = <i>R</i><font size="2"><sub>S</sub></font><i>d</i>.</td>
|
||||
<td width="20"></td>
|
||||
<td>(4)</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
</p>
|
||||
<p>To obtain the two characteristic resistances, one applies a dc current <i>I</i> into contact 1 and out of contact 2 and measures the voltage <i>V</i><font size="2"><sub>43</sub></font> from contact 4 to contact 3 as shown in <a href="http://www.eeel.nist.gov/812/fig2.htm">Fig. 2</a>. Next, one applies the current <i>I</i> into contact 2 and out of contact 3 while measuring the voltage <i>V</i><font size="2"><sub>14</sub></font> from contact 1 to contact 4. <i>R</i><font size="2"><sub>A</sub></font> and <i>R</i><font size="2"><sub>B</sub></font> are calculated by means of the following expressions:</p>
|
||||
<p>
|
||||
<table border="0" cellpadding="0" cellspacing="2">
|
||||
<tbody><tr>
|
||||
<td width="40"></td>
|
||||
<td width="480"><i>R</i><font size="2"><sub>A</sub></font> = <i>V</i><font size="2"><sub>43</sub></font>/<i>I</i><font size="2"><sub>12</sub></font> and <i>R</i><font size="2"><sub>B</sub></font> = <i>V</i><font size="2"><sub>14</sub></font>/<i>I</i><font size="2"><sub>23</sub></font>.</td>
|
||||
<td width="20"></td>
|
||||
<td>(5)</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
</p>
|
||||
<p><a href="http://www.eeel.nist.gov/812/fig3.htm"><img src="../images/fig3s.jpg" align="right" hspace="10" vspace="70" border="0" alt="Schematic of a van der Pauw configuration used in the determination of the Hall voltage VH"></a>The objective of the <a href="http://www.eeel.nist.gov/812/meas.htm#halm">Hall measurement</a> in the van der Pauw technique is to determine the sheet carrier density <i>n</i><sub>s</sub> by measuring the Hall voltage <i>V</i><font size="2"><sub>H</sub></font>. The Hall voltage measurement consists of a series of voltage measurements with a constant current <i>I</i> and a constant magnetic field <i>B</i> applied perpendicular to the plane of the sample. Conveniently, the same sample, shown again in <a href="http://www.eeel.nist.gov/812/fig3.htm">Fig. 3</a>, can also be used for the Hall measurement. To measure the Hall voltage <i>V</i><font size="2"><sub>H</sub></font>, a current <i>I</i> is forced through the opposing pair of contacts 1 and 3 and the Hall voltage <i>V</i><font size="2"><sub>H</sub></font> (= <i>V</i><font size="2"><sub>24</sub></font>) is measured across the remaining pair of contacts 2 and 4. Once the Hall voltage <i>V</i><font size="2"><sub>H</sub></font> is acquired, the sheet carrier density <i>n</i><sub>s</sub> can be calculated via <i>n</i><sub>s</sub> = <i>IB</i>/<i>q</i>|<i>V</i><font size="2"><sub>H</sub></font>| from the known values of <i>I</i>, <i>B</i>, and <i>q</i>.</p>
|
||||
<p>There
|
||||
are practical aspects which must be considered when carrying out Hall and
|
||||
resistivity measurements. Primary concerns are (1) ohmic contact quality
|
||||
and size, (2) sample uniformity and accurate thickness determination, (3)
|
||||
thermomagnetic effects due to nonuniform temperature, and (4) photoconductive
|
||||
and photovoltaic effects which can be minimized by measuring in a dark environment.
|
||||
Also, the sample lateral dimensions must be large compared to the size of
|
||||
the contacts and the sample thickness. Finally, one must accurately measure
|
||||
sample temperature, magnetic field intensity, electrical current, and voltage.</p>
|
||||
<p><a href="http://www.eeel.nist.gov/812/meas.htm"><img src="../images/continue.jpg" alt="Click for Next Page"></a></p>
|
||||
<center>
|
||||
<p>
|
||||
</p><hr>
|
||||
<p></p>
|
||||
<p><font size="2">|<a href="http://www.eeel.nist.gov/812/hall.html"> Main Page </a>| <a href="http://www.eeel.nist.gov/812/intr.htm">I. Introduction </a>| <a href="http://www.eeel.nist.gov/812/effe.htm">II. The Hall Effect </a>| <a href="#evol">evolution of resistance concepts </a>|<br>
|
||||
| <a href="#lore">the Hall effect and the Lorentz force </a>| <a href="#vand">the van der Pauw technique </a>|<br>
|
||||
| <a href="http://www.eeel.nist.gov/812/meas.htm">III. Resistivity and Hall Measurements </a>| <a href="http://www.eeel.nist.gov/812/meas.htm#geom">sample geometry </a>| <a href="http://www.eeel.nist.gov/812/meas.htm#defi">definitions for resistivity measurements</a> |<br>
|
||||
|<a href="http://www.eeel.nist.gov/812/meas.htm#resi"> resistivity measurements </a>| <a href="http://www.eeel.nist.gov/812/meas.htm#calc">resistivity calculations </a>| <a href="http://www.eeel.nist.gov/812/meas.htm#defh">definitions for Hall measurements </a>|<br>
|
||||
|<a href="http://www.eeel.nist.gov/812/meas.htm#halm"> Hall measurements </a>|<a href="http://www.eeel.nist.gov/812/meas.htm#halc"> Hall calculations </a>| <a href="http://www.eeel.nist.gov/812/work.htm">Sample Hall Worksheet </a>|<a href="http://www.eeel.nist.gov/812/work2.htm"> Worksheet with Typical Data </a>| <a href="http://www.eeel.nist.gov/812/samp.htm">IV. Algorithm </a>|<br>
|
||||
|<a href="http://www.eeel.nist.gov/812/references.htm"> V. References </a>| VI.<a href="http://www.eeel.nist.gov/812/hallcom.htm"> Leave </a>or <a href="http://www.eeel.nist.gov/812/hallview.htm">View </a>Comments | <a href="http://www.eeel.nist.gov/812/fig1.htm">figure 1 </a>| <a href="http://www.eeel.nist.gov/812/fig2.htm">figure 2 </a>| |<a href="http://www.eeel.nist.gov/812/fig3.htm"> figure 3 </a>| <a href="http://www.eeel.nist.gov/812/fig4.htm">figure 4 </a>|<br>
|
||||
</font></p>
|
||||
<p>
|
||||
</p><hr>
|
||||
<p></p>
|
||||
</center>
|
||||
<p><font face="Arial,Helvetica,sans-serif" size="1">NIST is an agency of the <a href="http://www.doc.gov/">U.S. Commerce Department's</a> <a href="http://www.ta.doc.gov/">Technology Administration.</a></font></p>
|
||||
<p><font face="Arial,Helvetica,sans-serif" size="1">Date created: 12/4/2000<br>
|
||||
Last updated: 6/28/2001</font></p></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
<td valign="top" width="1" bgcolor="black"><img height="5" src="../images/black_1pix.html" width="1" border="0"></td>
|
||||
<td valign="top" width="200" bgcolor="#ffcc66">
|
||||
<table cellspacing="0" cellpadding="0" width="95%" border="0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width="200"><b> </b>
|
||||
<p><a href="http://www.eeel.nist.gov/812/conf.htm"><b>Conferences/Workshops</b></a></p>
|
||||
<p><a href="http://www.eeel.nist.gov/812/nano.html"><b>Nanotechnology</b></a></p>
|
||||
<p><a href="http://www.eeel.nist.gov/812/inte.htm"><b>Electronic Interconnects/Packaging</b></a></p>
|
||||
<p><a href="http://www.eeel.nist.gov/812/comp.htm"><b>Compound Semiconductors</b></a></p>
|
||||
<p><a href="http://www.eeel.nist.gov/812/hall.html"><b>Hall Effect Measurements</b></a></p>
|
||||
<p><a href="http://www.eeel.nist.gov/812/itrcs.html"><b>Compound Semiconductor Roadmap</b></a></p></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</body></html>
|
@ -20,3 +20,5 @@ file:///s:/mozilla/layout/html/tests/block/printing/145305-19.html
|
||||
file:///s:/mozilla/layout/html/tests/block/printing/145305-20.html
|
||||
file:///s:/mozilla/layout/html/tests/block/printing/145305-21.html
|
||||
file:///s:/mozilla/layout/html/tests/block/printing/150652.html
|
||||
file:///s:/mozilla/layout/html/tests/block/printing/163614.html
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user