internal unsafe void GetSectionColumnInfo(uint fswdir, int ncol, PTS.FSCOLUMNINFO *pfscolinfo, out int ccol) { ColumnPropertiesGroup columnProperties = new ColumnPropertiesGroup(this.Element); Size pageSize = this._structuralCache.CurrentFormatContext.PageSize; double lineHeightValue = DynamicPropertyReader.GetLineHeightValue(this.Element); Thickness pageMargin = this._structuralCache.CurrentFormatContext.PageMargin; double pageFontSize = (double)this._structuralCache.PropertyOwner.GetValue(TextElement.FontSizeProperty); FontFamily pageFontFamily = (FontFamily)this._structuralCache.PropertyOwner.GetValue(TextElement.FontFamilyProperty); bool finitePage = this._structuralCache.CurrentFormatContext.FinitePage; ccol = ncol; PtsHelper.GetColumnsInfo(columnProperties, lineHeightValue, pageSize.Width - (pageMargin.Left + pageMargin.Right), pageFontSize, pageFontFamily, ncol, pfscolinfo, finitePage); }
internal static unsafe void GetColumnsInfo( ColumnPropertiesGroup columnProperties, double lineHeight, double pageWidth, double pageFontSize, FontFamily pageFontFamily, int cColumns, PTS.FSCOLUMNINFO *pfscolinfo, bool enableColumns) { Debug.Assert(cColumns > 0, "At least one column is required."); double columnWidth; double freeSpace; double gap; double rule = columnProperties.ColumnRuleWidth; GetColumnMetrics(columnProperties, pageWidth, pageFontSize, pageFontFamily, enableColumns, cColumns, ref lineHeight, out columnWidth, out freeSpace, out gap); // Set columns information if (!columnProperties.IsColumnWidthFlexible) { // All columns have the declared width // ColumnGap is flexible and is increased based on ColumnSpaceDistribution policy // (ColumnGap is effectively min) for (int i = 0; i < cColumns; i++) { // Today there is no way to change the default value of ColumnSpaceDistribution. // If column widths are not flexible, always allocate unused space on the right side. pfscolinfo[i].durBefore = TextDpi.ToTextDpi((i == 0) ? 0 : gap); pfscolinfo[i].durWidth = TextDpi.ToTextDpi(columnWidth); // ColumnWidth has to be > 0 and SpaceBefore has to be >= 0 pfscolinfo[i].durBefore = Math.Max(0, pfscolinfo[i].durBefore); pfscolinfo[i].durWidth = Math.Max(1, pfscolinfo[i].durWidth); } } else { // ColumnGap is honored // ColumnWidth is effectively min, and space is distributed according to ColumnSpaceDistribution policy for (int i = 0; i < cColumns; i++) { if (columnProperties.ColumnSpaceDistribution == ColumnSpaceDistribution.Right) { pfscolinfo[i].durWidth = TextDpi.ToTextDpi((i == cColumns - 1) ? columnWidth + freeSpace : columnWidth); } else if (columnProperties.ColumnSpaceDistribution == ColumnSpaceDistribution.Left) { pfscolinfo[i].durWidth = TextDpi.ToTextDpi((i == 0) ? columnWidth + freeSpace : columnWidth); } else { pfscolinfo[i].durWidth = TextDpi.ToTextDpi(columnWidth + (freeSpace / cColumns)); } // If calculated column width is greater than the page width, set it to page width to // avoid clipping if (pfscolinfo[i].durWidth > TextDpi.ToTextDpi(pageWidth)) { pfscolinfo[i].durWidth = TextDpi.ToTextDpi(pageWidth); } pfscolinfo[i].durBefore = TextDpi.ToTextDpi((i == 0) ? 0 : gap); // ColumnWidth has to be > 0 and SpaceBefore has to be >= 0 pfscolinfo[i].durBefore = Math.Max(0, pfscolinfo[i].durBefore); pfscolinfo[i].durWidth = Math.Max(1, pfscolinfo[i].durWidth); } } }
internal unsafe static void GetColumnsInfo(ColumnPropertiesGroup columnProperties, double lineHeight, double pageWidth, double pageFontSize, FontFamily pageFontFamily, int cColumns, PTS.FSCOLUMNINFO *pfscolinfo, bool enableColumns) { double columnRuleWidth = columnProperties.ColumnRuleWidth; double num; double num2; double num3; PtsHelper.GetColumnMetrics(columnProperties, pageWidth, pageFontSize, pageFontFamily, enableColumns, cColumns, ref lineHeight, out num, out num2, out num3); if (!columnProperties.IsColumnWidthFlexible) { for (int i = 0; i < cColumns; i++) { pfscolinfo[i].durBefore = TextDpi.ToTextDpi((i == 0) ? 0.0 : num3); pfscolinfo[i].durWidth = TextDpi.ToTextDpi(num); pfscolinfo[i].durBefore = Math.Max(0, pfscolinfo[i].durBefore); pfscolinfo[i].durWidth = Math.Max(1, pfscolinfo[i].durWidth); } return; } for (int j = 0; j < cColumns; j++) { if (columnProperties.ColumnSpaceDistribution == ColumnSpaceDistribution.Right) { pfscolinfo[j].durWidth = TextDpi.ToTextDpi((j == cColumns - 1) ? (num + num2) : num); } else if (columnProperties.ColumnSpaceDistribution == ColumnSpaceDistribution.Left) { pfscolinfo[j].durWidth = TextDpi.ToTextDpi((j == 0) ? (num + num2) : num); } else { pfscolinfo[j].durWidth = TextDpi.ToTextDpi(num + num2 / (double)cColumns); } if (pfscolinfo[j].durWidth > TextDpi.ToTextDpi(pageWidth)) { pfscolinfo[j].durWidth = TextDpi.ToTextDpi(pageWidth); } pfscolinfo[j].durBefore = TextDpi.ToTextDpi((j == 0) ? 0.0 : num3); pfscolinfo[j].durBefore = Math.Max(0, pfscolinfo[j].durBefore); pfscolinfo[j].durWidth = Math.Max(1, pfscolinfo[j].durWidth); } }