2001-03-09 04:12:39 +03:00
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
2012-05-21 15:12:37 +04:00
* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2.0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/. */
2001-03-09 04:12:39 +03:00
# ifndef nsBidiPresUtils_h___
# define nsBidiPresUtils_h___
2002-02-19 23:41:32 +03:00
# include "nsBidi.h"
# include "nsBidiUtils.h"
2013-08-20 02:55:18 +04:00
# include "nsHashKeys.h"
# include "nsCoord.h"
2015-12-16 00:56:41 +03:00
# include "nsRenderingContext.h"
2006-06-15 12:16:23 +04:00
2010-06-12 15:37:59 +04:00
# ifdef DrawText
# undef DrawText
# endif
2011-04-13 13:23:49 +04:00
struct BidiParagraphData ;
struct BidiLineData ;
2014-10-24 19:28:14 +04:00
class nsFontMetrics ;
2012-08-06 07:00:56 +04:00
class nsIFrame ;
2013-08-20 02:55:18 +04:00
class nsBlockFrame ;
class nsPresContext ;
class nsRenderingContext ;
class nsBlockInFlowLineIterator ;
2013-11-18 19:24:16 +04:00
class nsStyleContext ;
2015-02-11 12:43:03 +03:00
struct nsSize ;
2013-08-20 02:55:18 +04:00
template < class T > class nsTHashtable ;
2015-04-08 02:22:34 +03:00
namespace mozilla {
class WritingMode ;
class LogicalMargin ;
2015-07-13 18:25:42 +03:00
} // namespace mozilla
2011-04-13 13:23:49 +04:00
2006-06-15 12:16:23 +04:00
/**
* A structure representing some continuation state for each frame on the line ,
* used to determine the first and the last continuation frame for each
* continuation chain on the line .
*/
struct nsFrameContinuationState : public nsVoidPtrHashKey
{
2017-05-03 18:35:25 +03:00
explicit nsFrameContinuationState ( const void * aFrame )
: nsVoidPtrHashKey ( aFrame )
{ }
2006-06-15 12:16:23 +04:00
/**
* The first visual frame in the continuation chain containing this frame , or
2012-07-30 18:20:58 +04:00
* nullptr if this frame is the first visual frame in the chain .
2006-06-15 12:16:23 +04:00
*/
2017-05-03 18:35:25 +03:00
nsIFrame * mFirstVisualFrame { nullptr } ;
2006-06-15 12:16:23 +04:00
/**
* The number of frames in the continuation chain containing this frame , if
* this frame is the first visual frame of the chain , or 0 otherwise .
*/
2017-05-03 18:35:25 +03:00
uint32_t mFrameCount { 0 } ;
2006-06-15 12:16:23 +04:00
/**
* TRUE if this frame is the first visual frame of its continuation chain on
* this line and the chain has some frames on the previous lines .
*/
2017-05-03 18:35:25 +03:00
bool mHasContOnPrevLines { false } ;
2006-06-15 12:16:23 +04:00
/**
* TRUE if this frame is the first visual frame of its continuation chain on
* this line and the chain has some frames left for next lines .
*/
2017-05-03 18:35:25 +03:00
bool mHasContOnNextLines { false } ;
2006-06-15 12:16:23 +04:00
} ;
/*
* Following type is used to pass needed hashtable to reordering methods
*/
typedef nsTHashtable < nsFrameContinuationState > nsContinuationStates ;
2001-03-09 04:12:39 +03:00
2004-10-29 16:28:19 +04:00
/**
* A structure representing a logical position which should be resolved
* into its visual position during BiDi processing .
*/
struct nsBidiPositionResolve
{
// [in] Logical index within string.
2012-08-22 19:56:38 +04:00
int32_t logicalIndex ;
2004-10-29 16:28:19 +04:00
// [out] Visual index within string.
// If the logical position was not found, set to kNotFound.
2012-08-22 19:56:38 +04:00
int32_t visualIndex ;
2004-10-29 16:28:19 +04:00
// [out] Visual position of the character, from the left (on the X axis), in twips.
// Eessentially, this is the X position (relative to the rendering context) where the text was drawn + the font metric of the visual string to the left of the given logical position.
// If the logical position was not found, set to kNotFound.
2012-08-22 19:56:38 +04:00
int32_t visualLeftTwips ;
2009-03-21 11:38:14 +03:00
// [out] Visual width of the character, in twips.
// If the logical position was not found, set to kNotFound.
2012-08-22 19:56:38 +04:00
int32_t visualWidth ;
2004-10-29 16:28:19 +04:00
} ;
2001-03-09 04:12:39 +03:00
class nsBidiPresUtils {
public :
2015-12-16 00:56:41 +03:00
typedef mozilla : : gfx : : DrawTarget DrawTarget ;
2001-03-09 04:12:39 +03:00
nsBidiPresUtils ( ) ;
~ nsBidiPresUtils ( ) ;
2008-07-18 22:29:06 +04:00
/**
* Interface for the processor used by ProcessText . Used by process text to
* collect information about the width of subruns and to notify where each
* subrun should be rendered .
*/
class BidiProcessor {
public :
virtual ~ BidiProcessor ( ) { }
/**
* Sets the current text with the given length and the given direction .
*
* @ remark The reason that the function gives a string instead of an index
* is that ProcessText copies and modifies the string passed to it , so
* passing an index would be impossible .
2014-11-20 13:45:22 +03:00
*
2008-07-18 22:29:06 +04:00
* @ param aText The string of text .
* @ param aLength The length of the string of text .
* @ param aDirection The direction of the text . The string will never have
* mixed direction .
*/
2014-01-04 19:02:17 +04:00
virtual void SetText ( const char16_t * aText ,
2014-11-20 13:45:22 +03:00
int32_t aLength ,
nsBidiDirection aDirection ) = 0 ;
2008-07-18 22:29:06 +04:00
/**
* Returns the measured width of the text given in SetText . If SetText was
* not called with valid parameters , the result of this call is undefined .
* This call is guaranteed to only be called once between SetText calls .
* Will be invoked before DrawText .
*/
virtual nscoord GetWidth ( ) = 0 ;
/**
* Draws the text given in SetText to a rendering context . If SetText was
* not called with valid parameters , the result of this call is undefined .
* This call is guaranteed to only be called once between SetText calls .
*
* @ param aXOffset The offset of the left side of the substring to be drawn
* from the beginning of the overall string passed to ProcessText .
* @ param aWidth The width returned by GetWidth .
*/
virtual void DrawText ( nscoord aXOffset ,
nscoord aWidth ) = 0 ;
} ;
2001-03-09 04:12:39 +03:00
/**
2003-07-24 22:33:50 +04:00
* Make Bidi engine calculate the embedding levels of the frames that are
* descendants of a given block frame .
*
* @ param aBlockFrame The block frame
2001-03-09 04:12:39 +03:00
*
* @ lina 06 / 18 / 2000
*/
2011-04-13 13:23:49 +04:00
static nsresult Resolve ( nsBlockFrame * aBlockFrame ) ;
2017-02-20 19:43:08 +03:00
static nsresult ResolveParagraph ( BidiParagraphData * aBpd ) ;
static void ResolveParagraphWithinBlock ( BidiParagraphData * aBpd ) ;
2001-03-09 04:12:39 +03:00
/**
* Reorder this line using Bidi engine .
* Update frame array , following the new visual sequence .
2015-07-13 02:32:15 +03:00
*
* @ return total inline size
2001-03-09 04:12:39 +03:00
*
* @ lina 05 / 02 / 2000
*/
2015-07-13 02:32:15 +03:00
static nscoord ReorderFrames ( nsIFrame * aFirstFrameOnLine ,
int32_t aNumFramesOnLine ,
mozilla : : WritingMode aLineWM ,
const nsSize & aContainerSize ,
nscoord aStart ) ;
2001-03-09 04:12:39 +03:00
/**
* Format Unicode text , taking into account bidi capabilities
* of the platform . The formatting includes : reordering , Arabic shaping ,
* symmetric and numeric swapping , removing control characters .
*
* @ lina 06 / 18 / 2000
*/
2014-11-20 13:45:22 +03:00
static nsresult FormatUnicodeText ( nsPresContext * aPresContext ,
char16_t * aText ,
2012-08-22 19:56:38 +04:00
int32_t & aTextLength ,
2015-12-16 08:24:06 +03:00
nsCharType aCharType ) ;
2001-03-09 04:12:39 +03:00
2001-11-12 23:51:48 +03:00
/**
* Reorder plain text using the Unicode Bidi algorithm and send it to
* a rendering context for rendering .
*
2004-10-29 16:28:19 +04:00
* @ param [ in ] aText the string to be rendered ( in logical order )
2001-11-12 23:51:48 +03:00
* @ param aLength the number of characters in the string
2013-11-18 19:24:16 +04:00
* @ param aBaseLevel the base embedding level of the string
* odd values are right - to - left ; even values are left - to - right , plus special
* constants as follows ( defined in nsBidi . h )
2001-11-12 23:51:48 +03:00
* NSBIDI_LTR - left - to - right string
* NSBIDI_RTL - right - to - left string
2013-11-18 19:24:16 +04:00
* NSBIDI_DEFAULT_LTR - auto direction determined by first strong character ,
* default is left - to - right
* NSBIDI_DEFAULT_RTL - auto direction determined by first strong character ,
* default is right - to - left
*
2001-11-12 23:51:48 +03:00
* @ param aPresContext the presentation context
2011-01-16 23:23:33 +03:00
* @ param aRenderingContext the rendering context to render to
* @ param aTextRunConstructionContext the rendering context to be used to construct the textrun ( affects font hinting )
2004-10-29 16:28:19 +04:00
* @ param aX the x - coordinate to render the string
* @ param aY the y - coordinate to render the string
2012-07-30 18:20:58 +04:00
* @ param [ in , out ] aPosResolve array of logical positions to resolve into visual positions ; can be nullptr if this functionality is not required
2004-10-29 16:28:19 +04:00
* @ param aPosResolveCount number of items in the aPosResolve array
2001-11-12 23:51:48 +03:00
*/
2014-01-04 19:02:17 +04:00
static nsresult RenderText ( const char16_t * aText ,
2012-08-22 19:56:38 +04:00
int32_t aLength ,
2013-11-18 19:24:16 +04:00
nsBidiLevel aBaseLevel ,
2011-04-13 13:23:49 +04:00
nsPresContext * aPresContext ,
nsRenderingContext & aRenderingContext ,
2015-12-16 00:56:41 +03:00
DrawTarget * aTextRunConstructionDrawTarget ,
2014-10-24 19:28:14 +04:00
nsFontMetrics & aFontMetrics ,
2011-04-13 13:23:49 +04:00
nscoord aX ,
nscoord aY ,
2012-07-30 18:20:58 +04:00
nsBidiPositionResolve * aPosResolve = nullptr ,
2012-08-22 19:56:38 +04:00
int32_t aPosResolveCount = 0 )
2007-01-23 05:58:55 +03:00
{
2013-11-18 19:24:16 +04:00
return ProcessTextForRenderingContext ( aText , aLength , aBaseLevel , aPresContext , aRenderingContext ,
2015-12-16 00:56:41 +03:00
aTextRunConstructionDrawTarget ,
2014-10-24 19:28:14 +04:00
aFontMetrics ,
MODE_DRAW , aX , aY , aPosResolve , aPosResolveCount , nullptr ) ;
2007-01-23 05:58:55 +03:00
}
2014-01-04 19:02:17 +04:00
static nscoord MeasureTextWidth ( const char16_t * aText ,
2012-08-22 19:56:38 +04:00
int32_t aLength ,
2013-11-18 19:24:16 +04:00
nsBidiLevel aBaseLevel ,
2011-04-13 13:23:49 +04:00
nsPresContext * aPresContext ,
2014-10-24 19:28:14 +04:00
nsRenderingContext & aRenderingContext ,
nsFontMetrics & aFontMetrics )
2007-01-23 05:58:55 +03:00
{
nscoord length ;
2013-11-18 19:24:16 +04:00
nsresult rv = ProcessTextForRenderingContext ( aText , aLength , aBaseLevel , aPresContext ,
2015-12-16 00:56:41 +03:00
aRenderingContext ,
aRenderingContext . GetDrawTarget ( ) ,
2014-10-24 19:28:14 +04:00
aFontMetrics ,
2012-07-30 18:20:58 +04:00
MODE_MEASURE , 0 , 0 , nullptr , 0 , & length ) ;
2007-01-23 05:58:55 +03:00
return NS_SUCCEEDED ( rv ) ? length : 0 ;
}
2001-11-12 23:51:48 +03:00
2006-03-12 12:49:48 +03:00
/**
* Check if a line is reordered , i . e . , if the child frames are not
* all laid out left - to - right .
* @ param aFirstFrameOnLine : first frame of the line to be tested
* @ param aNumFramesOnLine : number of frames on this line
* @ param [ out ] aLeftMost : leftmost frame on this line
* @ param [ out ] aRightMost : rightmost frame on this line
*/
2011-09-29 10:19:26 +04:00
static bool CheckLineOrder ( nsIFrame * aFirstFrameOnLine ,
2012-08-22 19:56:38 +04:00
int32_t aNumFramesOnLine ,
2011-04-13 13:23:49 +04:00
nsIFrame * * aLeftmost ,
nsIFrame * * aRightmost ) ;
2006-03-12 12:49:48 +03:00
/**
* Get the frame to the right of the given frame , on the same line .
* @ param aFrame : We ' re looking for the frame to the right of this frame .
* If null , return the leftmost frame on the line .
* @ param aFirstFrameOnLine : first frame of the line to be tested
* @ param aNumFramesOnLine : number of frames on this line
*/
2011-04-13 13:23:49 +04:00
static nsIFrame * GetFrameToRightOf ( const nsIFrame * aFrame ,
nsIFrame * aFirstFrameOnLine ,
2012-08-22 19:56:38 +04:00
int32_t aNumFramesOnLine ) ;
2006-03-12 12:49:48 +03:00
/**
* Get the frame to the left of the given frame , on the same line .
* @ param aFrame : We ' re looking for the frame to the left of this frame .
* If null , return the rightmost frame on the line .
* @ param aFirstFrameOnLine : first frame of the line to be tested
* @ param aNumFramesOnLine : number of frames on this line
*/
2011-04-13 13:23:49 +04:00
static nsIFrame * GetFrameToLeftOf ( const nsIFrame * aFrame ,
nsIFrame * aFirstFrameOnLine ,
2012-08-22 19:56:38 +04:00
int32_t aNumFramesOnLine ) ;
2012-01-11 23:26:02 +04:00
static nsIFrame * GetFirstLeaf ( nsIFrame * aFrame ) ;
2006-03-12 12:49:48 +03:00
2016-06-29 10:47:18 +03:00
/**
* Get the bidi data of the given ( inline ) frame .
*/
static mozilla : : FrameBidiData GetFrameBidiData ( nsIFrame * aFrame ) ;
2006-03-12 12:49:48 +03:00
/**
* Get the bidi embedding level of the given ( inline ) frame .
*/
static nsBidiLevel GetFrameEmbeddingLevel ( nsIFrame * aFrame ) ;
/**
* Get the bidi base level of the given ( inline ) frame .
*/
static nsBidiLevel GetFrameBaseLevel ( nsIFrame * aFrame ) ;
2014-11-20 13:45:23 +03:00
/**
* Get an nsBidiDirection representing the direction implied by the
* bidi base level of the frame .
* @ return NSBIDI_LTR ( left - to - right ) or NSBIDI_RTL ( right - to - left )
* NSBIDI_MIXED will never be returned .
*/
static nsBidiDirection ParagraphDirection ( nsIFrame * aFrame ) {
return DIRECTION_FROM_LEVEL ( GetFrameBaseLevel ( aFrame ) ) ;
}
/**
* Get an nsBidiDirection representing the direction implied by the
* bidi embedding level of the frame .
* @ return NSBIDI_LTR ( left - to - right ) or NSBIDI_RTL ( right - to - left )
* NSBIDI_MIXED will never be returned .
*/
static nsBidiDirection FrameDirection ( nsIFrame * aFrame ) {
return DIRECTION_FROM_LEVEL ( GetFrameEmbeddingLevel ( aFrame ) ) ;
}
static bool IsFrameInParagraphDirection ( nsIFrame * aFrame ) {
return ParagraphDirection ( aFrame ) = = FrameDirection ( aFrame ) ;
}
2007-01-23 05:58:55 +03:00
enum Mode { MODE_DRAW , MODE_MEASURE } ;
2008-07-18 22:29:06 +04:00
/**
* Reorder plain text using the Unicode Bidi algorithm and send it to
* a processor for rendering or measuring
*
* @ param [ in ] aText the string to be processed ( in logical order )
* @ param aLength the number of characters in the string
2013-11-18 19:24:16 +04:00
* @ param aBaseLevel the base embedding level of the string
* odd values are right - to - left ; even values are left - to - right , plus special
* constants as follows ( defined in nsBidi . h )
2008-07-18 22:29:06 +04:00
* NSBIDI_LTR - left - to - right string
* NSBIDI_RTL - right - to - left string
2013-11-18 19:24:16 +04:00
* NSBIDI_DEFAULT_LTR - auto direction determined by first strong character ,
* default is left - to - right
* NSBIDI_DEFAULT_RTL - auto direction determined by first strong character ,
* default is right - to - left
*
2008-07-18 22:29:06 +04:00
* @ param aPresContext the presentation context
* @ param aprocessor the bidi processor
* @ param aMode the operation to process
* MODE_DRAW - invokes DrawText on the processor for each substring
* MODE_MEASURE - does not invoke DrawText on the processor
* Note that the string is always measured , regardless of mode
* @ param [ in , out ] aPosResolve array of logical positions to resolve into
2012-07-30 18:20:58 +04:00
* visual positions ; can be nullptr if this functionality is not required
2008-07-18 22:29:06 +04:00
* @ param aPosResolveCount number of items in the aPosResolve array
* @ param [ out ] aWidth Pointer to where the width will be stored ( may be null )
*/
2014-01-04 19:02:17 +04:00
static nsresult ProcessText ( const char16_t * aText ,
2012-08-22 19:56:38 +04:00
int32_t aLength ,
2013-11-18 19:24:16 +04:00
nsBidiLevel aBaseLevel ,
2011-04-13 13:23:49 +04:00
nsPresContext * aPresContext ,
BidiProcessor & aprocessor ,
Mode aMode ,
nsBidiPositionResolve * aPosResolve ,
2012-08-22 19:56:38 +04:00
int32_t aPosResolveCount ,
2011-04-13 13:23:49 +04:00
nscoord * aWidth ,
nsBidi * aBidiEngine ) ;
2008-07-18 22:29:06 +04:00
2013-11-18 19:24:16 +04:00
/**
* Use style attributes to determine the base paragraph level to pass to the
* bidi algorithm .
*
* If | unicode - bidi | is set to " [-moz-]plaintext " , returns NSBIDI_DEFAULT_LTR ,
* in other words the direction is determined from the first strong character
* in the text according to rules P2 and P3 of the bidi algorithm , or LTR if
* there is no strong character .
*
* Otherwise returns NSBIDI_LTR or NSBIDI_RTL depending on the value of
* | direction |
*/
static nsBidiLevel BidiLevelFromStyle ( nsStyleContext * aStyleContext ) ;
2008-07-18 22:29:06 +04:00
private :
2011-04-13 13:23:49 +04:00
static nsresult
2014-01-04 19:02:17 +04:00
ProcessTextForRenderingContext ( const char16_t * aText ,
2012-08-22 19:56:38 +04:00
int32_t aLength ,
2013-11-18 19:24:16 +04:00
nsBidiLevel aBaseLevel ,
2011-04-13 13:23:49 +04:00
nsPresContext * aPresContext ,
nsRenderingContext & aRenderingContext ,
2015-12-16 00:56:41 +03:00
DrawTarget * aTextRunConstructionDrawTarget ,
2014-10-24 19:28:14 +04:00
nsFontMetrics & aFontMetrics ,
2011-04-13 13:23:49 +04:00
Mode aMode ,
nscoord aX , // DRAW only
nscoord aY , // DRAW only
nsBidiPositionResolve * aPosResolve , /* may be null */
2012-08-22 19:56:38 +04:00
int32_t aPosResolveCount ,
2011-04-13 13:23:49 +04:00
nscoord * aWidth /* may be null */ ) ;
2011-04-27 12:47:18 +04:00
2011-03-26 01:15:29 +03:00
/**
2011-04-11 11:59:30 +04:00
* Traverse the child frames of the block element and :
* Set up an array of the frames in logical order
* Create a string containing the text content of all the frames
* If we encounter content that requires us to split the element into more
* than one paragraph for bidi resolution , resolve the paragraph up to that
* point .
2001-03-09 04:12:39 +03:00
*/
2017-02-20 19:43:08 +03:00
static void TraverseFrames ( nsBlockInFlowLineIterator * aLineIter ,
2011-04-13 13:23:49 +04:00
nsIFrame * aCurrentFrame ,
2011-11-07 18:26:50 +04:00
BidiParagraphData * aBpd ) ;
2014-03-12 00:23:50 +04:00
2017-04-27 01:25:48 +03:00
/**
* Perform a recursive " pre-traversal " of the child frames of a block or
* inline container frame , to determine whether full bidi resolution is
* actually needed .
* This explores the same frames as TraverseFrames ( above ) , but is less
* expensive and may allow us to avoid performing the full TraverseFrames
* operation .
* @ param aFirstChild frame to start traversal from
* @ param [ in / out ] aCurrContent the content node that we ' ve most recently
* scanned for RTL characters ( so that when descendant frames refer
* to the same content , we can avoid repeatedly scanning it ) .
* @ return true if it finds that bidi is ( or may be ) required ,
* false if no potentially - bidi content is present .
*/
static bool ChildListMayRequireBidi ( nsIFrame * aFirstChild ,
nsIContent * * aCurrContent ) ;
2015-07-13 02:32:15 +03:00
/**
* Position ruby content frames ( ruby base / text frame ) .
* Called from RepositionRubyFrame .
*/
static void RepositionRubyContentFrame (
nsIFrame * aFrame , mozilla : : WritingMode aFrameWM ,
const mozilla : : LogicalMargin & aBorderPadding ) ;
2015-04-08 02:22:34 +03:00
/*
* Position ruby frames . Called from RepositionFrame .
*/
static nscoord RepositionRubyFrame (
nsIFrame * aFrame ,
const nsContinuationStates * aContinuationStates ,
const mozilla : : WritingMode aContainerWM ,
const mozilla : : LogicalMargin & aBorderPadding ) ;
2006-06-15 12:16:23 +04:00
/*
2014-03-12 00:23:50 +04:00
* Position aFrame and its descendants to their visual places . Also if aFrame
* is not leaf , resize it to embrace its children .
2006-06-15 12:16:23 +04:00
*
2014-03-12 00:23:50 +04:00
* @ param aFrame The frame which itself and its children are
* going to be repositioned
* @ param aIsEvenLevel TRUE means the embedding level of this frame
* is even ( LTR )
2015-04-08 02:22:34 +03:00
* @ param aStartOrEnd The distance to the start or the end of aFrame
* without considering its inline margin . If the
* container is reordering frames in reverse
* direction , it ' s the distance to the end ,
* otherwise , it ' s the distance to the start .
2006-06-15 12:16:23 +04:00
* @ param aContinuationStates A map from nsIFrame * to nsFrameContinuationState
2015-04-08 02:22:34 +03:00
* @ return The isize aFrame takes , including margins .
2006-06-15 12:16:23 +04:00
*/
2015-04-08 02:22:34 +03:00
static nscoord RepositionFrame ( nsIFrame * aFrame ,
bool aIsEvenLevel ,
nscoord aStartOrEnd ,
const nsContinuationStates * aContinuationStates ,
mozilla : : WritingMode aContainerWM ,
bool aContainerReverseOrder ,
2015-04-08 02:22:34 +03:00
const nsSize & aContainerSize ) ;
2006-06-15 12:16:23 +04:00
/*
* Initialize the continuation state ( nsFrameContinuationState ) to
2012-07-30 18:20:58 +04:00
* ( nullptr , 0 ) for aFrame and its descendants .
2006-06-15 12:16:23 +04:00
*
* @ param aFrame The frame which itself and its descendants will
* be initialized
* @ param aContinuationStates A map from nsIFrame * to nsFrameContinuationState
*/
2011-04-13 13:23:49 +04:00
static void InitContinuationStates ( nsIFrame * aFrame ,
nsContinuationStates * aContinuationStates ) ;
2006-06-15 12:16:23 +04:00
/*
2014-09-30 21:59:13 +04:00
* Determine if aFrame is first or last , and set aIsFirst and
* aIsLast values . Also set continuation states of
* aContinuationStates .
2006-06-15 12:16:23 +04:00
*
2014-09-30 21:59:13 +04:00
* A frame is first if it ' s the first appearance of its continuation
* chain on the line and the chain is on its first line .
* A frame is last if it ' s the last appearance of its continuation
* chain on the line and the chain is on its last line .
2006-06-15 12:16:23 +04:00
*
2014-09-30 21:59:13 +04:00
* N . B : " First appearance " and " Last appearance " in the previous
* paragraph refer to the frame ' s inline direction , not necessarily
* the line ' s .
*
* @ param aContinuationStates A map from nsIFrame * to
* nsFrameContinuationState
* @ param [ in ] aSpanDirMatchesLineDir TRUE means that the inline
* direction of aFrame is the same
* as its container
* @ param [ out ] aIsFirst TRUE means aFrame is first frame
* or continuation
* @ param [ out ] aIsLast TRUE means aFrame is last frame
* or continuation
2006-06-15 12:16:23 +04:00
*/
2015-04-08 02:22:34 +03:00
static void IsFirstOrLast ( nsIFrame * aFrame ,
const nsContinuationStates * aContinuationStates ,
bool aSpanInLineOrder /* in */ ,
bool & aIsFirst /* out */ ,
bool & aIsLast /* out */ ) ;
2006-06-15 12:16:23 +04:00
2001-03-09 04:12:39 +03:00
/**
* Adjust frame positions following their visual order
*
2007-08-29 13:19:16 +04:00
* @ param aFirstChild the first kid
2015-07-13 02:32:15 +03:00
* @ return total inline size
2001-03-09 04:12:39 +03:00
*
* @ lina 04 / 11 / 2000
*/
2015-07-13 02:32:15 +03:00
static nscoord RepositionInlineFrames ( BidiLineData * aBld ,
mozilla : : WritingMode aLineWM ,
const nsSize & aContainerSize ,
nscoord aStart ) ;
2001-03-09 04:12:39 +03:00
2003-07-24 22:33:50 +04:00
/**
* Helper method for Resolve ( )
2008-01-30 07:13:06 +03:00
* Truncate a text frame to the end of a single - directional run and possibly
* create a continuation frame for the remainder of its content .
2003-07-24 22:33:50 +04:00
*
* @ param aFrame the original frame
* @ param aNewFrame [ OUT ] the new frame that was created
2008-01-30 07:13:06 +03:00
* @ param aStart [ IN ] the start of the content mapped by aFrame ( and
* any fluid continuations )
* @ param aEnd [ IN ] the offset of the end of the single - directional
* text run .
2003-07-24 22:33:50 +04:00
* @ see Resolve ( )
* @ see RemoveBidiContinuation ( )
*/
2011-04-13 13:23:49 +04:00
static inline
nsresult EnsureBidiContinuation ( nsIFrame * aFrame ,
nsIFrame * * aNewFrame ,
2012-08-22 19:56:38 +04:00
int32_t aStart ,
int32_t aEnd ) ;
2003-07-24 22:33:50 +04:00
/**
* Helper method for Resolve ( )
2006-03-08 12:02:42 +03:00
* Convert one or more bidi continuation frames created in a previous reflow by
* EnsureBidiContinuation ( ) into fluid continuations .
2003-07-24 22:33:50 +04:00
* @ param aFrame the frame whose continuations are to be removed
* @ param aFirstIndex index of aFrame in mLogicalFrames
* @ param aLastIndex index of the last frame to be removed
*
* @ see Resolve ( )
* @ see EnsureBidiContinuation ( )
*/
2011-04-13 13:23:49 +04:00
static void RemoveBidiContinuation ( BidiParagraphData * aBpd ,
nsIFrame * aFrame ,
2012-08-22 19:56:38 +04:00
int32_t aFirstIndex ,
2016-06-29 10:48:00 +03:00
int32_t aLastIndex ) ;
2011-04-13 13:23:49 +04:00
static void CalculateCharType ( nsBidi * aBidiEngine ,
2014-01-04 19:02:17 +04:00
const char16_t * aText ,
2012-08-22 19:56:38 +04:00
int32_t & aOffset ,
int32_t aCharTypeLimit ,
int32_t & aRunLimit ,
int32_t & aRunLength ,
int32_t & aRunCount ,
uint8_t & aCharType ,
uint8_t & aPrevCharType ) ;
2001-03-09 04:12:39 +03:00
2014-01-04 19:02:17 +04:00
static void StripBidiControlCharacters ( char16_t * aText ,
2012-08-22 19:56:38 +04:00
int32_t & aTextLength ) ;
2001-03-09 04:12:39 +03:00
} ;
2013-08-20 02:55:18 +04:00
# endif /* nsBidiPresUtils_h___ */