示例#1
0
        // Token: 0x06006B28 RID: 27432 RVA: 0x001EEEE4 File Offset: 0x001ED0E4
        internal void ReconstructLineVariant(TextParaClient paraClient, int iArea, int dcp, IntPtr pbrlineIn, int dcpLineIn, uint fswdir, int urStartLine, int durLine, int urStartTrack, int durTrack, int urPageLeftMargin, bool fAllowHyphenation, bool fClearOnLeft, bool fClearOnRight, bool fTreatAsFirstInPara, bool fTreatAsLastInPara, bool fSuppressTopSpace, out IntPtr lineHandle, out int dcpLine, out IntPtr ppbrlineOut, out int fForcedBroken, out PTS.FSFLRES fsflres, out int dvrAscent, out int dvrDescent, out int urBBox, out int durBBox, out int dcpDepend, out int fReformatNeighborsAsLastLine)
        {
            Invariant.Assert(iArea == 0);
            base.StructuralCache.CurrentFormatContext.OnFormatLine();
            Line line = new Line(base.StructuralCache.TextFormatterHost, paraClient, base.ParagraphStartCharacterPosition);

            this.FormatLineCore(line, pbrlineIn, new Line.FormattingContext(true, fClearOnLeft, fClearOnRight, this._textRunCache)
            {
                LineFormatLengthTarget = dcpLineIn
            }, dcp, durLine, durTrack, fTreatAsFirstInPara, dcp);
            lineHandle = line.Handle;
            dcpLine    = line.SafeLength;
            TextLineBreak textLineBreak = line.GetTextLineBreak();

            if (textLineBreak != null)
            {
                LineBreakRecord lineBreakRecord = new LineBreakRecord(base.PtsContext, textLineBreak);
                ppbrlineOut = lineBreakRecord.Handle;
            }
            else
            {
                ppbrlineOut = IntPtr.Zero;
            }
            fForcedBroken = PTS.FromBoolean(line.IsTruncated);
            fsflres       = line.FormattingResult;
            dvrAscent     = line.Baseline;
            dvrDescent    = line.Height - line.Baseline;
            urBBox        = urStartLine + line.Start;
            durBBox       = line.Width;
            dcpDepend     = line.DependantLength;
            fReformatNeighborsAsLastLine = 0;
            this.CalcLineAscentDescent(dcp, ref dvrAscent, ref dvrDescent);
            int num         = base.ParagraphStartCharacterPosition + dcp + line.ActualLength + dcpDepend;
            int symbolCount = base.StructuralCache.TextContainer.SymbolCount;

            if (num > symbolCount)
            {
                num = symbolCount;
            }
            base.StructuralCache.CurrentFormatContext.DependentMax = base.StructuralCache.TextContainer.CreatePointerAtOffset(num, LogicalDirection.Backward);
        }
示例#2
0
        // Token: 0x06006B3A RID: 27450 RVA: 0x001EF850 File Offset: 0x001EDA50
        internal void FormatLineCore(Line line, IntPtr pbrLineIn, Line.FormattingContext ctx, int dcp, int width, int trackWidth, bool firstLine, int dcpLine)
        {
            TextDpi.EnsureValidLineWidth(ref width);
            this._currentLine = line;
            TextLineBreak textLineBreak = null;

            if (pbrLineIn != IntPtr.Zero)
            {
                LineBreakRecord lineBreakRecord = base.PtsContext.HandleToObject(pbrLineIn) as LineBreakRecord;
                PTS.ValidateHandle(lineBreakRecord);
                textLineBreak = lineBreakRecord.TextLineBreak;
            }
            try
            {
                line.Format(ctx, dcp, width, trackWidth, this.GetLineProperties(firstLine, dcpLine), textLineBreak);
            }
            finally
            {
                this._currentLine = null;
            }
        }
示例#3
0
文件: PtsHost.cs 项目: JianwenSun/cc
        internal unsafe int FormatLineVariants(
            IntPtr pfsclient,                   // IN:  client opaque data
            IntPtr pfsparabreakingsession,      // IN:  current session
            int dcp,                            // IN:  dcp at the beginning line variants
            IntPtr pbrlineIn,                   // IN:  client's line break record
            uint fswdir,                        // IN:  current direction
            int urStartLine,                    // IN:  position at the beginning of the line
            int durLine,                        // IN:  maximum width of line
            int fAllowHyphenation,              // IN:  allow hyphenation of the line?
            int fClearOnLeft,                   // IN:  is clear on left side
            int fClearOnRight,                  // IN:  is clear on right side
            int fTreatAsFirstInPara,            // IN:  treat line as first line in paragraph
            int fTreatAsLastInPara,             // IN:  treat line as last line in paragraph
            int fSuppressTopSpace,              // IN:  suppress empty space at the top of page
            IntPtr lineVariantRestriction,      // IN:  line variant restriction pointer
            int nLineVariantsAlloc,             // IN:  size of the pre-allocated variant array
            PTS.FSLINEVARIANT* rgfslinevariant, // OUT: pre-allocatedarray for line variants
            out int nLineVariantsActual,        // OUT: actual number of variants'
            out int iLineVariantBest)           // OUT: best line variant index
        {
            int fserr = PTS.fserrNone;

            try
            {
                OptimalBreakSession optimalBreakSession = PtsContext.HandleToObject(pfsparabreakingsession) as OptimalBreakSession;
                PTS.ValidateHandle(optimalBreakSession);

                TextLineBreak textLineBreak = null;

                if(pbrlineIn != IntPtr.Zero)
                {
                    LineBreakRecord lineBreakRecord = PtsContext.HandleToObject(pbrlineIn) as LineBreakRecord;
                    PTS.ValidateHandle(lineBreakRecord);

                    textLineBreak = lineBreakRecord.TextLineBreak;
                }

                IList<TextBreakpoint> textBreakpoints;

                textBreakpoints = optimalBreakSession.TextParagraph.FormatLineVariants(optimalBreakSession.TextParaClient,                                                                                                            
                                                                                       optimalBreakSession.TextParagraphCache,
                                                                                       optimalBreakSession.OptimalTextSource,
                                                                                       dcp,
                                                                                       textLineBreak,
                                                                                       fswdir,
                                                                                       urStartLine,
                                                                                       durLine,
                                                                                       PTS.ToBoolean(fAllowHyphenation),
                                                                                       PTS.ToBoolean(fClearOnLeft),
                                                                                       PTS.ToBoolean(fClearOnRight),
                                                                                       PTS.ToBoolean(fTreatAsFirstInPara),
                                                                                       PTS.ToBoolean(fTreatAsLastInPara),
                                                                                       PTS.ToBoolean(fSuppressTopSpace),
                                                                                       lineVariantRestriction,
                                                                                       out iLineVariantBest
                                                                                       );

                for(int breakIndex = 0; breakIndex < Math.Min(textBreakpoints.Count, nLineVariantsAlloc); breakIndex++)
                {
                    TextBreakpoint textBreakpoint = textBreakpoints[breakIndex];

#pragma warning disable 56518




                    LineBreakpoint lineBreakpoint = new LineBreakpoint(optimalBreakSession, textBreakpoint);
#pragma warning restore 56518

                    TextLineBreak textLineBreakOut = textBreakpoint.GetTextLineBreak();

                    if(textLineBreakOut != null)
                    {
#pragma warning disable 56518




                        LineBreakRecord lineBreakRecord = new LineBreakRecord(optimalBreakSession.PtsContext, textLineBreakOut);
#pragma warning disable 56518

                        rgfslinevariant[breakIndex].pfsbreakreclineclient = lineBreakRecord.Handle;
                    }
                    else
                    {
                        rgfslinevariant[breakIndex].pfsbreakreclineclient = IntPtr.Zero;
                    }                      



                    int dvrAscent = TextDpi.ToTextDpi(textBreakpoint.Baseline);
                    int dvrDescent = TextDpi.ToTextDpi(textBreakpoint.Height - textBreakpoint.Baseline);

                    optimalBreakSession.TextParagraph.CalcLineAscentDescent(dcp, ref dvrAscent, ref dvrDescent);

                    rgfslinevariant[breakIndex].pfslineclient = lineBreakpoint.Handle;
                    rgfslinevariant[breakIndex].dcpLine      = textBreakpoint.Length;

                    rgfslinevariant[breakIndex].fForceBroken = PTS.FromBoolean(textBreakpoint.IsTruncated);
                    rgfslinevariant[breakIndex].fslres       = optimalBreakSession.OptimalTextSource.GetFormatResultForBreakpoint(dcp, textBreakpoint);
                    rgfslinevariant[breakIndex].dvrAscent    = dvrAscent;
                    rgfslinevariant[breakIndex].dvrDescent   = dvrDescent;
                    rgfslinevariant[breakIndex].fReformatNeighborsAsLastLine   = PTS.False;
                    rgfslinevariant[breakIndex].ptsLinePenaltyInfo = textBreakpoint.GetTextPenaltyResource().Value;
                }

                nLineVariantsActual = textBreakpoints.Count;
            }
            catch (Exception e)
            {
                nLineVariantsActual = 0;
                iLineVariantBest = 0;
                PtsContext.CallbackException = e;
                fserr = PTS.fserrCallbackException;
            }
            catch
            {
                nLineVariantsActual = 0;
                iLineVariantBest = 0;
                PtsContext.CallbackException = new System.Exception("Caught a non CLS Exception");
                fserr = PTS.fserrCallbackException;
            }
            return fserr;
        }
示例#4
0
        // Token: 0x06006B23 RID: 27427 RVA: 0x001EED14 File Offset: 0x001ECF14
        internal void CreateOptimalBreakSession(TextParaClient textParaClient, int dcpStart, int durTrack, LineBreakRecord lineBreakRecord, out OptimalBreakSession optimalBreakSession, out bool isParagraphJustified)
        {
            this._textRunCache = new TextRunCache();
            TextFormatter     textFormatter     = base.StructuralCache.TextFormatterHost.TextFormatter;
            TextLineBreak     previousLineBreak = (lineBreakRecord != null) ? lineBreakRecord.TextLineBreak : null;
            OptimalTextSource optimalTextSource = new OptimalTextSource(base.StructuralCache.TextFormatterHost, base.ParagraphStartCharacterPosition, durTrack, textParaClient, this._textRunCache);

            base.StructuralCache.TextFormatterHost.Context = optimalTextSource;
            TextParagraphCache textParagraphCache = textFormatter.CreateParagraphCache(base.StructuralCache.TextFormatterHost, dcpStart, TextDpi.FromTextDpi(durTrack), this.GetLineProperties(true, dcpStart), previousLineBreak, this._textRunCache);

            base.StructuralCache.TextFormatterHost.Context = null;
            optimalBreakSession  = new OptimalBreakSession(this, textParaClient, textParagraphCache, optimalTextSource);
            isParagraphJustified = ((TextAlignment)base.Element.GetValue(Block.TextAlignmentProperty) == TextAlignment.Justify);
        }