Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Core / CSharp / MS / Internal / TextFormatting / LineServices.cs / 1 / LineServices.cs
//------------------------------------------------------------------------ // // Microsoft Windows Client Platform // Copyright (c) Microsoft Corporation. All rights reserved. // // File: NativeMethods.cs // // Content: Line Services managed wrapper // // Created: 9-4-2001 Worachai Chaoweeraprasit (wchao) // //----------------------------------------------------------------------- using System; using System.Windows; using System.Windows.Media; using System.Windows.Media.TextFormatting; using System.Security; using System.Runtime.InteropServices; using MS.Internal.Shaping; namespace MS.Internal.TextFormatting { // // Line Services application callback delegates // // Note: The declared type of some parameters differs from the logical type. // // Some parameters are declared int instead of bool because on the unmanaged side they have type BOOL, // which is a typedef for int. By convention, we use 'f' prefix to indicate that an int represents a // boolean flag. // // One parameter is declared "ref ushort" instead of "ref char" because on the unmanaged side WCHAR // is a typedef for unsigned short. This appears to be necessary for correct behavior even though // sizeof(char) == sizeof(ushort) because char by default is marshalled as an ANSI char. // // We could use the more descriptive types and specify [MarshalAs(UnamangedType.Bool)] and // [MarshalAs(UnmanagedType.U2)], respectively, but the slight gain in readibility comes at an // unacceptable cost in run-time overhead due to use of the slow marshaller. // internal delegate LsErr FetchPap( IntPtr pols, int lscpFetch, ref LsPap lspap ); internal delegate LsErr FetchLineProps( IntPtr pols, int lscpFetch, int firstLineInPara, ref LsLineProps lsLineProps ); internal unsafe delegate LsErr FetchRunRedefined( IntPtr pols, int lscpFetch, int fIsStyle, // logically boolean (see above) IntPtr pstyle, char* pwchTextBuffer, int cchTextBuffer, ref int fIsBufferUsed, // logically boolean (see above) out char* pwchText, ref int cchText, ref int fIsHidden, // logically boolean (see above) ref LsChp lschp, ref IntPtr lsplsrun ); internal delegate LsErr GetRunTextMetrics ( IntPtr pols, Plsrun plsrun, LsDevice lsDevice, LsTFlow lstFlow, ref LsTxM lstTextMetrics ); internal unsafe delegate LsErr GetRunCharWidths( IntPtr pols, Plsrun plsrun, LsDevice device, char *runText, int cchRun, int maxWidth, LsTFlow textFlow, int *charWidths, ref int totalWidth, ref int cchProcessed ); internal delegate LsErr GetDurMaxExpandRagged( IntPtr pols, Plsrun plsrun, LsTFlow lstFlow, ref int maxExpandRagged ); internal unsafe delegate LsErr DrawTextRun( IntPtr pols, Plsrun plsrun, ref LSPOINT ptText, char *runText, int *charWidths, int cchText, LsTFlow textFlow, uint displayMode, ref LSPOINT ptRun, ref LsHeights lsHeights, int dupRun, ref LSRECT clipRect ); internal delegate LsErr FInterruptShaping( IntPtr pols, LsTFlow textFlow, Plsrun firstPlsrun, Plsrun secondPlsrun, ref int fIsInterruptOk // logically boolean (see above) ); internal delegate LsErr GetRunUnderlineInfo( IntPtr pols, Plsrun plsrun, ref LsHeights lsHeights, LsTFlow textFlow, ref LsULInfo ulInfo ); internal delegate LsErr GetRunStrikethroughInfo( IntPtr pols, Plsrun plsrun, ref LsHeights lsHeights, LsTFlow textFlow, ref LsStInfo stInfo ); internal delegate LsErr Hyphenate( IntPtr pols, int fLastHyphenationFound, // logically boolean (see above) int lscpLastHyphenation, ref LsHyph lastHyphenation, int lscpBeginWord, int lscpExceed, ref int fHyphenFound, // logically boolean (see above) ref int lscpHyphen, ref LsHyph plsHyph ); internal delegate LsErr GetNextHyphenOpp( IntPtr pols, int lscpStartSearch, int lsdcpSearch, ref int fHyphenFound, // logically boolean (see above) ref int lscpHyphen, ref LsHyph lsHyph ); internal delegate LsErr GetPrevHyphenOpp( IntPtr pols, int lscpStartSearch, int lsdcpSearch, ref int fHyphenFound, // logically boolean (see above) ref int lscpHyphen, ref LsHyph lsHyph ); internal delegate LsErr GetAutoNumberInfo( IntPtr pols, ref LsKAlign alignment, ref LsChp lschp, ref IntPtr lsplsrun, ref ushort addedChar, // logically char (see above) ref LsChp lschpAddedChar, ref IntPtr lsplsrunAddedChar, ref int fWord95Model, // logically boolean (see above) ref int offset, ref int width ); internal delegate LsErr DrawUnderline( IntPtr pols, Plsrun plsrun, uint ulType, ref LSPOINT ptOrigin, int ulLength, int ulThickness, LsTFlow textFlow, uint displayMode, ref LSRECT clipRect ); internal delegate LsErr DrawStrikethrough( IntPtr pols, Plsrun plsrun, uint stType, ref LSPOINT ptOrigin, int stLength, int stThickness, LsTFlow textFlow, uint displayMode, ref LSRECT clipRect ); internal unsafe delegate LsErr GetGlyphsRedefined( IntPtr pols, IntPtr* plsplsruns, int* pcchPlsrun, int plsrunCount, char* pwchText, int cchText, LsTFlow textFlow, ushort* puGlyphsBuffer, int* piGlyphPropsBuffer, int cgiGlyphBuffers, ref int fIsGlyphBuffersUsed, // logically boolean (see above) ushort* puClusterMap, CharacterShapingProperties* puCharProperties, int* pfCanGlyphAlone, ref int glyphCount ); internal unsafe delegate LsErr GetGlyphPositions( IntPtr pols, IntPtr *plsplsruns, int *pcchPlsrun, int plsrunCount, LsDevice device, char *pwchText, ushort *puClusterMap, CharacterShapingProperties *puCharProperties, int cchText, ushort *puGlyphs, GlyphShapingProperties *piGlyphProperties, int glyphCount, LsTFlow textFlow, int *piGlyphAdvances, GlyphOffset *piiGlyphOffsets ); internal unsafe delegate LsErr DrawGlyphs( IntPtr pols, Plsrun plsrun, char *pwchText, ushort *puClusterMap, CharacterShapingProperties *puCharProperties, int cchText, ushort *puGlyphs, int *piJustifiedGlyphAdvances, int *puGlyphAdvances, GlyphOffset *piiGlyphOffsets, GlyphShapingProperties *piGlyphProperties, LsExpType *plsExpType, int glyphCount, LsTFlow textFlow, uint displayMode, ref LSPOINT origin, ref LsHeights lsHeights, int runWidth, ref LSRECT clippingRect ); internal unsafe delegate LsErr EnumText( IntPtr pols, Plsrun plsrun, int cpFirst, int dcp, char *pwchText, int cchText, LsTFlow lstFlow, int fReverseOrder, // logically boolean (see above) int fGeometryProvided, // logically boolean (see above) ref LSPOINT pptStart, ref LsHeights pheights, int dupRun, int glyphBaseRun, int *charWidths, ushort *pClusterMap, CharacterShapingProperties *characterProperties, ushort *puglyphs, int *pGlyphAdvances, GlyphOffset *pGlyphOffsets, GlyphShapingProperties *pGlyphProperties, int glyphCount ); internal unsafe delegate LsErr EnumTab( IntPtr pols, Plsrun plsrun, int cpFirst, char *pwchText, char tabLeader, LsTFlow lstFlow, int fReverseOrder, // logically boolean (see above) int fGeometryProvided, // logically boolean (see above) ref LSPOINT pptStart, ref LsHeights heights, int dupRun ); internal unsafe delegate LsErr GetCharCompressionInfoFullMixed( IntPtr pols, LsDevice device, LsTFlow textFlow, LsCharRunInfo *plscharrunInfo, LsNeighborInfo *plsneighborInfoLeft, LsNeighborInfo *plsneighborInfoRight, int maxPriorityLevel, int **pplscompressionLeft, int **pplscompressionRight ); internal unsafe delegate LsErr GetCharExpansionInfoFullMixed( IntPtr pols, LsDevice device, LsTFlow textFlow, LsCharRunInfo *plscharrunInfo, LsNeighborInfo *plsneighborInfoLeft, LsNeighborInfo *plsneighborInfoRight, int maxPriorityLevel, int **pplsexpansionLeft, int **pplsexpansionRight ); internal unsafe delegate LsErr GetGlyphCompressionInfoFullMixed( IntPtr pols, LsDevice device, LsTFlow textFlow, LsGlyphRunInfo *plsglyphrunInfo, LsNeighborInfo *plsneighborInfoLeft, LsNeighborInfo *plsneighborInfoRight, int maxPriorityLevel, int **pplscompressionLeft, int **pplscompressionRight ); internal unsafe delegate LsErr GetGlyphExpansionInfoFullMixed( IntPtr pols, LsDevice device, LsTFlow textFlow, LsGlyphRunInfo *plsglyphrunInfo, LsNeighborInfo *plsneighborInfoLeft, LsNeighborInfo *plsneighborInfoRight, int maxPriorityLevel, int **pplsexpansionLeft, int **pplsexpansionRight, LsExpType *plsexptype, int *pduMinInk ); // // Line Services object handler callback delegates // // internal unsafe delegate LsErr GetObjectHandlerInfo( IntPtr pols, // Line Layout context uint objectId, // installed object id void* objectInfo // object handler info ); internal delegate LsErr InlineFormat( IntPtr pols, // Line Layout context Plsrun plsrun, // plsrun int lscpInline, // first cp of the run int currentPosition, // inline's current pen location in text direction int rightMargin, // right margin ref ObjDim pobjDim, // object dimension out int fFirstRealOnLine, // is this run the first in line; logically boolean (see above) out int fPenPositionUsed, // is pen position used to format object; logically boolean (see above) out LsBrkCond breakBefore, // break condition before this object out LsBrkCond breakAfter // break condition after this object ); internal delegate LsErr InlineDraw( IntPtr pols, // Line Layout context Plsrun plsrun, // plsrun ref LSPOINT runOrigin, // pen position at which to render the object LsTFlow textFlow, // text flow direction int runWidth // object width ); // // Line Services enumerations // // // handle to text run opaque to Line Services internal enum Plsrun : uint { CloseAnchor = 0, Reverse = 1, FakeLineBreak = 2, // simulated line break for security mitigation FormatAnchor = 3, Hidden = 4, Text = 5, // run with type starting at this point is stored InlineObject = 6, LineBreak = 7, ParaBreak = 8, Undefined = 0x80000000, // Bit 31 cannot be set without causing an overflow exception in LineServices so we reserve it as a 'undefined' Plsrun value IsMarker = 0x40000000, // Bit indicates this run is part of marker symbol UseNewCharacterBuffer = 0x20000000, // Bit indicates this run uses dynamically allocated heap buffer for run characters IsSymbol = 0x10000000, // Bit indicates run uses a non-Unicode font; don't change this value without updating unmanaged GetBreakingClasses callback UnmaskAll = 0x0FFFFFFF, // Value to unmask all the masking bits } // Unmanaged enum counterpart is in LSLO.H. // == Both sides must be binary compatible == [Flags] internal enum LineFlags { // line break flags None = 0, BreakClassWide = 0x00000001, BreakClassStrict = 0x00000002, BreakAlways = 0x00000004, MinMax = 0x00000008, KeepState = 0x00000010, } internal enum LsEndRes { endrNormal, endrHyphenated, endrEndPara, endrAltPara, endrSoftCR, endrEndColumn, endrEndSection, endrEndPage, endrEndParaSection, endrStopped, endrBeforeFillLineObject, endrAfterFillLineObject, endrMathUserRequiredBreak } internal enum LsBreakJust { lsbrjBreakJustify, // regular US lsbrjBreakWithCompJustify, // FE & Newspaper lsbrjBreakThenExpand, // Arabic lsbrjBreakOptimal, // Best fit/Optimal paragraph lsbrjBreakThenSqueeze // WordPerfect } internal enum LsKJust { lskjFullInterWord, lskjFullInterLetterAligned, lskjFullScaled, lskjFullGlyphs, lskjFullMixed, lskjSnapGrid } internal enum LsKAlign { lskalLeft, lskalCentered, lskalRight, } internal enum LsKEOP { lskeopEndPara1, lskeopEndPara2, lskeopEndPara12, lskeopEndParaAlt } internal enum LsKTab { lsktLeft, lsktCenter, lsktRight, lsktDecimal, lsktChar } internal enum LsTFlow { lstflowDefault = 0, lstflowES = 0, lstflowEN, lstflowSE, lstflowSW, lstflowWS, lstflowWN, lstflowNE, lstflowNW, } internal enum LsBrkCond { Never, Can, Please, Must } internal enum LsDevice { Presentation, Reference, } internal enum LsExpType : byte { None = 0, AddWhiteSpace, AddInkContinuous, AddInkDiscrete, } internal enum LsKysr { ////// Normal Hyphenation /// kysrNormal, ////// Add letter before hyphen /// kysrAddBefore, ////// Change letter before hyphen /// kysrChangeBefore, ////// Delete letter before hyphen /// kysrDeleteBefore, ////// Change letter after hyphen /// kysrChangeAfter, ////// Delete letter before the hypen and change the preceding one /// kysrDelAndChange, ////// Add letter before the hyphen and change letter after it /// kysrAddBeforeChangeAfter, } internal enum LsHyphenQuality { lshqExcellent, lshqGood, lshqFair, lshqPoor, lshqBad } internal enum LsErr { None = 0, InvalidParameter = -1, OutOfMemory = -2, NullOutputParameter = -3, InvalidContext = -4, InvalidLine = -5, InvalidDnode = -6, InvalidDeviceResolution = -7, InvalidRun = -8, MismatchLineContext = -9, ContextInUse = -10, DuplicateSpecialCharacter = -11, InvalidAutonumRun = -12, FormattingFunctionDisabled = -13, UnfinishedDnode = -14, InvalidDnodeType = -15, InvalidPenDnode = -16, InvalidNonPenDnode = -17, InvalidBaselinePenDnode = -18, InvalidFormatterResult = -19, InvalidObjectIdFetched = -20, InvalidDcpFetched = -21, InvalidCpContentFetched = -22, InvalidBookmarkType = -23, SetDocDisabled = -24, FiniFunctionDisabled = -25, CurrentDnodeIsNotTab = -26, PendingTabIsNotResolved = -27, WrongFiniFunction = -28, InvalidBreakingClass = -29, BreakingTableNotSet = -30, InvalidModWidthClass = -31, ModWidthPairsNotSet = -32, WrongTruncationPoint = -33, WrongBreak = -34, DupInvalid = -35, RubyInvalidVersion = -36, TatenakayokoInvalidVersion = -37, WarichuInvalidVersion = -38, WarichuInvalidData = -39, CreateSublineDisabled = -40, CurrentSublineDoesNotExist = -41, CpOutsideSubline = -42, HihInvalidVersion = -43, InsufficientQueryDepth = -44, InvalidBreakRecord = -45, InvalidPap = -46, ContradictoryQueryInput = -47, LineIsNotActive = -48, TooLongParagraph = -49, TooManyCharsToGlyph = -50, WrongHyphenationPosition = -51, TooManyPriorities = -52, WrongGivenCp = -53, WrongCpFirstForGetBreaks = -54, WrongJustTypeForGetBreaks = -55, WrongJustTypeForCreateLineGivenCp = -56, TooLongGlyphContext = -57, InvalidCharToGlyphMapping = -58, InvalidMathUsage = -59, InconsistentChp = -60, StoppedInSubline = -61, PenPositionCouldNotBeUsed = -62, DebugFlagsInShip = -63, InvalidOrderTabs = -64, OutputArrayTooSmall = -110, SystemRestrictionsExceeded = -100, LsInternalError = -1000, NotImplemented = -10000, ClientAbort = -100000, } // // Line Services structures // // [StructLayout(LayoutKind.Sequential)] internal struct LSPOINT { public LSPOINT(int horizontalPosition, int verticalPosition) { x = horizontalPosition; y = verticalPosition; } public int x; public int y; } [StructLayout(LayoutKind.Sequential)] internal struct LSRECT { public int left; public int top; public int right; public int bottom; internal LSRECT(int x1, int y1, int x2, int y2) { left = x1; top = y1; right = x2; bottom = y2; } } [StructLayout(LayoutKind.Sequential)] internal struct LSSIZE { public int width; public int height; } [StructLayout(LayoutKind.Sequential)] internal struct EscStringInfo { public IntPtr szParaSeparator; public IntPtr szLineSeparator; public IntPtr szHidden; public IntPtr szNbsp; public IntPtr szObjectTerminator; public IntPtr szObjectReplacement; } [StructLayout(LayoutKind.Sequential)] internal struct ObjDim { public LsHeights heightsRef; public LsHeights heightsPres; public int dur; } [StructLayout(LayoutKind.Sequential)] internal struct LsTbd { public LsKTab lskt; public int ur; [MarshalAs(UnmanagedType.U2)] public char wchTabLeader; [MarshalAs(UnmanagedType.U2)] public char wchCharTab; } [StructLayout(LayoutKind.Sequential)] internal struct LsTabs { public int durIncrementalTab; public int iTabUserDefMac; public IntPtr plsTbd; } [StructLayout(LayoutKind.Sequential)] internal struct LsULInfo { public uint kulBase; public int cNumberOfLines; public int dvpUnderlineOriginOffset; public int dvpFirstUnderlineOffset; public int dvpFirstUnderlineSize; public int dvpGapBetweenLines; public int dvpSecondUnderlineSize; } [StructLayout(LayoutKind.Sequential)] internal struct LsStInfo { public uint kstBase; public int cNumberOfLines; public int dvpLowerStrikethroughOffset; public int dvpLowerStrikethroughSize; public int dvpUpperStrikethroughOffset; public int dvpUpperStrikethroughSize; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct LsHyph { public LsKysr kysr; public char wchYsr; public char wchYsr2; public LsHyphenQuality lshq; } // Installed object handler methods ////// Critical - as this structure points to several callbacks that'll be /// invoked from unmanaged code. Marked all members Critical. /// Just putting the SecurityNote on the top instead of on every /// member. /// [StructLayout(LayoutKind.Sequential)] internal struct LsIMethods { [SecurityCritical] public IntPtr pfnCreateILSObj; [SecurityCritical] public IntPtr pfnDestroyILSObj; [SecurityCritical] public IntPtr pfnSetDoc; [SecurityCritical] public IntPtr pfnCreateLNObj; [SecurityCritical] public IntPtr pfnDestroyLNObj; [SecurityCritical] public IntPtr pfnFmt; [SecurityCritical] public IntPtr pfnFmtResume; [SecurityCritical] public IntPtr pfnGetModWidthPrecedingChar; [SecurityCritical] public IntPtr pfnGetModWidthFollowingChar; [SecurityCritical] public IntPtr pfnTruncate; [SecurityCritical] public IntPtr pfnFindPrevBreakOppInside; [SecurityCritical] public IntPtr pfnFindNextBreakOppInside; [SecurityCritical] public IntPtr pfnFindBreakOppBeforeCpTruncate; [SecurityCritical] public IntPtr pfnFindBreakOppAfterCpTruncate; [SecurityCritical] public IntPtr pfnCreateStartOppInside; [SecurityCritical] public IntPtr pfnProposeBreakAfter; [SecurityCritical] public IntPtr pfnProposeBreakBefore; [SecurityCritical] public IntPtr pfnCreateBreakOppAfter; [SecurityCritical] public IntPtr pfnCreateStartOppBefore; [SecurityCritical] public IntPtr pfnCreateDobjFragment; [SecurityCritical] public IntPtr pfnForceBreak; [SecurityCritical] public IntPtr pfnCreateBreakRecord; [SecurityCritical] public IntPtr pfnSetBreak; [SecurityCritical] public IntPtr pfnDestroyStartOpp; [SecurityCritical] public IntPtr pfnDestroyBreakOpp; [SecurityCritical] public IntPtr pfnDuplicateBreakRecord; [SecurityCritical] public IntPtr pfnDestroyBreakRecord; [SecurityCritical] public IntPtr pfnGetSpecialEffectsFromDobj; [SecurityCritical] public IntPtr pfnGetSpecialEffectsFromDobjFragment; [SecurityCritical] public IntPtr pfnGetSubmissionInfoFromDobj; [SecurityCritical] public IntPtr pfnGetSublinesFromDobj; [SecurityCritical] public IntPtr pfnGetSubmissionInfoFromDobjFragment; [SecurityCritical] public IntPtr pfnGetSubsFromDobjFragment; [SecurityCritical] public IntPtr pfnFExpandWithPrecedingChar; [SecurityCritical] public IntPtr pfnFExpandWithFollowingChar; [SecurityCritical] public IntPtr pfnCalcPresentation; [SecurityCritical] public IntPtr pfnQueryPointPcp; [SecurityCritical] public IntPtr pfnQueryCpPpoint; [SecurityCritical] public IntPtr pfnEnum; [SecurityCritical] public IntPtr pfnDisplay; [SecurityCritical] public IntPtr pfnDestroyDobj; [SecurityCritical] public IntPtr pfnDestroyDobjFragment; } ////// Small set of callbacks that are slightly different from its correspondent original /// LS callbacks due to logistics of managed code callback interop with LS. /// ////// Critical - as this structure points to several callbacks that'll be /// invoked from unmanaged code. Marked all function pointer /// members Critical. /// /// Just putting the SecurityNote on the top instead of on every /// member. /// [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct LscbkRedefined { [SecurityCritical] public FetchRunRedefined pfnFetchRunRedefined; [SecurityCritical] public GetGlyphsRedefined pfnGetGlyphsRedefined; [SecurityCritical] public FetchLineProps pfnFetchLineProps; } // Context info (LSCONTEXTINFO) ////// Critical - as this structure points to several callbacks that'll be /// invoked from unmanaged code. Marked all function pointer /// members Critical. /// /// Just putting the SecurityNote on the top instead of on every /// member. /// [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal unsafe struct LsContextInfo { public uint version; // version number public int cInstalledHandlers; // total installed object handlers public IntPtr plsimethods; // array of installed objects LSIMETHODS // Text config (LSTXTCFG) public int cEstimatedCharsPerLine; // used for input array size for all four FullMixed justification callbacks (cPriorityLevelMax) public int cJustPriorityLim; public char wchUndef; public char wchNull; public char wchSpace; public char wchHyphen; public char wchTab; public char wchPosTab; public char wchEndPara1; public char wchEndPara2; public char wchAltEndPara; public char wchEndLineInPara; public char wchColumnBreak; public char wchSectionBreak; public char wchPageBreak; public char wchNonBreakSpace; public char wchNonBreakHyphen; public char wchNonReqHyphen; public char wchEmDash; public char wchEnDash; public char wchEmSpace; public char wchEnSpace; public char wchNarrowSpace; public char wchOptBreak; public char wchNoBreak; public char wchFESpace; public char wchJoiner; public char wchNonJoiner; public char wchToReplace; public char wchReplace; public char wchVisiNull; public char wchVisiAltEndPara; public char wchVisiEndLineInPara; public char wchVisiEndPara; public char wchVisiSpace; public char wchVisiNonBreakSpace; public char wchVisiNonBreakHyphen; public char wchVisiNonReqHyphen; public char wchVisiTab; public char wchVisiPosTab; public char wchVisiEmSpace; public char wchVisiEnSpace; public char wchVisiNarrowSpace; public char wchVisiOptBreak; public char wchVisiNoBreak; public char wchVisiFESpace; public char wchEscAnmRun; public char wchPad; // More LSCONTEXTINFO public IntPtr pols; // Opaque client object // Memory management on unmanaged heap [SecurityCritical] public IntPtr pfnNewPtr; [SecurityCritical] public IntPtr pfnDisposePtr; [SecurityCritical] public IntPtr pfnReallocPtr; // General application callbacks [SecurityCritical] public IntPtr pfnFetchRun; [SecurityCritical] public GetAutoNumberInfo pfnGetAutoNumberInfo; [SecurityCritical] public IntPtr pfnGetNumericSeparators; [SecurityCritical] public IntPtr pfnCheckForDigit; [SecurityCritical] public FetchPap pfnFetchPap; [SecurityCritical] public FetchLineProps pfnFetchLineProps; [SecurityCritical] public IntPtr pfnFetchTabs; [SecurityCritical] public IntPtr pfnReleaseTabsBuffer; [SecurityCritical] public IntPtr pfnGetBreakThroughTab; [SecurityCritical] public IntPtr pfnGetPosTabProps; [SecurityCritical] public IntPtr pfnFGetLastLineJustification; [SecurityCritical] public IntPtr pfnCheckParaBoundaries; [SecurityCritical] public GetRunCharWidths pfnGetRunCharWidths; [SecurityCritical] public IntPtr pfnCheckRunKernability; [SecurityCritical] public IntPtr pfnGetRunCharKerning; [SecurityCritical] public GetRunTextMetrics pfnGetRunTextMetrics; [SecurityCritical] public GetRunUnderlineInfo pfnGetRunUnderlineInfo; [SecurityCritical] public GetRunStrikethroughInfo pfnGetRunStrikethroughInfo; [SecurityCritical] public IntPtr pfnGetBorderInfo; [SecurityCritical] public IntPtr pfnReleaseRun; [SecurityCritical] public IntPtr pfnReleaseRunBuffer; [SecurityCritical] public Hyphenate pfnHyphenate; [SecurityCritical] public GetPrevHyphenOpp pfnGetPrevHyphenOpp; [SecurityCritical] public GetNextHyphenOpp pfnGetNextHyphenOpp; [SecurityCritical] public IntPtr pfnGetHyphenInfo; [SecurityCritical] public DrawUnderline pfnDrawUnderline; [SecurityCritical] public DrawStrikethrough pfnDrawStrikethrough; [SecurityCritical] public IntPtr pfnDrawBorder; [SecurityCritical] public IntPtr pfnFInterruptUnderline; [SecurityCritical] public IntPtr pfnFInterruptShade; [SecurityCritical] public IntPtr pfnFInterruptBorder; [SecurityCritical] public IntPtr pfnShadeRectangle; [SecurityCritical] public DrawTextRun pfnDrawTextRun; [SecurityCritical] public IntPtr pfnDrawSplatLine; [SecurityCritical] public FInterruptShaping pfnFInterruptShaping; [SecurityCritical] public IntPtr pfnGetGlyphs; [SecurityCritical] public GetGlyphPositions pfnGetGlyphPositions; [SecurityCritical] public DrawGlyphs pfnDrawGlyphs; [SecurityCritical] public IntPtr pfnReleaseGlyphBuffers; [SecurityCritical] public IntPtr pfnGetGlyphExpansionInfo; [SecurityCritical] public IntPtr pfnGetGlyphExpansionInkInfo; [SecurityCritical] public IntPtr pfnGetGlyphRunInk; [SecurityCritical] public IntPtr pfnGetEms; [SecurityCritical] public IntPtr pfnPunctStartLine; [SecurityCritical] public IntPtr pfnModWidthOnRun; [SecurityCritical] public IntPtr pfnModWidthSpace; [SecurityCritical] public IntPtr pfnCompOnRun; [SecurityCritical] public IntPtr pfnCompWidthSpace; [SecurityCritical] public IntPtr pfnExpOnRun; [SecurityCritical] public IntPtr pfnExpWidthSpace; [SecurityCritical] public IntPtr pfnGetModWidthClasses; [SecurityCritical] public IntPtr pfnGetBreakingClasses; [SecurityCritical] public IntPtr pfnFTruncateBefore; [SecurityCritical] public IntPtr pfnCanBreakBeforeChar; [SecurityCritical] public IntPtr pfnCanBreakAfterChar; [SecurityCritical] public IntPtr pfnFHangingPunct; [SecurityCritical] public IntPtr pfnGetSnapGrid; [SecurityCritical] public IntPtr pfnDrawEffects; [SecurityCritical] public IntPtr pfnFCancelHangingPunct; [SecurityCritical] public IntPtr pfnModifyCompAtLastChar; [SecurityCritical] public GetDurMaxExpandRagged pfnGetDurMaxExpandRagged; [SecurityCritical] public GetCharExpansionInfoFullMixed pfnGetCharExpansionInfoFullMixed; [SecurityCritical] public GetGlyphExpansionInfoFullMixed pfnGetGlyphExpansionInfoFullMixed; [SecurityCritical] public GetCharCompressionInfoFullMixed pfnGetCharCompressionInfoFullMixed; [SecurityCritical] public GetGlyphCompressionInfoFullMixed pfnGetGlyphCompressionInfoFullMixed; [SecurityCritical] public IntPtr pfnGetCharAlignmentStartLine; [SecurityCritical] public IntPtr pfnGetCharAlignmentEndLine; [SecurityCritical] public IntPtr pfnGetGlyphAlignmentStartLine; [SecurityCritical] public IntPtr pfnGetGlyphAlignmentEndLine; [SecurityCritical] public IntPtr pfnGetPriorityForGoodTypography; [SecurityCritical] public EnumText pfnEnumText; [SecurityCritical] public EnumTab pfnEnumTab; [SecurityCritical] public IntPtr pfnEnumPen; [SecurityCritical] public GetObjectHandlerInfo pfnGetObjectHandlerInfo; // Debugging [SecurityCritical] public IntPtr pfnAssertFailedPtr; // Even more LSCONTEXTINFO public int fDontReleaseRuns; } // Presentation/Rendering device resolutions (LSDEVRES) [StructLayout(LayoutKind.Sequential)] internal struct LsDevRes { public uint dxpInch; public uint dypInch; public uint dxrInch; public uint dyrInch; } // Presentation/Rendering device resolutions (LSDEVRES) [StructLayout(LayoutKind.Sequential)] internal struct LsLInfo { public int dvpAscent; public int dvrAscent; public int dvpDescent; public int dvrDescent; public int dvpMultiLineHeight; public int dvrMultiLineHeight; public int dvpAscentAutoNumber; public int dvrAscentAutoNumber; public int dvpDescentAutoNumber; public int dvrDescentAutoNumber; public int cpLimToContinue; public int cpLimToStay; public int dcpDepend; public int cpFirstVis; public LsEndRes endr; public int fAdvanced; public int vaAdvance; public int fFirstLineInPara; public int fTabInMarginExLine; public int fForcedBreak; public uint EffectsFlags; } [StructLayout(LayoutKind.Sequential)] internal struct LsBreakRecSubl { public int lscpFetch; public int idobj; public IntPtr pbreakrecobj; } // Paragraph Properties (LSPAP) // Returned to LS thru FetchPap, called upon LsCreateLine. [StructLayout(LayoutKind.Sequential)] internal struct LsPap { public int cpFirst; // First CP public int cpFirstContent; // First content CP [Flags] public enum Flags : uint { None = 0, // Visi flags fFmiVisiCondHyphens = 0x00000001, fFmiVisiParaMarks = 0x00000002, fFmiVisiSpaces = 0x00000004, fFmiVisiTabs = 0x00000008, fFmiVisiSplats = 0x00000010, fFmiVisiBreaks = 0x00000020, // Advanced typography fFmiApplyBreakingRules = 0x00000040, fFmiApplyOpticalAlignment = 0x00000080, fFmiPunctStartLine = 0x00000100, fFmiHangingPunct = 0x00000200, // WYSIWYG flags fFmiPresSuppressWiggle = 0x00000400, fFmiPresExactSync = 0x00000800, // AutoNumbering flags fFmiAnm = 0x00001000, // Misc. fFmiAutoDecimalTab = 0x00002000, fFmiUnderlineTrailSpacesRM = 0x00004000, fFmiSpacesInfluenceHeight = 0x00008000, fFmiIgnoreSplatBreak = 0x00010000, fFmiLimSplat = 0x00020000, fFmiAllowSplatLine = 0x00040000, fFmiForceBreakAsNext = 0x00080000, fFmiAllowHyphenation = 0x00100000, fFmiDrawInCharCodes = 0x00200000, fFmiTreatHyphenAsRegular = 0x00400000, fFmiWrapTrailingSpaces = 0x00800000, fFmiWrapAllSpaces = 0x01000000, // Compatibility flags for bugs in older versions of Word fFmiFCheckTruncateBefore = 0x02000000, fFmiForgetLastTabAlignment = 0x10000000, fFmiIndentChangesHyphenZone = 0x20000000, fFmiNoPunctAfterAutoNumber = 0x40000000, fFmiResolveTabsAsWord97 = 0x80000000, } public Flags grpf; public LsBreakJust lsbrj; public LsKJust lskj; public int fJustify; public int durAutoDecimalTab; public LsKEOP lskeop; public LsTFlow lstflow; } // Line properties // Returned to LS thru FetchLineProps [StructLayout(LayoutKind.Sequential)] internal struct LsLineProps { public LsKAlign lskal; // Alignment type public int durLeft; // Left line boundary public int durRightBreak; // Right linebreak boundary public int durRightJustify; // Right justification boundary public int fProhibitHyphenation; // prohibit hyphenation on this line? public int durHyphenationZone; // hyphenation zone for non-optimal breaking } // Charater properties (LsChp) // Returned to LS thru FetchRun [StructLayout(LayoutKind.Sequential)] internal struct LsChp { public ushort idObj; public ushort dcpMaxContent; public uint effectsFlags; [Flags] public enum Flags : uint { None = 0, fApplyKern = 0x0001, fModWidthOnRun = 0x0002, fModWidthSpace = 0x0004, fModWidthPairs = 0x0008, fCompressOnRun = 0x0010, fCompressSpace = 0x0020, fCompressTable = 0x0040, fExpandOnRun = 0x0080, fExpandSpace = 0x0100, fExpandTable = 0x0200, fGlyphBased = 0x0400, // 5 bits of padding to align to next word fInvisible = 0x00010000, fUnderline = 0x00020000, fStrike = 0x00040000, fShade = 0x00080000, fBorder = 0x00100000, fSymbol = 0x00200000, fHyphen = 0x00400000, // Hyphenation opportunity (YSR info) fCheckForReplaceChar = 0x00800000, // Activate the replace char mechanizm for Yen // 8 bits of padding } public Flags flags; // bitfields public int dvpPos; } // TextMetrics (LSTXM) // Returned to LS by GetRunTextMetrics [StructLayout(LayoutKind.Sequential)] internal struct LsTxM { public int dvAscent; public int dvDescent; public int dvMultiLineHeight; public int fMonospaced; // BOOL } // Heights (heights) // Input parameter to DrawTextRun [StructLayout(LayoutKind.Sequential)] internal struct LsHeights { public int dvAscent; public int dvDescent; public int dvMultiLineHeight; } [StructLayout(LayoutKind.Sequential)] internal struct LsQSubInfo { public LsTFlow lstflowSubLine; public int lscpFirstSubLine; public int lsdcpSubLine; public LSPOINT pointUvStartSubLine; public LsHeights lsHeightsPresSubLine; public int dupSubLine; public uint idobj; public IntPtr plsrun; public int lscpFirstRun; public int lsdcpRun; public LSPOINT pointUvStartRun; public LsHeights lsHeightsPresRun; public int dupRun; public int dvpPosRun; public int dupBorderBefore; public int dupBorderAfter; public LSPOINT pointUvStartObj; public LsHeights lsHeightsPresObj; public int dupObj; } [StructLayout(LayoutKind.Sequential)] internal struct LsTextCell { public int lscpStartCell; public int lscpEndCell; public LSPOINT pointUvStartCell; public int dupCell; public int cCharsInCell; public int cGlyphsInCell; public IntPtr plsCellDetails; // client-defined structure } [StructLayout(LayoutKind.Sequential)] internal struct LsLineWidths { public int upStartMarker; // column start to marker start public int upLimMarker; // column start to marker end public int upStartMainText; // column start to main text start public int upStartTrailing; // column start to trailing space start public int upLimLine; // column start to line end public int upMinStartTrailing; // the smallest upStartTrailing possible public int upMinLimLine; // the smallest upLimLine possible } [StructLayout(LayoutKind.Sequential)] internal unsafe struct LsBreaks { public int cBreaks; // number of total breaks public LsLInfo* plslinfoArray; // array of LSLINFO structs, each per each break public IntPtr* plinepenaltyArray; // array of unsafe handle to TSLINEPENALITYINFO struct, each per each break public IntPtr* pplolineArray; // array of unsafe handle to Loline struct, each per each break } [StructLayout(LayoutKind.Sequential)] internal struct LsNeighborInfo { public uint fNeighborIsPresent; public uint fNeighborIsText; public Plsrun plsrun; [MarshalAs(UnmanagedType.U2)] public char wch; public uint fGlyphBased; public CharacterShapingProperties chprop; public ushort gindex; public GlyphShapingProperties gprop; } [StructLayout(LayoutKind.Sequential)] internal unsafe struct LsGlyphRunInfo { public Plsrun plsrun; public char* pwch; // array of character codes public ushort* rggmap; // wchar->glyph mapping public CharacterShapingProperties* rgchprop; // array of char properties as returned by GetGlyphs public int cwch; // number of characters public int duChangeRight; // nominal-to-ideal changes on the right side of the run public ushort* rggindex; // glyph indices public GlyphShapingProperties* rggprop; // array of glyph properties as returned by GetGlyphs public int* rgduWidth; // array of glyph widths as returned by GetGlypPositions public GlyphOffset* rggoffset; // array of glyph offset as returned by GetGlypPositions public int cgindex; // number of glyphs } [StructLayout(LayoutKind.Sequential)] internal unsafe struct LsCharRunInfo { public Plsrun plsrun; public char* pwch; // array of character codes public int* rgduNominalWidth; // array of nominal widths public int* rgduChangeLeft; // array of nominal-to-ideal changes on the left side public int* rgduChangeRight; // array of nominal-to-ideal changes on the right side public int cwch; // number of characters } // // Custom object handler structures // // ////// Critical - as this structure points to several callbacks that'll be /// invoked from unmanaged code. Marked all members Critical. /// Just putting the SecurityNote on the top instead of on every /// member. /// [StructLayout(LayoutKind.Sequential)] internal struct InlineInit { public uint dwVersion; [SecurityCritical] public InlineFormat pfnFormat; [SecurityCritical] public InlineDraw pfnDraw; } ////// Line Services computational constants /// internal static partial class Constants { public const int InfiniteWidth = 0x3FFFFFFE; public const double DefaultRealToIdeal = 28800.0 / 96; public const double DefaultIdealToReal = 1 / DefaultRealToIdeal; // A reasonable maximum interword spacing for normal text is half an em // while a good average is a third of em. // A reasonable minimum interword spacing for normal text is a fifth of em // while a good average is a quarter of em. // // [Robert Bringhurst "The Elements of Typographic Style" p.26] public const double MinInterWordCompressionPerEm = 0.2; public const double MaxInterWordExpansionPerEm = 0.5; // According to Knuth, the linebreak that results in a line with stretchability // 4.7 or greater is considered awful and should be thrown away from the optimal // calculation. // // Stretchability (S) is the value proportion of the expandable excess width in // the line and the maximum expansion allowed. S <= 1 is considered a 'good' // linebreak. 1 < S < 4.7 is kinda bad but still considered acceptable, and // S >= 4.7 is just plain awful and should never be chosen. // // PTLS allows for multiple layers of expansion insertion. We define the first // layer to be for 'good' break, which by definition max out at 1.0 stretchability. // The second layout is defined as 'acceptable' break and max out at an addition of // 2.0. The third layer is defined as 'bad'. It is at this layer where we start to // distribute expansion between letters (inter-letter expansion). This layer max // out at infinity. The value defined below is the max out stretchability of the // second layer. This means we are saying - we'll start inter-letter distribution // for a break which yields the line with stretchability greater than 3.0. Thus, a // line with inter-letter expansion may be accepted within an optimal paragraph // calculation only if it has stretchability >= 3.0 but < 4.7. // // So, just to give an idea of how difference a line with S = 1.0 and S = 4.7 is in // Knuth's calculation; the badness of the line is the power of six of its stretchability // value. Line with greater stretchability is significantly worse than one with smaller value. // // For more detail on the badness calculation; see the "Optimal Paragraph" design spec // http://team/sites/Avalon/Specs/Optimal%20Paragraph.doc. public const int AcceptableLineStretchability = 2; // Minimum number of characters before and after the current position to // be analyzed by the lexical service component such as hyphenation or // word-break and cached so future call within the same character range // can be done efficiently. // // Making these numbers too small would result in more cache miss during // line-breaking. Making it too great wastes memory. public const int MinCchToCacheBeforeAndAfter = 16; } ////// Helper functions to convert to and from LS enum values /// internal sealed class Convert { // Helper class not instantiable private Convert() {} ////// From LsTFlow to FlowDirection /// public static FlowDirection LsTFlowToFlowDirection(LsTFlow lstflow) { switch (lstflow) { //case LsTFlow.lstflowDefault: case LsTFlow.lstflowES: case LsTFlow.lstflowEN: return FlowDirection.LeftToRight; case LsTFlow.lstflowWS: case LsTFlow.lstflowWN: return FlowDirection.RightToLeft; // vertical flow is not supported case LsTFlow.lstflowSE: case LsTFlow.lstflowSW: case LsTFlow.lstflowNE: case LsTFlow.lstflowNW: break; } return FlowDirection.LeftToRight; } ////// From TabAlignment to LsKTab /// public static LsKTab LsKTabFromTabAlignment(TextTabAlignment tabAlignment) { switch (tabAlignment) { case TextTabAlignment.Right: return LsKTab.lsktRight; case TextTabAlignment.Center: return LsKTab.lsktCenter; case TextTabAlignment.Character: return LsKTab.lsktChar; } return LsKTab.lsktLeft; } } // // Line Services exported functions // // ////// /// This is a meta security comment for all the native functions in this class. /// /// Line services does not do any security critical operations as such. All it does /// really is to compute the layout information. What's unsecure is the design pattern /// that involves a chat'ty interface with unmanaged code. /// /// All the native functions that call into the line services code take a context, /// usually PLOC, as a parameter. This is opaque to the managed code and is handled /// as an IntPtr. Since the memory pointed to by this parameter can be written to /// by the line services code, all these native methods are considered Unsafe. /// /// There may be other parameters too that'll be written to directly by LS code /// but these will be appropriately marked Critical or validated when the function /// is called. /// /// See PTSInPartialTrust.mht in the framework\ms\internal\ptshost directory that /// explains the design philosophy. All of it applies to LineServices code also. /// /// internal static class UnsafeNativeMethods { ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCreateContext")] internal static extern LsErr LoCreateContext( ref LsContextInfo contextInfo, // const ref LscbkRedefined lscbkRedef, out IntPtr ploc ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDestroyContext")] internal static extern LsErr LoDestroyContext( IntPtr ploc ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCreateLine")] internal static extern LsErr LoCreateLine( IntPtr ploc, int cp, int ccpLim, int durColumn, uint dwLineFlags, IntPtr pInputBreakRec, out LsLInfo plslinfo, out IntPtr pploline, out int maxDepth, out LsLineWidths lineWidths ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDisposeLine")] internal static extern LsErr LoDisposeLine( IntPtr ploline, [MarshalAs(UnmanagedType.Bool)] bool finalizing ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoAcquireBreakRecord")] internal static extern LsErr LoAcquireBreakRecord( IntPtr ploline, out IntPtr pbreakrec ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDisposeBreakRecord")] internal static extern LsErr LoDisposeBreakRecord( IntPtr pBreakRec, [MarshalAs(UnmanagedType.Bool)] bool finalizing ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCloneBreakRecord")] internal static extern LsErr LoCloneBreakRecord( IntPtr pBreakRec, out IntPtr pBreakRecClone ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoRelievePenaltyResource")] internal static extern LsErr LoRelievePenaltyResource( IntPtr ploline ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoSetBreaking")] internal static extern LsErr LoSetBreaking( IntPtr ploc, int strategy ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoSetDoc")] internal static extern LsErr LoSetDoc( IntPtr ploc, int isDisplay, int isReferencePresentationEqual, ref LsDevRes deviceInfo ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoSetTabs")] internal static unsafe extern LsErr LoSetTabs( IntPtr ploc, int durIncrementalTab, int tabCount, LsTbd* pTabs ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDisplayLine")] internal static extern LsErr LoDisplayLine( IntPtr ploline, ref LSPOINT pt, uint displayMode, ref LSRECT clipRect ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoEnumLine")] internal static extern LsErr LoEnumLine( IntPtr ploline, bool reverseOder, bool fGeometryneeded, ref LSPOINT pt ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoQueryLineCpPpoint")] internal static extern LsErr LoQueryLineCpPpoint( IntPtr ploline, int lscpQuery, int depthQueryMax, IntPtr pSubLineInfo, // passing raw pinned pointer for out array out int actualDepthQuery, out LsTextCell lsTextCell ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoQueryLinePointPcp")] internal static extern LsErr LoQueryLinePointPcp( IntPtr ploline, ref LSPOINT ptQuery, // use POINT as POINTUV int depthQueryMax, IntPtr pSubLineInfo, // passing raw pinned pointer for out array out int actualDepthQuery, out LsTextCell lsTextCell ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCreateBreaks")] internal static extern LsErr LoCreateBreaks( IntPtr ploc, // Line Services context int cpFirst, IntPtr previousBreakRecord, IntPtr ploparabreak, IntPtr ptslinevariantRestriction, ref LsBreaks lsbreaks, out int bestFitIndex ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCreateParaBreakingSession")] internal static extern LsErr LoCreateParaBreakingSession( IntPtr ploc, // Line Services context int cpParagraphFirst, int maxWidth, IntPtr previousParaBreakRecord, ref IntPtr pploparabreak, [MarshalAs(UnmanagedType.Bool)] ref bool fParagraphJustified ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDisposeParaBreakingSession")] internal static extern LsErr LoDisposeParaBreakingSession( IntPtr ploparabreak, [MarshalAs(UnmanagedType.Bool)] bool finalizing ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LocbkGetObjectHandlerInfo")] internal unsafe static extern LsErr LocbkGetObjectHandlerInfo( IntPtr ploc, // Line Services context uint objectId, // installed object id void* objectInfo // object handler info ); ////// Critical - as this calls a function with SUC on it. /// Safe - as this just fills a data structure. /// /// We need to do this wrapper for the TAS to work correctly with enforcement. /// [SecurityCritical, SecurityTreatAsSafe] internal static void LoGetEscString( ref EscStringInfo escStringInfo) { LoGetEscStringImpl(ref escStringInfo); } ////// Critical - as this code performs an elevation. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoGetEscString")] private static extern void LoGetEscStringImpl( ref EscStringInfo escStringInfo ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoAcquirePenaltyModule")] internal static extern LsErr LoAcquirePenaltyModule( IntPtr ploc, // Line Services context out IntPtr penaltyModuleHandle ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoDisposePenaltyModule")] internal static extern LsErr LoDisposePenaltyModule( IntPtr penaltyModuleHandle ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoGetPenaltyModuleInternalHandle")] internal static extern LsErr LoGetPenaltyModuleInternalHandle( IntPtr penaltyModuleHandle, out IntPtr penaltyModuleInternalHandle ); } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------ // // Microsoft Windows Client Platform // Copyright (c) Microsoft Corporation. All rights reserved. // // File: NativeMethods.cs // // Content: Line Services managed wrapper // // Created: 9-4-2001 Worachai Chaoweeraprasit (wchao) // //----------------------------------------------------------------------- using System; using System.Windows; using System.Windows.Media; using System.Windows.Media.TextFormatting; using System.Security; using System.Runtime.InteropServices; using MS.Internal.Shaping; namespace MS.Internal.TextFormatting { // // Line Services application callback delegates // // Note: The declared type of some parameters differs from the logical type. // // Some parameters are declared int instead of bool because on the unmanaged side they have type BOOL, // which is a typedef for int. By convention, we use 'f' prefix to indicate that an int represents a // boolean flag. // // One parameter is declared "ref ushort" instead of "ref char" because on the unmanaged side WCHAR // is a typedef for unsigned short. This appears to be necessary for correct behavior even though // sizeof(char) == sizeof(ushort) because char by default is marshalled as an ANSI char. // // We could use the more descriptive types and specify [MarshalAs(UnamangedType.Bool)] and // [MarshalAs(UnmanagedType.U2)], respectively, but the slight gain in readibility comes at an // unacceptable cost in run-time overhead due to use of the slow marshaller. // internal delegate LsErr FetchPap( IntPtr pols, int lscpFetch, ref LsPap lspap ); internal delegate LsErr FetchLineProps( IntPtr pols, int lscpFetch, int firstLineInPara, ref LsLineProps lsLineProps ); internal unsafe delegate LsErr FetchRunRedefined( IntPtr pols, int lscpFetch, int fIsStyle, // logically boolean (see above) IntPtr pstyle, char* pwchTextBuffer, int cchTextBuffer, ref int fIsBufferUsed, // logically boolean (see above) out char* pwchText, ref int cchText, ref int fIsHidden, // logically boolean (see above) ref LsChp lschp, ref IntPtr lsplsrun ); internal delegate LsErr GetRunTextMetrics ( IntPtr pols, Plsrun plsrun, LsDevice lsDevice, LsTFlow lstFlow, ref LsTxM lstTextMetrics ); internal unsafe delegate LsErr GetRunCharWidths( IntPtr pols, Plsrun plsrun, LsDevice device, char *runText, int cchRun, int maxWidth, LsTFlow textFlow, int *charWidths, ref int totalWidth, ref int cchProcessed ); internal delegate LsErr GetDurMaxExpandRagged( IntPtr pols, Plsrun plsrun, LsTFlow lstFlow, ref int maxExpandRagged ); internal unsafe delegate LsErr DrawTextRun( IntPtr pols, Plsrun plsrun, ref LSPOINT ptText, char *runText, int *charWidths, int cchText, LsTFlow textFlow, uint displayMode, ref LSPOINT ptRun, ref LsHeights lsHeights, int dupRun, ref LSRECT clipRect ); internal delegate LsErr FInterruptShaping( IntPtr pols, LsTFlow textFlow, Plsrun firstPlsrun, Plsrun secondPlsrun, ref int fIsInterruptOk // logically boolean (see above) ); internal delegate LsErr GetRunUnderlineInfo( IntPtr pols, Plsrun plsrun, ref LsHeights lsHeights, LsTFlow textFlow, ref LsULInfo ulInfo ); internal delegate LsErr GetRunStrikethroughInfo( IntPtr pols, Plsrun plsrun, ref LsHeights lsHeights, LsTFlow textFlow, ref LsStInfo stInfo ); internal delegate LsErr Hyphenate( IntPtr pols, int fLastHyphenationFound, // logically boolean (see above) int lscpLastHyphenation, ref LsHyph lastHyphenation, int lscpBeginWord, int lscpExceed, ref int fHyphenFound, // logically boolean (see above) ref int lscpHyphen, ref LsHyph plsHyph ); internal delegate LsErr GetNextHyphenOpp( IntPtr pols, int lscpStartSearch, int lsdcpSearch, ref int fHyphenFound, // logically boolean (see above) ref int lscpHyphen, ref LsHyph lsHyph ); internal delegate LsErr GetPrevHyphenOpp( IntPtr pols, int lscpStartSearch, int lsdcpSearch, ref int fHyphenFound, // logically boolean (see above) ref int lscpHyphen, ref LsHyph lsHyph ); internal delegate LsErr GetAutoNumberInfo( IntPtr pols, ref LsKAlign alignment, ref LsChp lschp, ref IntPtr lsplsrun, ref ushort addedChar, // logically char (see above) ref LsChp lschpAddedChar, ref IntPtr lsplsrunAddedChar, ref int fWord95Model, // logically boolean (see above) ref int offset, ref int width ); internal delegate LsErr DrawUnderline( IntPtr pols, Plsrun plsrun, uint ulType, ref LSPOINT ptOrigin, int ulLength, int ulThickness, LsTFlow textFlow, uint displayMode, ref LSRECT clipRect ); internal delegate LsErr DrawStrikethrough( IntPtr pols, Plsrun plsrun, uint stType, ref LSPOINT ptOrigin, int stLength, int stThickness, LsTFlow textFlow, uint displayMode, ref LSRECT clipRect ); internal unsafe delegate LsErr GetGlyphsRedefined( IntPtr pols, IntPtr* plsplsruns, int* pcchPlsrun, int plsrunCount, char* pwchText, int cchText, LsTFlow textFlow, ushort* puGlyphsBuffer, int* piGlyphPropsBuffer, int cgiGlyphBuffers, ref int fIsGlyphBuffersUsed, // logically boolean (see above) ushort* puClusterMap, CharacterShapingProperties* puCharProperties, int* pfCanGlyphAlone, ref int glyphCount ); internal unsafe delegate LsErr GetGlyphPositions( IntPtr pols, IntPtr *plsplsruns, int *pcchPlsrun, int plsrunCount, LsDevice device, char *pwchText, ushort *puClusterMap, CharacterShapingProperties *puCharProperties, int cchText, ushort *puGlyphs, GlyphShapingProperties *piGlyphProperties, int glyphCount, LsTFlow textFlow, int *piGlyphAdvances, GlyphOffset *piiGlyphOffsets ); internal unsafe delegate LsErr DrawGlyphs( IntPtr pols, Plsrun plsrun, char *pwchText, ushort *puClusterMap, CharacterShapingProperties *puCharProperties, int cchText, ushort *puGlyphs, int *piJustifiedGlyphAdvances, int *puGlyphAdvances, GlyphOffset *piiGlyphOffsets, GlyphShapingProperties *piGlyphProperties, LsExpType *plsExpType, int glyphCount, LsTFlow textFlow, uint displayMode, ref LSPOINT origin, ref LsHeights lsHeights, int runWidth, ref LSRECT clippingRect ); internal unsafe delegate LsErr EnumText( IntPtr pols, Plsrun plsrun, int cpFirst, int dcp, char *pwchText, int cchText, LsTFlow lstFlow, int fReverseOrder, // logically boolean (see above) int fGeometryProvided, // logically boolean (see above) ref LSPOINT pptStart, ref LsHeights pheights, int dupRun, int glyphBaseRun, int *charWidths, ushort *pClusterMap, CharacterShapingProperties *characterProperties, ushort *puglyphs, int *pGlyphAdvances, GlyphOffset *pGlyphOffsets, GlyphShapingProperties *pGlyphProperties, int glyphCount ); internal unsafe delegate LsErr EnumTab( IntPtr pols, Plsrun plsrun, int cpFirst, char *pwchText, char tabLeader, LsTFlow lstFlow, int fReverseOrder, // logically boolean (see above) int fGeometryProvided, // logically boolean (see above) ref LSPOINT pptStart, ref LsHeights heights, int dupRun ); internal unsafe delegate LsErr GetCharCompressionInfoFullMixed( IntPtr pols, LsDevice device, LsTFlow textFlow, LsCharRunInfo *plscharrunInfo, LsNeighborInfo *plsneighborInfoLeft, LsNeighborInfo *plsneighborInfoRight, int maxPriorityLevel, int **pplscompressionLeft, int **pplscompressionRight ); internal unsafe delegate LsErr GetCharExpansionInfoFullMixed( IntPtr pols, LsDevice device, LsTFlow textFlow, LsCharRunInfo *plscharrunInfo, LsNeighborInfo *plsneighborInfoLeft, LsNeighborInfo *plsneighborInfoRight, int maxPriorityLevel, int **pplsexpansionLeft, int **pplsexpansionRight ); internal unsafe delegate LsErr GetGlyphCompressionInfoFullMixed( IntPtr pols, LsDevice device, LsTFlow textFlow, LsGlyphRunInfo *plsglyphrunInfo, LsNeighborInfo *plsneighborInfoLeft, LsNeighborInfo *plsneighborInfoRight, int maxPriorityLevel, int **pplscompressionLeft, int **pplscompressionRight ); internal unsafe delegate LsErr GetGlyphExpansionInfoFullMixed( IntPtr pols, LsDevice device, LsTFlow textFlow, LsGlyphRunInfo *plsglyphrunInfo, LsNeighborInfo *plsneighborInfoLeft, LsNeighborInfo *plsneighborInfoRight, int maxPriorityLevel, int **pplsexpansionLeft, int **pplsexpansionRight, LsExpType *plsexptype, int *pduMinInk ); // // Line Services object handler callback delegates // // internal unsafe delegate LsErr GetObjectHandlerInfo( IntPtr pols, // Line Layout context uint objectId, // installed object id void* objectInfo // object handler info ); internal delegate LsErr InlineFormat( IntPtr pols, // Line Layout context Plsrun plsrun, // plsrun int lscpInline, // first cp of the run int currentPosition, // inline's current pen location in text direction int rightMargin, // right margin ref ObjDim pobjDim, // object dimension out int fFirstRealOnLine, // is this run the first in line; logically boolean (see above) out int fPenPositionUsed, // is pen position used to format object; logically boolean (see above) out LsBrkCond breakBefore, // break condition before this object out LsBrkCond breakAfter // break condition after this object ); internal delegate LsErr InlineDraw( IntPtr pols, // Line Layout context Plsrun plsrun, // plsrun ref LSPOINT runOrigin, // pen position at which to render the object LsTFlow textFlow, // text flow direction int runWidth // object width ); // // Line Services enumerations // // // handle to text run opaque to Line Services internal enum Plsrun : uint { CloseAnchor = 0, Reverse = 1, FakeLineBreak = 2, // simulated line break for security mitigation FormatAnchor = 3, Hidden = 4, Text = 5, // run with type starting at this point is stored InlineObject = 6, LineBreak = 7, ParaBreak = 8, Undefined = 0x80000000, // Bit 31 cannot be set without causing an overflow exception in LineServices so we reserve it as a 'undefined' Plsrun value IsMarker = 0x40000000, // Bit indicates this run is part of marker symbol UseNewCharacterBuffer = 0x20000000, // Bit indicates this run uses dynamically allocated heap buffer for run characters IsSymbol = 0x10000000, // Bit indicates run uses a non-Unicode font; don't change this value without updating unmanaged GetBreakingClasses callback UnmaskAll = 0x0FFFFFFF, // Value to unmask all the masking bits } // Unmanaged enum counterpart is in LSLO.H. // == Both sides must be binary compatible == [Flags] internal enum LineFlags { // line break flags None = 0, BreakClassWide = 0x00000001, BreakClassStrict = 0x00000002, BreakAlways = 0x00000004, MinMax = 0x00000008, KeepState = 0x00000010, } internal enum LsEndRes { endrNormal, endrHyphenated, endrEndPara, endrAltPara, endrSoftCR, endrEndColumn, endrEndSection, endrEndPage, endrEndParaSection, endrStopped, endrBeforeFillLineObject, endrAfterFillLineObject, endrMathUserRequiredBreak } internal enum LsBreakJust { lsbrjBreakJustify, // regular US lsbrjBreakWithCompJustify, // FE & Newspaper lsbrjBreakThenExpand, // Arabic lsbrjBreakOptimal, // Best fit/Optimal paragraph lsbrjBreakThenSqueeze // WordPerfect } internal enum LsKJust { lskjFullInterWord, lskjFullInterLetterAligned, lskjFullScaled, lskjFullGlyphs, lskjFullMixed, lskjSnapGrid } internal enum LsKAlign { lskalLeft, lskalCentered, lskalRight, } internal enum LsKEOP { lskeopEndPara1, lskeopEndPara2, lskeopEndPara12, lskeopEndParaAlt } internal enum LsKTab { lsktLeft, lsktCenter, lsktRight, lsktDecimal, lsktChar } internal enum LsTFlow { lstflowDefault = 0, lstflowES = 0, lstflowEN, lstflowSE, lstflowSW, lstflowWS, lstflowWN, lstflowNE, lstflowNW, } internal enum LsBrkCond { Never, Can, Please, Must } internal enum LsDevice { Presentation, Reference, } internal enum LsExpType : byte { None = 0, AddWhiteSpace, AddInkContinuous, AddInkDiscrete, } internal enum LsKysr { ////// Normal Hyphenation /// kysrNormal, ////// Add letter before hyphen /// kysrAddBefore, ////// Change letter before hyphen /// kysrChangeBefore, ////// Delete letter before hyphen /// kysrDeleteBefore, ////// Change letter after hyphen /// kysrChangeAfter, ////// Delete letter before the hypen and change the preceding one /// kysrDelAndChange, ////// Add letter before the hyphen and change letter after it /// kysrAddBeforeChangeAfter, } internal enum LsHyphenQuality { lshqExcellent, lshqGood, lshqFair, lshqPoor, lshqBad } internal enum LsErr { None = 0, InvalidParameter = -1, OutOfMemory = -2, NullOutputParameter = -3, InvalidContext = -4, InvalidLine = -5, InvalidDnode = -6, InvalidDeviceResolution = -7, InvalidRun = -8, MismatchLineContext = -9, ContextInUse = -10, DuplicateSpecialCharacter = -11, InvalidAutonumRun = -12, FormattingFunctionDisabled = -13, UnfinishedDnode = -14, InvalidDnodeType = -15, InvalidPenDnode = -16, InvalidNonPenDnode = -17, InvalidBaselinePenDnode = -18, InvalidFormatterResult = -19, InvalidObjectIdFetched = -20, InvalidDcpFetched = -21, InvalidCpContentFetched = -22, InvalidBookmarkType = -23, SetDocDisabled = -24, FiniFunctionDisabled = -25, CurrentDnodeIsNotTab = -26, PendingTabIsNotResolved = -27, WrongFiniFunction = -28, InvalidBreakingClass = -29, BreakingTableNotSet = -30, InvalidModWidthClass = -31, ModWidthPairsNotSet = -32, WrongTruncationPoint = -33, WrongBreak = -34, DupInvalid = -35, RubyInvalidVersion = -36, TatenakayokoInvalidVersion = -37, WarichuInvalidVersion = -38, WarichuInvalidData = -39, CreateSublineDisabled = -40, CurrentSublineDoesNotExist = -41, CpOutsideSubline = -42, HihInvalidVersion = -43, InsufficientQueryDepth = -44, InvalidBreakRecord = -45, InvalidPap = -46, ContradictoryQueryInput = -47, LineIsNotActive = -48, TooLongParagraph = -49, TooManyCharsToGlyph = -50, WrongHyphenationPosition = -51, TooManyPriorities = -52, WrongGivenCp = -53, WrongCpFirstForGetBreaks = -54, WrongJustTypeForGetBreaks = -55, WrongJustTypeForCreateLineGivenCp = -56, TooLongGlyphContext = -57, InvalidCharToGlyphMapping = -58, InvalidMathUsage = -59, InconsistentChp = -60, StoppedInSubline = -61, PenPositionCouldNotBeUsed = -62, DebugFlagsInShip = -63, InvalidOrderTabs = -64, OutputArrayTooSmall = -110, SystemRestrictionsExceeded = -100, LsInternalError = -1000, NotImplemented = -10000, ClientAbort = -100000, } // // Line Services structures // // [StructLayout(LayoutKind.Sequential)] internal struct LSPOINT { public LSPOINT(int horizontalPosition, int verticalPosition) { x = horizontalPosition; y = verticalPosition; } public int x; public int y; } [StructLayout(LayoutKind.Sequential)] internal struct LSRECT { public int left; public int top; public int right; public int bottom; internal LSRECT(int x1, int y1, int x2, int y2) { left = x1; top = y1; right = x2; bottom = y2; } } [StructLayout(LayoutKind.Sequential)] internal struct LSSIZE { public int width; public int height; } [StructLayout(LayoutKind.Sequential)] internal struct EscStringInfo { public IntPtr szParaSeparator; public IntPtr szLineSeparator; public IntPtr szHidden; public IntPtr szNbsp; public IntPtr szObjectTerminator; public IntPtr szObjectReplacement; } [StructLayout(LayoutKind.Sequential)] internal struct ObjDim { public LsHeights heightsRef; public LsHeights heightsPres; public int dur; } [StructLayout(LayoutKind.Sequential)] internal struct LsTbd { public LsKTab lskt; public int ur; [MarshalAs(UnmanagedType.U2)] public char wchTabLeader; [MarshalAs(UnmanagedType.U2)] public char wchCharTab; } [StructLayout(LayoutKind.Sequential)] internal struct LsTabs { public int durIncrementalTab; public int iTabUserDefMac; public IntPtr plsTbd; } [StructLayout(LayoutKind.Sequential)] internal struct LsULInfo { public uint kulBase; public int cNumberOfLines; public int dvpUnderlineOriginOffset; public int dvpFirstUnderlineOffset; public int dvpFirstUnderlineSize; public int dvpGapBetweenLines; public int dvpSecondUnderlineSize; } [StructLayout(LayoutKind.Sequential)] internal struct LsStInfo { public uint kstBase; public int cNumberOfLines; public int dvpLowerStrikethroughOffset; public int dvpLowerStrikethroughSize; public int dvpUpperStrikethroughOffset; public int dvpUpperStrikethroughSize; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct LsHyph { public LsKysr kysr; public char wchYsr; public char wchYsr2; public LsHyphenQuality lshq; } // Installed object handler methods ////// Critical - as this structure points to several callbacks that'll be /// invoked from unmanaged code. Marked all members Critical. /// Just putting the SecurityNote on the top instead of on every /// member. /// [StructLayout(LayoutKind.Sequential)] internal struct LsIMethods { [SecurityCritical] public IntPtr pfnCreateILSObj; [SecurityCritical] public IntPtr pfnDestroyILSObj; [SecurityCritical] public IntPtr pfnSetDoc; [SecurityCritical] public IntPtr pfnCreateLNObj; [SecurityCritical] public IntPtr pfnDestroyLNObj; [SecurityCritical] public IntPtr pfnFmt; [SecurityCritical] public IntPtr pfnFmtResume; [SecurityCritical] public IntPtr pfnGetModWidthPrecedingChar; [SecurityCritical] public IntPtr pfnGetModWidthFollowingChar; [SecurityCritical] public IntPtr pfnTruncate; [SecurityCritical] public IntPtr pfnFindPrevBreakOppInside; [SecurityCritical] public IntPtr pfnFindNextBreakOppInside; [SecurityCritical] public IntPtr pfnFindBreakOppBeforeCpTruncate; [SecurityCritical] public IntPtr pfnFindBreakOppAfterCpTruncate; [SecurityCritical] public IntPtr pfnCreateStartOppInside; [SecurityCritical] public IntPtr pfnProposeBreakAfter; [SecurityCritical] public IntPtr pfnProposeBreakBefore; [SecurityCritical] public IntPtr pfnCreateBreakOppAfter; [SecurityCritical] public IntPtr pfnCreateStartOppBefore; [SecurityCritical] public IntPtr pfnCreateDobjFragment; [SecurityCritical] public IntPtr pfnForceBreak; [SecurityCritical] public IntPtr pfnCreateBreakRecord; [SecurityCritical] public IntPtr pfnSetBreak; [SecurityCritical] public IntPtr pfnDestroyStartOpp; [SecurityCritical] public IntPtr pfnDestroyBreakOpp; [SecurityCritical] public IntPtr pfnDuplicateBreakRecord; [SecurityCritical] public IntPtr pfnDestroyBreakRecord; [SecurityCritical] public IntPtr pfnGetSpecialEffectsFromDobj; [SecurityCritical] public IntPtr pfnGetSpecialEffectsFromDobjFragment; [SecurityCritical] public IntPtr pfnGetSubmissionInfoFromDobj; [SecurityCritical] public IntPtr pfnGetSublinesFromDobj; [SecurityCritical] public IntPtr pfnGetSubmissionInfoFromDobjFragment; [SecurityCritical] public IntPtr pfnGetSubsFromDobjFragment; [SecurityCritical] public IntPtr pfnFExpandWithPrecedingChar; [SecurityCritical] public IntPtr pfnFExpandWithFollowingChar; [SecurityCritical] public IntPtr pfnCalcPresentation; [SecurityCritical] public IntPtr pfnQueryPointPcp; [SecurityCritical] public IntPtr pfnQueryCpPpoint; [SecurityCritical] public IntPtr pfnEnum; [SecurityCritical] public IntPtr pfnDisplay; [SecurityCritical] public IntPtr pfnDestroyDobj; [SecurityCritical] public IntPtr pfnDestroyDobjFragment; } ////// Small set of callbacks that are slightly different from its correspondent original /// LS callbacks due to logistics of managed code callback interop with LS. /// ////// Critical - as this structure points to several callbacks that'll be /// invoked from unmanaged code. Marked all function pointer /// members Critical. /// /// Just putting the SecurityNote on the top instead of on every /// member. /// [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct LscbkRedefined { [SecurityCritical] public FetchRunRedefined pfnFetchRunRedefined; [SecurityCritical] public GetGlyphsRedefined pfnGetGlyphsRedefined; [SecurityCritical] public FetchLineProps pfnFetchLineProps; } // Context info (LSCONTEXTINFO) ////// Critical - as this structure points to several callbacks that'll be /// invoked from unmanaged code. Marked all function pointer /// members Critical. /// /// Just putting the SecurityNote on the top instead of on every /// member. /// [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal unsafe struct LsContextInfo { public uint version; // version number public int cInstalledHandlers; // total installed object handlers public IntPtr plsimethods; // array of installed objects LSIMETHODS // Text config (LSTXTCFG) public int cEstimatedCharsPerLine; // used for input array size for all four FullMixed justification callbacks (cPriorityLevelMax) public int cJustPriorityLim; public char wchUndef; public char wchNull; public char wchSpace; public char wchHyphen; public char wchTab; public char wchPosTab; public char wchEndPara1; public char wchEndPara2; public char wchAltEndPara; public char wchEndLineInPara; public char wchColumnBreak; public char wchSectionBreak; public char wchPageBreak; public char wchNonBreakSpace; public char wchNonBreakHyphen; public char wchNonReqHyphen; public char wchEmDash; public char wchEnDash; public char wchEmSpace; public char wchEnSpace; public char wchNarrowSpace; public char wchOptBreak; public char wchNoBreak; public char wchFESpace; public char wchJoiner; public char wchNonJoiner; public char wchToReplace; public char wchReplace; public char wchVisiNull; public char wchVisiAltEndPara; public char wchVisiEndLineInPara; public char wchVisiEndPara; public char wchVisiSpace; public char wchVisiNonBreakSpace; public char wchVisiNonBreakHyphen; public char wchVisiNonReqHyphen; public char wchVisiTab; public char wchVisiPosTab; public char wchVisiEmSpace; public char wchVisiEnSpace; public char wchVisiNarrowSpace; public char wchVisiOptBreak; public char wchVisiNoBreak; public char wchVisiFESpace; public char wchEscAnmRun; public char wchPad; // More LSCONTEXTINFO public IntPtr pols; // Opaque client object // Memory management on unmanaged heap [SecurityCritical] public IntPtr pfnNewPtr; [SecurityCritical] public IntPtr pfnDisposePtr; [SecurityCritical] public IntPtr pfnReallocPtr; // General application callbacks [SecurityCritical] public IntPtr pfnFetchRun; [SecurityCritical] public GetAutoNumberInfo pfnGetAutoNumberInfo; [SecurityCritical] public IntPtr pfnGetNumericSeparators; [SecurityCritical] public IntPtr pfnCheckForDigit; [SecurityCritical] public FetchPap pfnFetchPap; [SecurityCritical] public FetchLineProps pfnFetchLineProps; [SecurityCritical] public IntPtr pfnFetchTabs; [SecurityCritical] public IntPtr pfnReleaseTabsBuffer; [SecurityCritical] public IntPtr pfnGetBreakThroughTab; [SecurityCritical] public IntPtr pfnGetPosTabProps; [SecurityCritical] public IntPtr pfnFGetLastLineJustification; [SecurityCritical] public IntPtr pfnCheckParaBoundaries; [SecurityCritical] public GetRunCharWidths pfnGetRunCharWidths; [SecurityCritical] public IntPtr pfnCheckRunKernability; [SecurityCritical] public IntPtr pfnGetRunCharKerning; [SecurityCritical] public GetRunTextMetrics pfnGetRunTextMetrics; [SecurityCritical] public GetRunUnderlineInfo pfnGetRunUnderlineInfo; [SecurityCritical] public GetRunStrikethroughInfo pfnGetRunStrikethroughInfo; [SecurityCritical] public IntPtr pfnGetBorderInfo; [SecurityCritical] public IntPtr pfnReleaseRun; [SecurityCritical] public IntPtr pfnReleaseRunBuffer; [SecurityCritical] public Hyphenate pfnHyphenate; [SecurityCritical] public GetPrevHyphenOpp pfnGetPrevHyphenOpp; [SecurityCritical] public GetNextHyphenOpp pfnGetNextHyphenOpp; [SecurityCritical] public IntPtr pfnGetHyphenInfo; [SecurityCritical] public DrawUnderline pfnDrawUnderline; [SecurityCritical] public DrawStrikethrough pfnDrawStrikethrough; [SecurityCritical] public IntPtr pfnDrawBorder; [SecurityCritical] public IntPtr pfnFInterruptUnderline; [SecurityCritical] public IntPtr pfnFInterruptShade; [SecurityCritical] public IntPtr pfnFInterruptBorder; [SecurityCritical] public IntPtr pfnShadeRectangle; [SecurityCritical] public DrawTextRun pfnDrawTextRun; [SecurityCritical] public IntPtr pfnDrawSplatLine; [SecurityCritical] public FInterruptShaping pfnFInterruptShaping; [SecurityCritical] public IntPtr pfnGetGlyphs; [SecurityCritical] public GetGlyphPositions pfnGetGlyphPositions; [SecurityCritical] public DrawGlyphs pfnDrawGlyphs; [SecurityCritical] public IntPtr pfnReleaseGlyphBuffers; [SecurityCritical] public IntPtr pfnGetGlyphExpansionInfo; [SecurityCritical] public IntPtr pfnGetGlyphExpansionInkInfo; [SecurityCritical] public IntPtr pfnGetGlyphRunInk; [SecurityCritical] public IntPtr pfnGetEms; [SecurityCritical] public IntPtr pfnPunctStartLine; [SecurityCritical] public IntPtr pfnModWidthOnRun; [SecurityCritical] public IntPtr pfnModWidthSpace; [SecurityCritical] public IntPtr pfnCompOnRun; [SecurityCritical] public IntPtr pfnCompWidthSpace; [SecurityCritical] public IntPtr pfnExpOnRun; [SecurityCritical] public IntPtr pfnExpWidthSpace; [SecurityCritical] public IntPtr pfnGetModWidthClasses; [SecurityCritical] public IntPtr pfnGetBreakingClasses; [SecurityCritical] public IntPtr pfnFTruncateBefore; [SecurityCritical] public IntPtr pfnCanBreakBeforeChar; [SecurityCritical] public IntPtr pfnCanBreakAfterChar; [SecurityCritical] public IntPtr pfnFHangingPunct; [SecurityCritical] public IntPtr pfnGetSnapGrid; [SecurityCritical] public IntPtr pfnDrawEffects; [SecurityCritical] public IntPtr pfnFCancelHangingPunct; [SecurityCritical] public IntPtr pfnModifyCompAtLastChar; [SecurityCritical] public GetDurMaxExpandRagged pfnGetDurMaxExpandRagged; [SecurityCritical] public GetCharExpansionInfoFullMixed pfnGetCharExpansionInfoFullMixed; [SecurityCritical] public GetGlyphExpansionInfoFullMixed pfnGetGlyphExpansionInfoFullMixed; [SecurityCritical] public GetCharCompressionInfoFullMixed pfnGetCharCompressionInfoFullMixed; [SecurityCritical] public GetGlyphCompressionInfoFullMixed pfnGetGlyphCompressionInfoFullMixed; [SecurityCritical] public IntPtr pfnGetCharAlignmentStartLine; [SecurityCritical] public IntPtr pfnGetCharAlignmentEndLine; [SecurityCritical] public IntPtr pfnGetGlyphAlignmentStartLine; [SecurityCritical] public IntPtr pfnGetGlyphAlignmentEndLine; [SecurityCritical] public IntPtr pfnGetPriorityForGoodTypography; [SecurityCritical] public EnumText pfnEnumText; [SecurityCritical] public EnumTab pfnEnumTab; [SecurityCritical] public IntPtr pfnEnumPen; [SecurityCritical] public GetObjectHandlerInfo pfnGetObjectHandlerInfo; // Debugging [SecurityCritical] public IntPtr pfnAssertFailedPtr; // Even more LSCONTEXTINFO public int fDontReleaseRuns; } // Presentation/Rendering device resolutions (LSDEVRES) [StructLayout(LayoutKind.Sequential)] internal struct LsDevRes { public uint dxpInch; public uint dypInch; public uint dxrInch; public uint dyrInch; } // Presentation/Rendering device resolutions (LSDEVRES) [StructLayout(LayoutKind.Sequential)] internal struct LsLInfo { public int dvpAscent; public int dvrAscent; public int dvpDescent; public int dvrDescent; public int dvpMultiLineHeight; public int dvrMultiLineHeight; public int dvpAscentAutoNumber; public int dvrAscentAutoNumber; public int dvpDescentAutoNumber; public int dvrDescentAutoNumber; public int cpLimToContinue; public int cpLimToStay; public int dcpDepend; public int cpFirstVis; public LsEndRes endr; public int fAdvanced; public int vaAdvance; public int fFirstLineInPara; public int fTabInMarginExLine; public int fForcedBreak; public uint EffectsFlags; } [StructLayout(LayoutKind.Sequential)] internal struct LsBreakRecSubl { public int lscpFetch; public int idobj; public IntPtr pbreakrecobj; } // Paragraph Properties (LSPAP) // Returned to LS thru FetchPap, called upon LsCreateLine. [StructLayout(LayoutKind.Sequential)] internal struct LsPap { public int cpFirst; // First CP public int cpFirstContent; // First content CP [Flags] public enum Flags : uint { None = 0, // Visi flags fFmiVisiCondHyphens = 0x00000001, fFmiVisiParaMarks = 0x00000002, fFmiVisiSpaces = 0x00000004, fFmiVisiTabs = 0x00000008, fFmiVisiSplats = 0x00000010, fFmiVisiBreaks = 0x00000020, // Advanced typography fFmiApplyBreakingRules = 0x00000040, fFmiApplyOpticalAlignment = 0x00000080, fFmiPunctStartLine = 0x00000100, fFmiHangingPunct = 0x00000200, // WYSIWYG flags fFmiPresSuppressWiggle = 0x00000400, fFmiPresExactSync = 0x00000800, // AutoNumbering flags fFmiAnm = 0x00001000, // Misc. fFmiAutoDecimalTab = 0x00002000, fFmiUnderlineTrailSpacesRM = 0x00004000, fFmiSpacesInfluenceHeight = 0x00008000, fFmiIgnoreSplatBreak = 0x00010000, fFmiLimSplat = 0x00020000, fFmiAllowSplatLine = 0x00040000, fFmiForceBreakAsNext = 0x00080000, fFmiAllowHyphenation = 0x00100000, fFmiDrawInCharCodes = 0x00200000, fFmiTreatHyphenAsRegular = 0x00400000, fFmiWrapTrailingSpaces = 0x00800000, fFmiWrapAllSpaces = 0x01000000, // Compatibility flags for bugs in older versions of Word fFmiFCheckTruncateBefore = 0x02000000, fFmiForgetLastTabAlignment = 0x10000000, fFmiIndentChangesHyphenZone = 0x20000000, fFmiNoPunctAfterAutoNumber = 0x40000000, fFmiResolveTabsAsWord97 = 0x80000000, } public Flags grpf; public LsBreakJust lsbrj; public LsKJust lskj; public int fJustify; public int durAutoDecimalTab; public LsKEOP lskeop; public LsTFlow lstflow; } // Line properties // Returned to LS thru FetchLineProps [StructLayout(LayoutKind.Sequential)] internal struct LsLineProps { public LsKAlign lskal; // Alignment type public int durLeft; // Left line boundary public int durRightBreak; // Right linebreak boundary public int durRightJustify; // Right justification boundary public int fProhibitHyphenation; // prohibit hyphenation on this line? public int durHyphenationZone; // hyphenation zone for non-optimal breaking } // Charater properties (LsChp) // Returned to LS thru FetchRun [StructLayout(LayoutKind.Sequential)] internal struct LsChp { public ushort idObj; public ushort dcpMaxContent; public uint effectsFlags; [Flags] public enum Flags : uint { None = 0, fApplyKern = 0x0001, fModWidthOnRun = 0x0002, fModWidthSpace = 0x0004, fModWidthPairs = 0x0008, fCompressOnRun = 0x0010, fCompressSpace = 0x0020, fCompressTable = 0x0040, fExpandOnRun = 0x0080, fExpandSpace = 0x0100, fExpandTable = 0x0200, fGlyphBased = 0x0400, // 5 bits of padding to align to next word fInvisible = 0x00010000, fUnderline = 0x00020000, fStrike = 0x00040000, fShade = 0x00080000, fBorder = 0x00100000, fSymbol = 0x00200000, fHyphen = 0x00400000, // Hyphenation opportunity (YSR info) fCheckForReplaceChar = 0x00800000, // Activate the replace char mechanizm for Yen // 8 bits of padding } public Flags flags; // bitfields public int dvpPos; } // TextMetrics (LSTXM) // Returned to LS by GetRunTextMetrics [StructLayout(LayoutKind.Sequential)] internal struct LsTxM { public int dvAscent; public int dvDescent; public int dvMultiLineHeight; public int fMonospaced; // BOOL } // Heights (heights) // Input parameter to DrawTextRun [StructLayout(LayoutKind.Sequential)] internal struct LsHeights { public int dvAscent; public int dvDescent; public int dvMultiLineHeight; } [StructLayout(LayoutKind.Sequential)] internal struct LsQSubInfo { public LsTFlow lstflowSubLine; public int lscpFirstSubLine; public int lsdcpSubLine; public LSPOINT pointUvStartSubLine; public LsHeights lsHeightsPresSubLine; public int dupSubLine; public uint idobj; public IntPtr plsrun; public int lscpFirstRun; public int lsdcpRun; public LSPOINT pointUvStartRun; public LsHeights lsHeightsPresRun; public int dupRun; public int dvpPosRun; public int dupBorderBefore; public int dupBorderAfter; public LSPOINT pointUvStartObj; public LsHeights lsHeightsPresObj; public int dupObj; } [StructLayout(LayoutKind.Sequential)] internal struct LsTextCell { public int lscpStartCell; public int lscpEndCell; public LSPOINT pointUvStartCell; public int dupCell; public int cCharsInCell; public int cGlyphsInCell; public IntPtr plsCellDetails; // client-defined structure } [StructLayout(LayoutKind.Sequential)] internal struct LsLineWidths { public int upStartMarker; // column start to marker start public int upLimMarker; // column start to marker end public int upStartMainText; // column start to main text start public int upStartTrailing; // column start to trailing space start public int upLimLine; // column start to line end public int upMinStartTrailing; // the smallest upStartTrailing possible public int upMinLimLine; // the smallest upLimLine possible } [StructLayout(LayoutKind.Sequential)] internal unsafe struct LsBreaks { public int cBreaks; // number of total breaks public LsLInfo* plslinfoArray; // array of LSLINFO structs, each per each break public IntPtr* plinepenaltyArray; // array of unsafe handle to TSLINEPENALITYINFO struct, each per each break public IntPtr* pplolineArray; // array of unsafe handle to Loline struct, each per each break } [StructLayout(LayoutKind.Sequential)] internal struct LsNeighborInfo { public uint fNeighborIsPresent; public uint fNeighborIsText; public Plsrun plsrun; [MarshalAs(UnmanagedType.U2)] public char wch; public uint fGlyphBased; public CharacterShapingProperties chprop; public ushort gindex; public GlyphShapingProperties gprop; } [StructLayout(LayoutKind.Sequential)] internal unsafe struct LsGlyphRunInfo { public Plsrun plsrun; public char* pwch; // array of character codes public ushort* rggmap; // wchar->glyph mapping public CharacterShapingProperties* rgchprop; // array of char properties as returned by GetGlyphs public int cwch; // number of characters public int duChangeRight; // nominal-to-ideal changes on the right side of the run public ushort* rggindex; // glyph indices public GlyphShapingProperties* rggprop; // array of glyph properties as returned by GetGlyphs public int* rgduWidth; // array of glyph widths as returned by GetGlypPositions public GlyphOffset* rggoffset; // array of glyph offset as returned by GetGlypPositions public int cgindex; // number of glyphs } [StructLayout(LayoutKind.Sequential)] internal unsafe struct LsCharRunInfo { public Plsrun plsrun; public char* pwch; // array of character codes public int* rgduNominalWidth; // array of nominal widths public int* rgduChangeLeft; // array of nominal-to-ideal changes on the left side public int* rgduChangeRight; // array of nominal-to-ideal changes on the right side public int cwch; // number of characters } // // Custom object handler structures // // ////// Critical - as this structure points to several callbacks that'll be /// invoked from unmanaged code. Marked all members Critical. /// Just putting the SecurityNote on the top instead of on every /// member. /// [StructLayout(LayoutKind.Sequential)] internal struct InlineInit { public uint dwVersion; [SecurityCritical] public InlineFormat pfnFormat; [SecurityCritical] public InlineDraw pfnDraw; } ////// Line Services computational constants /// internal static partial class Constants { public const int InfiniteWidth = 0x3FFFFFFE; public const double DefaultRealToIdeal = 28800.0 / 96; public const double DefaultIdealToReal = 1 / DefaultRealToIdeal; // A reasonable maximum interword spacing for normal text is half an em // while a good average is a third of em. // A reasonable minimum interword spacing for normal text is a fifth of em // while a good average is a quarter of em. // // [Robert Bringhurst "The Elements of Typographic Style" p.26] public const double MinInterWordCompressionPerEm = 0.2; public const double MaxInterWordExpansionPerEm = 0.5; // According to Knuth, the linebreak that results in a line with stretchability // 4.7 or greater is considered awful and should be thrown away from the optimal // calculation. // // Stretchability (S) is the value proportion of the expandable excess width in // the line and the maximum expansion allowed. S <= 1 is considered a 'good' // linebreak. 1 < S < 4.7 is kinda bad but still considered acceptable, and // S >= 4.7 is just plain awful and should never be chosen. // // PTLS allows for multiple layers of expansion insertion. We define the first // layer to be for 'good' break, which by definition max out at 1.0 stretchability. // The second layout is defined as 'acceptable' break and max out at an addition of // 2.0. The third layer is defined as 'bad'. It is at this layer where we start to // distribute expansion between letters (inter-letter expansion). This layer max // out at infinity. The value defined below is the max out stretchability of the // second layer. This means we are saying - we'll start inter-letter distribution // for a break which yields the line with stretchability greater than 3.0. Thus, a // line with inter-letter expansion may be accepted within an optimal paragraph // calculation only if it has stretchability >= 3.0 but < 4.7. // // So, just to give an idea of how difference a line with S = 1.0 and S = 4.7 is in // Knuth's calculation; the badness of the line is the power of six of its stretchability // value. Line with greater stretchability is significantly worse than one with smaller value. // // For more detail on the badness calculation; see the "Optimal Paragraph" design spec // http://team/sites/Avalon/Specs/Optimal%20Paragraph.doc. public const int AcceptableLineStretchability = 2; // Minimum number of characters before and after the current position to // be analyzed by the lexical service component such as hyphenation or // word-break and cached so future call within the same character range // can be done efficiently. // // Making these numbers too small would result in more cache miss during // line-breaking. Making it too great wastes memory. public const int MinCchToCacheBeforeAndAfter = 16; } ////// Helper functions to convert to and from LS enum values /// internal sealed class Convert { // Helper class not instantiable private Convert() {} ////// From LsTFlow to FlowDirection /// public static FlowDirection LsTFlowToFlowDirection(LsTFlow lstflow) { switch (lstflow) { //case LsTFlow.lstflowDefault: case LsTFlow.lstflowES: case LsTFlow.lstflowEN: return FlowDirection.LeftToRight; case LsTFlow.lstflowWS: case LsTFlow.lstflowWN: return FlowDirection.RightToLeft; // vertical flow is not supported case LsTFlow.lstflowSE: case LsTFlow.lstflowSW: case LsTFlow.lstflowNE: case LsTFlow.lstflowNW: break; } return FlowDirection.LeftToRight; } ////// From TabAlignment to LsKTab /// public static LsKTab LsKTabFromTabAlignment(TextTabAlignment tabAlignment) { switch (tabAlignment) { case TextTabAlignment.Right: return LsKTab.lsktRight; case TextTabAlignment.Center: return LsKTab.lsktCenter; case TextTabAlignment.Character: return LsKTab.lsktChar; } return LsKTab.lsktLeft; } } // // Line Services exported functions // // ////// /// This is a meta security comment for all the native functions in this class. /// /// Line services does not do any security critical operations as such. All it does /// really is to compute the layout information. What's unsecure is the design pattern /// that involves a chat'ty interface with unmanaged code. /// /// All the native functions that call into the line services code take a context, /// usually PLOC, as a parameter. This is opaque to the managed code and is handled /// as an IntPtr. Since the memory pointed to by this parameter can be written to /// by the line services code, all these native methods are considered Unsafe. /// /// There may be other parameters too that'll be written to directly by LS code /// but these will be appropriately marked Critical or validated when the function /// is called. /// /// See PTSInPartialTrust.mht in the framework\ms\internal\ptshost directory that /// explains the design philosophy. All of it applies to LineServices code also. /// /// internal static class UnsafeNativeMethods { ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCreateContext")] internal static extern LsErr LoCreateContext( ref LsContextInfo contextInfo, // const ref LscbkRedefined lscbkRedef, out IntPtr ploc ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDestroyContext")] internal static extern LsErr LoDestroyContext( IntPtr ploc ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCreateLine")] internal static extern LsErr LoCreateLine( IntPtr ploc, int cp, int ccpLim, int durColumn, uint dwLineFlags, IntPtr pInputBreakRec, out LsLInfo plslinfo, out IntPtr pploline, out int maxDepth, out LsLineWidths lineWidths ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDisposeLine")] internal static extern LsErr LoDisposeLine( IntPtr ploline, [MarshalAs(UnmanagedType.Bool)] bool finalizing ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoAcquireBreakRecord")] internal static extern LsErr LoAcquireBreakRecord( IntPtr ploline, out IntPtr pbreakrec ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDisposeBreakRecord")] internal static extern LsErr LoDisposeBreakRecord( IntPtr pBreakRec, [MarshalAs(UnmanagedType.Bool)] bool finalizing ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCloneBreakRecord")] internal static extern LsErr LoCloneBreakRecord( IntPtr pBreakRec, out IntPtr pBreakRecClone ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoRelievePenaltyResource")] internal static extern LsErr LoRelievePenaltyResource( IntPtr ploline ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoSetBreaking")] internal static extern LsErr LoSetBreaking( IntPtr ploc, int strategy ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoSetDoc")] internal static extern LsErr LoSetDoc( IntPtr ploc, int isDisplay, int isReferencePresentationEqual, ref LsDevRes deviceInfo ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoSetTabs")] internal static unsafe extern LsErr LoSetTabs( IntPtr ploc, int durIncrementalTab, int tabCount, LsTbd* pTabs ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDisplayLine")] internal static extern LsErr LoDisplayLine( IntPtr ploline, ref LSPOINT pt, uint displayMode, ref LSRECT clipRect ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoEnumLine")] internal static extern LsErr LoEnumLine( IntPtr ploline, bool reverseOder, bool fGeometryneeded, ref LSPOINT pt ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoQueryLineCpPpoint")] internal static extern LsErr LoQueryLineCpPpoint( IntPtr ploline, int lscpQuery, int depthQueryMax, IntPtr pSubLineInfo, // passing raw pinned pointer for out array out int actualDepthQuery, out LsTextCell lsTextCell ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoQueryLinePointPcp")] internal static extern LsErr LoQueryLinePointPcp( IntPtr ploline, ref LSPOINT ptQuery, // use POINT as POINTUV int depthQueryMax, IntPtr pSubLineInfo, // passing raw pinned pointer for out array out int actualDepthQuery, out LsTextCell lsTextCell ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCreateBreaks")] internal static extern LsErr LoCreateBreaks( IntPtr ploc, // Line Services context int cpFirst, IntPtr previousBreakRecord, IntPtr ploparabreak, IntPtr ptslinevariantRestriction, ref LsBreaks lsbreaks, out int bestFitIndex ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoCreateParaBreakingSession")] internal static extern LsErr LoCreateParaBreakingSession( IntPtr ploc, // Line Services context int cpParagraphFirst, int maxWidth, IntPtr previousParaBreakRecord, ref IntPtr pploparabreak, [MarshalAs(UnmanagedType.Bool)] ref bool fParagraphJustified ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LoDisposeParaBreakingSession")] internal static extern LsErr LoDisposeParaBreakingSession( IntPtr ploparabreak, [MarshalAs(UnmanagedType.Bool)] bool finalizing ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint="LocbkGetObjectHandlerInfo")] internal unsafe static extern LsErr LocbkGetObjectHandlerInfo( IntPtr ploc, // Line Services context uint objectId, // installed object id void* objectInfo // object handler info ); ////// Critical - as this calls a function with SUC on it. /// Safe - as this just fills a data structure. /// /// We need to do this wrapper for the TAS to work correctly with enforcement. /// [SecurityCritical, SecurityTreatAsSafe] internal static void LoGetEscString( ref EscStringInfo escStringInfo) { LoGetEscStringImpl(ref escStringInfo); } ////// Critical - as this code performs an elevation. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoGetEscString")] private static extern void LoGetEscStringImpl( ref EscStringInfo escStringInfo ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoAcquirePenaltyModule")] internal static extern LsErr LoAcquirePenaltyModule( IntPtr ploc, // Line Services context out IntPtr penaltyModuleHandle ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoDisposePenaltyModule")] internal static extern LsErr LoDisposePenaltyModule( IntPtr penaltyModuleHandle ); ////// Critical - as there is an elevation - SuppressUnmanagedCodeSecurity. /// [SecurityCritical] [SuppressUnmanagedCodeSecurity, DllImport(Microsoft.Internal.DllImport.PresentationNative, EntryPoint = "LoGetPenaltyModuleInternalHandle")] internal static extern LsErr LoGetPenaltyModuleInternalHandle( IntPtr penaltyModuleHandle, out IntPtr penaltyModuleInternalHandle ); } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Primitive.cs
- DefaultParameterValueAttribute.cs
- TheQuery.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- TagMapInfo.cs
- CommandCollectionEditor.cs
- SecurityCriticalDataForSet.cs
- XPathNavigatorKeyComparer.cs
- BrowserDefinition.cs
- PageThemeBuildProvider.cs
- FreezableDefaultValueFactory.cs
- EntityDataSourceWrapper.cs
- MenuEventArgs.cs
- HitTestParameters.cs
- RecordsAffectedEventArgs.cs
- LineInfo.cs
- ModuleElement.cs
- SchemaCreator.cs
- QuaternionRotation3D.cs
- ResolveCriteriaApril2005.cs
- DropTarget.cs
- PrintDialog.cs
- PersistenceProviderBehavior.cs
- ChtmlTextWriter.cs
- RootBuilder.cs
- TextFormatterHost.cs
- MessagePropertyAttribute.cs
- TreeNodeStyle.cs
- CompositeCollectionView.cs
- OneToOneMappingSerializer.cs
- DragDeltaEventArgs.cs
- SystemIPInterfaceProperties.cs
- WorkflowApplicationException.cs
- PeerHopCountAttribute.cs
- TextServicesContext.cs
- ApplicationDirectory.cs
- MetadataArtifactLoaderCompositeResource.cs
- ParseChildrenAsPropertiesAttribute.cs
- DesignerVerb.cs
- ControlIdConverter.cs
- AmbientLight.cs
- RegexRunnerFactory.cs
- EncoderReplacementFallback.cs
- Accessible.cs
- CodeSnippetCompileUnit.cs
- FormViewAutoFormat.cs
- UIHelper.cs
- CustomAssemblyResolver.cs
- XPathNavigator.cs
- ContextMenuStrip.cs
- JapaneseCalendar.cs
- NetworkCredential.cs
- PointCollection.cs
- CollectionBase.cs
- StateManagedCollection.cs
- DesignerVerb.cs
- MarginCollapsingState.cs
- SqlClientWrapperSmiStream.cs
- ReferenceConverter.cs
- Attachment.cs
- ECDsa.cs
- _FtpControlStream.cs
- bindurihelper.cs
- BinaryConverter.cs
- ColorPalette.cs
- ReachIDocumentPaginatorSerializer.cs
- DataGridViewCellStyle.cs
- ConfigXmlText.cs
- EasingKeyFrames.cs
- ContextDataSourceView.cs
- EditorResources.cs
- Page.cs
- WindowAutomationPeer.cs
- RuntimeEnvironment.cs
- Command.cs
- UInt16Storage.cs
- OracleString.cs
- HeaderUtility.cs
- AttributeEmitter.cs
- WebScriptMetadataMessageEncoderFactory.cs
- IndexedSelectQueryOperator.cs
- InternalsVisibleToAttribute.cs
- LicenseProviderAttribute.cs
- ExpandSegment.cs
- RemoteWebConfigurationHost.cs
- FrameworkTemplate.cs
- Dictionary.cs
- MetadataArtifactLoaderCompositeFile.cs
- WebPartDescription.cs
- SymbolType.cs
- thaishape.cs
- QilTargetType.cs
- ThousandthOfEmRealPoints.cs
- XmlElementAttribute.cs
- LinearGradientBrush.cs
- TextEditorSelection.cs
- HopperCache.cs
- SamlSecurityToken.cs
- SelectionRangeConverter.cs
- OutputCacheSettings.cs