Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / PtsHost / FigureHelper.cs / 1305600 / FigureHelper.cs
//---------------------------------------------------------------------------- // // Copyright (C) Microsoft Corporation. All rights reserved. // // File: FigureHelper.cs // // Description: Helpers for figure formatting // // History: // 02/07/2006 : ghermann - created // //--------------------------------------------------------------------------- #pragma warning disable 1634, 1691 // avoid generating warnings about unknown // message numbers and unknown pragmas for PRESharp contol using System; using System.Windows; using System.Windows.Media; using System.Windows.Documents; using MS.Internal.Text; namespace MS.Internal.PtsHost { // --------------------------------------------------------------------- // Helper services to assist formatting figure // --------------------------------------------------------------------- internal static class FigureHelper { // ------------------------------------------------------------------ // Returns whether a vertical anchor is relative to page // ----------------------------------------------------------------- internal static bool IsVerticalPageAnchor(FigureVerticalAnchor verticalAnchor) { return verticalAnchor == FigureVerticalAnchor.PageTop || verticalAnchor == FigureVerticalAnchor.PageBottom || verticalAnchor == FigureVerticalAnchor.PageCenter; } // ------------------------------------------------------------------ // Returns whether a vertical anchor is relative to content // ------------------------------------------------------------------ internal static bool IsVerticalContentAnchor(FigureVerticalAnchor verticalAnchor) { return verticalAnchor == FigureVerticalAnchor.ContentTop || verticalAnchor == FigureVerticalAnchor.ContentBottom || verticalAnchor == FigureVerticalAnchor.ContentCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to page // ------------------------------------------------------------------ internal static bool IsHorizontalPageAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.PageLeft || horizontalAnchor == FigureHorizontalAnchor.PageRight || horizontalAnchor == FigureHorizontalAnchor.PageCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to content // ----------------------------------------------------------------- internal static bool IsHorizontalContentAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.ContentLeft || horizontalAnchor == FigureHorizontalAnchor.ContentRight || horizontalAnchor == FigureHorizontalAnchor.ContentCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to column // ------------------------------------------------------------------ internal static bool IsHorizontalColumnAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.ColumnLeft || horizontalAnchor == FigureHorizontalAnchor.ColumnRight || horizontalAnchor == FigureHorizontalAnchor.ColumnCenter; } // ----------------------------------------------------------------- // Width figure size calculation // ------------------------------------------------------------------ internal static double CalculateFigureWidth(StructuralCache structuralCache, Figure figure, FigureLength figureLength, out bool isWidthAuto) { double value; isWidthAuto = figureLength.IsAuto ? true : false; // Check figure's horizontal anchor. If anchored to page, use page width to format FigureHorizontalAnchor horizontalAnchor = figure.HorizontalAnchor; if(figureLength.IsPage || (figureLength.IsAuto && IsHorizontalPageAnchor(horizontalAnchor))) { value = structuralCache.CurrentFormatContext.PageWidth * figureLength.Value; } else if (figureLength.IsAbsolute) { value = CalculateFigureCommon(figureLength); } else // figureLength.IsColumn || figureLength.IsContent || figureLength.IsAuto { double columnWidth, gap, rule; int cColumns; GetColumnMetrics(structuralCache, out cColumns, out columnWidth, out gap, out rule); if (figureLength.IsContent || (figureLength.IsAuto && IsHorizontalContentAnchor(horizontalAnchor))) { // Use content width for figure value = (columnWidth * cColumns + gap * (cColumns - 1)) * figureLength.Value; } else // figureLength.IsColumn || figureLength.IsAuto { // We do this to prevent a 2.0 columns from spanning 2.0 + gap, so we just check for edge double lengthValue = figureLength.Value; int columnGapsSpanned = (int) lengthValue; if(columnGapsSpanned == lengthValue && columnGapsSpanned > 0) { columnGapsSpanned -= 1; } value = (columnWidth * lengthValue) + gap * columnGapsSpanned; } } Invariant.Assert(!DoubleUtil.IsNaN(value)); return value; } // ------------------------------------------------------------------ // Height figure size calculation // ----------------------------------------------------------------- internal static double CalculateFigureHeight(StructuralCache structuralCache, Figure figure, FigureLength figureLength, out bool isHeightAuto) { double value; if(figureLength.IsPage) { value = (structuralCache.CurrentFormatContext.PageHeight) * figureLength.Value; } else if(figureLength.IsContent) // Column to be treated same as content { Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; value = (structuralCache.CurrentFormatContext.PageHeight - pageMargin.Top - pageMargin.Bottom) * figureLength.Value; } else if (figureLength.IsColumn) { // Height is calculated based on column width, since column height is the same as content. Per spec. // Retrieve all column metrics for current page int cColumns; double columnWidth; double gap; double rule; FigureHelper.GetColumnMetrics(structuralCache, out cColumns, out columnWidth, out gap, out rule); // We do this to prevent a 2.0 columns from spanning 2.0 + gap, so we just check for edge double lengthValue = figureLength.Value; if (lengthValue > cColumns) { lengthValue = cColumns; } int columnGapsSpanned = (int)lengthValue; if (columnGapsSpanned == lengthValue && columnGapsSpanned > 0) { columnGapsSpanned -= 1; } value = (columnWidth * lengthValue) + gap * columnGapsSpanned; } else { value = FigureHelper.CalculateFigureCommon(figureLength); } if(!DoubleUtil.IsNaN(value)) { FigureVerticalAnchor verticalAnchor = figure.VerticalAnchor; // Value is in pixels. Now we limit value to max out depending on anchoring. if(FigureHelper.IsVerticalPageAnchor(verticalAnchor)) { value = Math.Max(1, Math.Min(value, structuralCache.CurrentFormatContext.PageHeight)); } else // Column and paragraph anchoring still max out at content height { Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; value = Math.Max(1, Math.Min(value, structuralCache.CurrentFormatContext.PageHeight - pageMargin.Top - pageMargin.Bottom)); } TextDpi.EnsureValidPageWidth(ref value); isHeightAuto = false; } else { value = structuralCache.CurrentFormatContext.PageHeight; isHeightAuto = true; } return value; } // ------------------------------------------------------------------ // Common figure size calculation // ----------------------------------------------------------------- internal static double CalculateFigureCommon(FigureLength figureLength) { double value; if(figureLength.IsAuto) { value = Double.NaN; } else if(figureLength.IsAbsolute) { value = figureLength.Value; } else { Invariant.Assert(false, "Unknown figure length type specified."); value = 0.0; } return value; } // ----------------------------------------------------------------- // Returns calculated column information - count, width, gap and rule. // ----------------------------------------------------------------- internal static void GetColumnMetrics(StructuralCache structuralCache, out int cColumns, out double width, out double gap, out double rule) { ColumnPropertiesGroup columnProperties = new ColumnPropertiesGroup(structuralCache.PropertyOwner); FontFamily pageFontFamily = (FontFamily)structuralCache.PropertyOwner.GetValue(Block.FontFamilyProperty); double lineHeight = DynamicPropertyReader.GetLineHeightValue(structuralCache.PropertyOwner); double pageFontSize = (double)structuralCache.PropertyOwner.GetValue(Block.FontSizeProperty); Size pageSize = structuralCache.CurrentFormatContext.PageSize; Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; double pageWidth = pageSize.Width - (pageMargin.Left + pageMargin.Right); cColumns = PtsHelper.CalculateColumnCount(columnProperties, lineHeight, pageWidth, pageFontSize, pageFontFamily, true); double freeSpace; rule = columnProperties.ColumnRuleWidth; PtsHelper.GetColumnMetrics(columnProperties, pageWidth, pageFontSize, pageFontFamily, true, cColumns, ref lineHeight, out width, out freeSpace, out gap); if (columnProperties.IsColumnWidthFlexible && columnProperties.ColumnSpaceDistribution == ColumnSpaceDistribution.Between) { width += freeSpace / cColumns; } width = Math.Min(width, pageWidth); } } } #pragma warning enable 1634, 1691 // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // // Copyright (C) Microsoft Corporation. All rights reserved. // // File: FigureHelper.cs // // Description: Helpers for figure formatting // // History: // 02/07/2006 : ghermann - created // //--------------------------------------------------------------------------- #pragma warning disable 1634, 1691 // avoid generating warnings about unknown // message numbers and unknown pragmas for PRESharp contol using System; using System.Windows; using System.Windows.Media; using System.Windows.Documents; using MS.Internal.Text; namespace MS.Internal.PtsHost { // --------------------------------------------------------------------- // Helper services to assist formatting figure // --------------------------------------------------------------------- internal static class FigureHelper { // ------------------------------------------------------------------ // Returns whether a vertical anchor is relative to page // ----------------------------------------------------------------- internal static bool IsVerticalPageAnchor(FigureVerticalAnchor verticalAnchor) { return verticalAnchor == FigureVerticalAnchor.PageTop || verticalAnchor == FigureVerticalAnchor.PageBottom || verticalAnchor == FigureVerticalAnchor.PageCenter; } // ------------------------------------------------------------------ // Returns whether a vertical anchor is relative to content // ------------------------------------------------------------------ internal static bool IsVerticalContentAnchor(FigureVerticalAnchor verticalAnchor) { return verticalAnchor == FigureVerticalAnchor.ContentTop || verticalAnchor == FigureVerticalAnchor.ContentBottom || verticalAnchor == FigureVerticalAnchor.ContentCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to page // ------------------------------------------------------------------ internal static bool IsHorizontalPageAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.PageLeft || horizontalAnchor == FigureHorizontalAnchor.PageRight || horizontalAnchor == FigureHorizontalAnchor.PageCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to content // ----------------------------------------------------------------- internal static bool IsHorizontalContentAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.ContentLeft || horizontalAnchor == FigureHorizontalAnchor.ContentRight || horizontalAnchor == FigureHorizontalAnchor.ContentCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to column // ------------------------------------------------------------------ internal static bool IsHorizontalColumnAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.ColumnLeft || horizontalAnchor == FigureHorizontalAnchor.ColumnRight || horizontalAnchor == FigureHorizontalAnchor.ColumnCenter; } // ----------------------------------------------------------------- // Width figure size calculation // ------------------------------------------------------------------ internal static double CalculateFigureWidth(StructuralCache structuralCache, Figure figure, FigureLength figureLength, out bool isWidthAuto) { double value; isWidthAuto = figureLength.IsAuto ? true : false; // Check figure's horizontal anchor. If anchored to page, use page width to format FigureHorizontalAnchor horizontalAnchor = figure.HorizontalAnchor; if(figureLength.IsPage || (figureLength.IsAuto && IsHorizontalPageAnchor(horizontalAnchor))) { value = structuralCache.CurrentFormatContext.PageWidth * figureLength.Value; } else if (figureLength.IsAbsolute) { value = CalculateFigureCommon(figureLength); } else // figureLength.IsColumn || figureLength.IsContent || figureLength.IsAuto { double columnWidth, gap, rule; int cColumns; GetColumnMetrics(structuralCache, out cColumns, out columnWidth, out gap, out rule); if (figureLength.IsContent || (figureLength.IsAuto && IsHorizontalContentAnchor(horizontalAnchor))) { // Use content width for figure value = (columnWidth * cColumns + gap * (cColumns - 1)) * figureLength.Value; } else // figureLength.IsColumn || figureLength.IsAuto { // We do this to prevent a 2.0 columns from spanning 2.0 + gap, so we just check for edge double lengthValue = figureLength.Value; int columnGapsSpanned = (int) lengthValue; if(columnGapsSpanned == lengthValue && columnGapsSpanned > 0) { columnGapsSpanned -= 1; } value = (columnWidth * lengthValue) + gap * columnGapsSpanned; } } Invariant.Assert(!DoubleUtil.IsNaN(value)); return value; } // ------------------------------------------------------------------ // Height figure size calculation // ----------------------------------------------------------------- internal static double CalculateFigureHeight(StructuralCache structuralCache, Figure figure, FigureLength figureLength, out bool isHeightAuto) { double value; if(figureLength.IsPage) { value = (structuralCache.CurrentFormatContext.PageHeight) * figureLength.Value; } else if(figureLength.IsContent) // Column to be treated same as content { Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; value = (structuralCache.CurrentFormatContext.PageHeight - pageMargin.Top - pageMargin.Bottom) * figureLength.Value; } else if (figureLength.IsColumn) { // Height is calculated based on column width, since column height is the same as content. Per spec. // Retrieve all column metrics for current page int cColumns; double columnWidth; double gap; double rule; FigureHelper.GetColumnMetrics(structuralCache, out cColumns, out columnWidth, out gap, out rule); // We do this to prevent a 2.0 columns from spanning 2.0 + gap, so we just check for edge double lengthValue = figureLength.Value; if (lengthValue > cColumns) { lengthValue = cColumns; } int columnGapsSpanned = (int)lengthValue; if (columnGapsSpanned == lengthValue && columnGapsSpanned > 0) { columnGapsSpanned -= 1; } value = (columnWidth * lengthValue) + gap * columnGapsSpanned; } else { value = FigureHelper.CalculateFigureCommon(figureLength); } if(!DoubleUtil.IsNaN(value)) { FigureVerticalAnchor verticalAnchor = figure.VerticalAnchor; // Value is in pixels. Now we limit value to max out depending on anchoring. if(FigureHelper.IsVerticalPageAnchor(verticalAnchor)) { value = Math.Max(1, Math.Min(value, structuralCache.CurrentFormatContext.PageHeight)); } else // Column and paragraph anchoring still max out at content height { Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; value = Math.Max(1, Math.Min(value, structuralCache.CurrentFormatContext.PageHeight - pageMargin.Top - pageMargin.Bottom)); } TextDpi.EnsureValidPageWidth(ref value); isHeightAuto = false; } else { value = structuralCache.CurrentFormatContext.PageHeight; isHeightAuto = true; } return value; } // ------------------------------------------------------------------ // Common figure size calculation // ----------------------------------------------------------------- internal static double CalculateFigureCommon(FigureLength figureLength) { double value; if(figureLength.IsAuto) { value = Double.NaN; } else if(figureLength.IsAbsolute) { value = figureLength.Value; } else { Invariant.Assert(false, "Unknown figure length type specified."); value = 0.0; } return value; } // ----------------------------------------------------------------- // Returns calculated column information - count, width, gap and rule. // ----------------------------------------------------------------- internal static void GetColumnMetrics(StructuralCache structuralCache, out int cColumns, out double width, out double gap, out double rule) { ColumnPropertiesGroup columnProperties = new ColumnPropertiesGroup(structuralCache.PropertyOwner); FontFamily pageFontFamily = (FontFamily)structuralCache.PropertyOwner.GetValue(Block.FontFamilyProperty); double lineHeight = DynamicPropertyReader.GetLineHeightValue(structuralCache.PropertyOwner); double pageFontSize = (double)structuralCache.PropertyOwner.GetValue(Block.FontSizeProperty); Size pageSize = structuralCache.CurrentFormatContext.PageSize; Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; double pageWidth = pageSize.Width - (pageMargin.Left + pageMargin.Right); cColumns = PtsHelper.CalculateColumnCount(columnProperties, lineHeight, pageWidth, pageFontSize, pageFontFamily, true); double freeSpace; rule = columnProperties.ColumnRuleWidth; PtsHelper.GetColumnMetrics(columnProperties, pageWidth, pageFontSize, pageFontFamily, true, cColumns, ref lineHeight, out width, out freeSpace, out gap); if (columnProperties.IsColumnWidthFlexible && columnProperties.ColumnSpaceDistribution == ColumnSpaceDistribution.Between) { width += freeSpace / cColumns; } width = Math.Min(width, pageWidth); } } } #pragma warning enable 1634, 1691 // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- WebRequest.cs
- GestureRecognizer.cs
- GridViewColumnCollection.cs
- DataServiceRequestOfT.cs
- ClockController.cs
- EntityCommandExecutionException.cs
- DynamicResourceExtension.cs
- TypeSystem.cs
- ServiceObjectContainer.cs
- SkinBuilder.cs
- ErrorCodes.cs
- SqlParameter.cs
- SchemaType.cs
- SessionStateUtil.cs
- DataList.cs
- AddDataControlFieldDialog.cs
- SevenBitStream.cs
- XamlStyleSerializer.cs
- NavigatorInput.cs
- DataGridTableCollection.cs
- AssociationSetEnd.cs
- ConnectionsZoneAutoFormat.cs
- WindowsStartMenu.cs
- List.cs
- PageVisual.cs
- PageCatalogPart.cs
- CompoundFileDeflateTransform.cs
- HttpFileCollection.cs
- DoubleStorage.cs
- MonthCalendar.cs
- HiddenFieldPageStatePersister.cs
- CharacterMetricsDictionary.cs
- FullTrustAssembly.cs
- TypeDelegator.cs
- SqlTransaction.cs
- DataBindEngine.cs
- ThumbAutomationPeer.cs
- PointKeyFrameCollection.cs
- NameValuePermission.cs
- XamlTypeMapper.cs
- PathFigureCollectionConverter.cs
- ToolStripGripRenderEventArgs.cs
- NativeRightsManagementAPIsStructures.cs
- thaishape.cs
- XmlMessageFormatter.cs
- CompilationUtil.cs
- WebPartConnectionsCloseVerb.cs
- HtmlValidatorAdapter.cs
- AssociationSetEnd.cs
- StrokeFIndices.cs
- DesignConnectionCollection.cs
- SparseMemoryStream.cs
- SecurityStateEncoder.cs
- ReceiveSecurityHeader.cs
- PointAnimation.cs
- ExpandSegment.cs
- OdbcConnectionOpen.cs
- RightsManagementManager.cs
- Cursors.cs
- ImageDrawing.cs
- HttpWebRequestElement.cs
- wgx_sdk_version.cs
- CultureSpecificStringDictionary.cs
- HierarchicalDataTemplate.cs
- ObjectAssociationEndMapping.cs
- XmlElementList.cs
- CellConstant.cs
- HwndHostAutomationPeer.cs
- DataBoundControlActionList.cs
- QueueProcessor.cs
- PartialList.cs
- FormViewRow.cs
- QuaternionRotation3D.cs
- AutomationIdentifier.cs
- ListDictionary.cs
- DataComponentGenerator.cs
- BaseTemplateCodeDomTreeGenerator.cs
- XsdDateTime.cs
- ThreadStaticAttribute.cs
- BaseProcessor.cs
- PackWebResponse.cs
- SR.cs
- AttachedAnnotationChangedEventArgs.cs
- Operand.cs
- Pkcs9Attribute.cs
- BooleanAnimationBase.cs
- CustomErrorsSection.cs
- UnsafeNativeMethods.cs
- HeaderedContentControl.cs
- StateMachine.cs
- ObjectStateEntryDbDataRecord.cs
- TemplateManager.cs
- Validator.cs
- StateMachineWorkflowInstance.cs
- SecurityException.cs
- ErrorStyle.cs
- XamlPathDataSerializer.cs
- AssemblyAssociatedContentFileAttribute.cs
- PolicyVersionConverter.cs
- ToolStripGrip.cs