Contents
The position and size of an element's box(es) are sometimes calculated relative to a certain rectangle, called the containing block of the element. The containing block of an element is defined as follows:
If there is no such ancestor, the containing block is the initial containing block.
In paged media, an absolutely positioned element is positioned relative to its containing block ignoring any page breaks (as if the document were continuous). The element may subsequently be broken over several pages.
For absolutely positioned content that resolves to a position on a page other than the page being laid out (the current page), or resolves to a position on the current page which has already been rendered for printing, printers may place the content
Note that a block-level element that is split over several pages may have a different width on each page and that there may be device-specific limits.
With no positioning, the containing blocks (C.B.) in the following document:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">   <TITLE>Illustration of containing blocks</TITLE>

This is text in the first paragraph...

This is text  in the second paragraph.

are established as follows:
| For box generated by | C.B. is established by |
|---|---|
| html | initial C.B. (UA-dependent) |
| body | html |
| div1 | body |
| p1 | div1 |
| p2 | div1 |
| em1 | p2 |
| strong1 | p2 |
If we position "div1":
#div1 { position: absolute; left: 50px; top: 50px }
its containing block is no longer "body"; it becomes the initial containing block (since there are no other positioned ancestor boxes).
If we position "em1" as well:
#div1 { position: absolute; left: 50px; top: 50px } #em1 { position: absolute; left: 100px; top: 100px }
the table of containing blocks becomes:
| For box generated by | C.B. is established by |
|---|---|
| html | initial C.B. (UA-dependent) |
| body | html |
| div1 | initial C.B. |
| p1 | div1 |
| p2 | div1 |
| em1 | div1 |
| strong1 | em1 |
By positioning "em1", its containing block becomes the nearest positioned ancestor box (i.e., that generated by "div1").
| Value: | <length> | <percentage> | auto | inherit |
| Initial: | auto |
| Applies to: | all elements but non-replaced inline elements, table rows, and row groups |
| Inherited: | no |
| Percentages: | refer to width of containing block |
| Media: | visual |
| Computed value: | the percentage or 'auto' as specified or the absolute length |
This property specifies the content width of boxes.
This property does not apply to non-replaced inline elements. The content width of a non-replaced inline element's boxes is that of the rendered content within them (before any relative offset of children). Recall that inline boxes flow into line boxes. The width of line boxes is given by the their containing block, but may be shorted by the presence of floats.
Values have the following meanings:
Negative values for 'width' are illegal.
For example, the following rule fixes the content width of paragraphs at 100 pixels:
p { width: 100px }
The values of an element's 'width', 'margin-left', 'margin-right', 'left' and 'right' properties as used for layout depend on the type of box generated and on each other. (The value used for layout is sometimes referred to as the used value.) In principle, the values used are the same as the computed values, with 'auto' replaced by some suitable value, and percentages calculated based on the containing block, but there are exceptions. The following situations need to be distinguished:
For Points 1-6 and 9-10, the values of 'left' and 'right' in the case of relatively positioned elements are determined by the rules in section 9.4.3.
Note. The used value of 'width' calculated below is a tentative value, and may have to be calculated multiple times, depending on 'min-width' and 'max-width', see the section Minimum and maximum widths below.
The 'width' property does not apply. A computed value of 'auto' for 'margin-left' or 'margin-right' becomes a used value of '0'.
A computed value of 'auto' for 'margin-left' or 'margin-right' becomes a used value of '0'.
If 'height' and 'width' both have computed values of 'auto' and the element also has an intrinsic width, then that intrinsic width is the used value of 'width'.
If 'height' and 'width' both have computed values of 'auto' and the element has no intrinsic width, but does have an intrinsic height and intrinsic ratio; or if 'width' has a computed value of 'auto', 'height' has some other computed value, and the element does have an intrinsic ratio; then the used value of 'width' is:
(used height) * (intrinsic ratio)
If 'height' and 'width' both have computed values of 'auto' and the element has an intrinsic ratio but no intrinsic height or width, then the used value of 'width' is undefined in CSS 2.1. However, it is suggested that, if the containing block's width does not itself depend on the replaced element's width, then the used value of 'width' is calculated from the constraint equation used for block-level, non-replaced elements in normal flow.
Otherwise, if 'width' has a computed value of 'auto', and the element has an intrinsic width, then that intrinsic width is the used value of 'width'.
Otherwise, if 'width' has a computed value of 'auto', but none of the conditions above are met, then the used value of 'width' becomes 300px. If 300px is too wide to fit the device, UAs should use the width of the largest rectangle that has a 2:1 ratio and fits the device instead.
The following constraints must hold among the used values of the other properties:
'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block
If 'width' is not 'auto' and 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' (plus any of 'margin-left' or 'margin-right' that are not 'auto') is larger than the width of the containing block, then any 'auto' values for 'margin-left' or 'margin-right' are, for the following rules, treated as zero.
If all of the above have a computed value other than 'auto', the values are said to be "over-constrained" and one of the used values will have to be different from its computed value. If the 'direction' property of the containing block has the value 'ltr', the specified value of 'margin-right' is ignored and the value is calculated so as to make the equality true. If the value of 'direction' is 'rtl', this happens to 'margin-left' instead.
If there is exactly one value specified as 'auto', its used value follows from the equality.
If 'width' is set to 'auto', any other 'auto' values become '0' and 'width' follows from the resulting equality.
If both 'margin-left' and 'margin-right' are 'auto', their used values are equal. This horizontally centers the element with respect to the edges of the containing block.
The used value of 'width' is determined as for inline replaced elements. Then the rules for non-replaced block-level elements are applied to determine the margins.
If 'margin-left', or 'margin-right' are computed as 'auto', their used value is '0'.
If 'width' is computed as 'auto', the used value is the "shrink-to-fit" width.
Calculation of the shrink-to-fit width is similar to calculating the width of a table cell using the automatic table layout algorithm. Roughly: calculate the preferred width by formatting the content without breaking lines other than where explicit line breaks occur, and also calculate the preferred minimum width, e.g., by trying all possible line breaks. CSS 2.1 does not define the exact algorithm. Thirdly, find the available width: in this case, this is the width of the containing block minus the used values of 'margin-left', 'border-left-width', 'padding-left', 'padding-right', 'border-right-width', 'margin-right', and the widths of any relevant scroll bars.
Then the shrink-to-fit width is: min(max(preferred minimum width, available width), preferred width).
If 'margin-left' or 'margin-right' are computed as 'auto', their used value is '0'. The used value of 'width' is determined as for inline replaced elements.
For the purposes of this section and the next, the term "static position" (of an element) refers, roughly, to the position an element would have had in the normal flow. More precisely:
But rather than actually calculating the dimensions of that hypothetical box, user agents are free to make a guess at its probable position.
For the purposes of calculating the static position, the containing block of fixed positioned elements is the initial containing block instead of the viewport, and all scrollable boxes should be assumed to be scrolled to their origin.
The constraint that determines the used values for these elements is:
'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = width of containing block
If all three of 'left', 'width', and 'right' are 'auto': First set any 'auto' values for 'margin-left' and 'margin-right' to 0. Then, if the 'direction' property of the element establishing the static-position containing block is 'ltr' set 'left' to the static position and apply rule number three below; otherwise, set 'right' to the static position and apply rule number one below.
If none of the three is 'auto': If both 'margin-left' and 'margin-right' are 'auto', solve the equation under the extra constraint that the two margins get equal values, unless this would make them negative, in which case when direction of the containing block is 'ltr' ('rtl'), set 'margin-left' ('margin-right') to zero and solve for 'margin-right' ('margin-left'). If one of 'margin-left' or 'margin-right' is 'auto', solve the equation for that value. If the values are over-constrained, ignore the value for 'left' (in case the 'direction' property of the containing block is 'rtl') or 'right' (in case 'direction' is 'ltr') and solve for that value.
Otherwise, set 'auto' values for 'margin-left' and 'margin-right' to 0, and pick the one of the following six rules that applies.
Calculation of the shrink-to-fit width is similar to calculating the width of a table cell using the automatic table layout algorithm. Roughly: calculate the preferred width by formatting the content without breaking lines other than where explicit line breaks occur, and also calculate the preferred minimum width, e.g., by trying all possible line breaks. CSS 2.1 does not define the exact algorithm. Thirdly, calculate the available width: this is found by solving for 'width' after setting 'left' (in case 1) or 'right' (in case 3) to 0.
Then the shrink-to-fit width is: min(max(preferred minimum width, available width), preferred width).
In this case, section 10.3.7 applies up through and including the constraint equation, but the rest of section 10.3.7 is replaced by the following rules:
If 'width' is 'auto', the used value is the shrink-to-fit width as for floating elements.
A computed value of 'auto' for 'margin-left' or 'margin-right' becomes a used value of '0'.
Exactly as inline replaced elements.
| Value: | <length> | <percentage> | inherit |
| Initial: | 0 |
| Applies to: | all elements but non-replaced inline elements, table rows, and row groups |
| Inherited: | no |
| Percentages: | refer to width of containing block |
| Media: | visual |
| Computed value: | the percentage as specified or the absolute length |
| Value: | <length> | <percentage> | none | inherit |
| Initial: | none |
| Applies to: | all elements but non-replaced inline elements, table rows, and row groups |
| Inherited: | no |
| Percentages: | refer to width of containing block |
| Media: | visual |
| Computed value: | the percentage as specified or the absolute length or 'none' |
These two properties allow authors to constrain content widths to a certain range. Values have the following meanings:
Negative values for 'min-width' and 'max-width' are illegal.
In CSS 2.1, the effect of 'min-width' and 'max-width' on tables, inline tables, table cells, table columns, and column groups is undefined.
The following algorithm describes how the two properties influence the used value of the 'width' property:
These steps do not affect the real computed values of the above properties.
However, for replaced elements with an intrinsic ratio and both 'width' and 'height' specified as 'auto', the algorithm is as follows:
Select from the table the resolved height and width values for the appropriate constraint violation. Take the max-width and max-height as max(min, max) so that min ≤ max holds true. In this table w and h stand for the results of the width and height computations ignoring the 'min-width', 'min-height', 'max-width' and 'max-height' properties. Normally these are the intrinsic width and height, but they may not be in the case of replaced elements with intrinsic ratios.
Note: In cases where an explicit width or height is set and the other dimension is auto, applying a minimum or maximum constraint on the auto side can cause an over-constrained situation. The spec is clear in the behavior but it might not be what the author expects. The CSS3 object-fit property can be used to obtain different results in this situation.
| Constraint Violation | Resolved Width | Resolved Height |
|---|---|---|
| none | w | h |
| w > max-width | max-width | max(max-width * h/w, min-height) |
| w < min-width | min-width | min(min-width * h/w, max-height) |
| h > max-height | max(max-height * w/h, min-width) | max-height |
| h < min-height | min(min-height * w/h, max-width) | min-height |
| (w > max-width) and (h > max-height), where (max-width/w ≤ max-height/h) | max-width | max(min-height, max-width * h/w) |
| (w > max-width) and (h > max-height), where (max-width/w > max-height/h) | max(min-width, max-height * w/h) | max-height |
| (w < min-width) and (h < min-height), where (min-width/w ≤ min-height/h) | min(max-width, min-height * w/h) | min-height |
| (w < min-width) and (h < min-height), where (min-width/w > min-height/h) | min-width | min(max-height, min-width * h/w) |
| (w < min-width) and (h > max-height) | min-width | max-height |
| (w > max-width) and (h < min-height) | max-width | min-height |
Then apply the rules under "Calculating widths and margins" above, as if 'width' were computed as this value.
| Value: | <length> | <percentage> | auto | inherit |
| Initial: | auto |
| Applies to: | all elements but non-replaced inline elements, table columns, and column groups |
| Inherited: | no |
| Percentages: | see prose |
| Media: | visual |
| Computed value: | the percentage or 'auto' (see prose under <percentage>) or the absolute length |
This property specifies the content height of boxes.
This property does not apply to non-replaced inline elements. See the section on computing heights and margins for non-replaced inline elements for the rules used instead.
Values have the following meanings:
Note that the height of the containing block of an absolutely positioned element is independent of the size of the element itself, and thus a percentage height on such an element can always be resolved. However, it may be that the height is not known until elements that come later in the document have been processed.
Negative values for 'height' are illegal.
For example, the following rule sets the content height of paragraphs to 100 pixels:
p { height: 100px }
Paragraphs of which the height of the contents exceeds 100 pixels will overflow according to the 'overflow' property.
For calculating the values of 'top', 'margin-top', 'height', 'margin-bottom', and 'bottom' a distinction must be made between various kinds of boxes:
For Points 1-6 and 9-10, the used values of 'top' and 'bottom' are determined by the rules in section 9.4.3.
Note: these rules apply to the root element just as to any other element.
Note. The used value of 'height' calculated below is a tentative value, and may have to be calculated multiple times, depending on 'min-height' and 'max-height', see the section Minimum and maximum heights below.
The 'height' property does not apply. The height of the content area should be based on the font, but this specification does not specify how. A UA may, e.g., use the em-box or the maximum ascender and descender of the font. (The latter would ensure that glyphs with parts above or below the em-box still fall within the content area, but leads to differently sized boxes for different fonts; the former would ensure authors can control background styling relative to the 'line-height', but leads to glyphs painting outside their content area.)
Note: level 3 of CSS will probably include a property to select which measure of the font is used for the content height.
The vertical padding, border and margin of an inline, non-replaced box start at the top and bottom of the content area, and has nothing to do with the 'line-height'. But only the 'line-height' is used when calculating the height of the line box.
If more than one font is used (this could happen when glyphs are found in different fonts), the height of the content area is not defined by this specification. However, we suggest that the height is chosen such that the content area is just high enough for either (1) the em-boxes, or (2) the maximum ascenders and descenders, of all the fonts in the element. Note that this may be larger than any of the font sizes involved, depending on the baseline alignment of the fonts.
If 'margin-top', or 'margin-bottom' are 'auto', their used value is 0.
If 'height' and 'width' both have computed values of 'auto' and the element also has an intrinsic height, then that intrinsic height is the used value of 'height'.
Otherwise, if 'height' has a computed value of 'auto', and the element has an intrinsic ratio then the used value of 'height' is:
(used width) / (intrinsic ratio)
Otherwise, if 'height' has a computed value of 'auto', and the element has an intrinsic height, then that intrinsic height is the used value of 'height'.
Otherwise, if 'height' has a computed value of 'auto', but none of the conditions above are met, then the used value of 'height' must be set to the height of the largest rectangle that has a 2:1 ratio, has a height not greater than 150px, and has a width not greater than the device width.
This section also applies to block-level non-replaced elements in normal flow when 'overflow' does not compute to 'visible' but has been propagated to the viewport.
If 'margin-top', or 'margin-bottom' are 'auto', their used value is 0. If 'height' is 'auto', the height depends on whether the element has any block-level children and whether it has padding or borders:
The element's height is the distance from its top content edge to the first applicable of the following:
Only children in the normal flow are taken into account (i.e., floating boxes and absolutely positioned boxes are ignored, and relatively positioned boxes are considered without their offset). Note that the child box may be an anonymous block box.
For the purposes of this section and the next, the term "static position" (of an element) refers, roughly, to the position an element would have had in the normal flow. More precisely, the static position for 'top' is the distance from the top edge of the containing block to the top margin edge of a hypothetical box that would have been the first box of the element if its specified 'position' value had been 'static' and its specified 'float' had been 'none' and its specified 'clear' had been 'none'. (Note that due to the rules in section 9.7 this might require also assuming a different computed value for 'display'.) The value is negative if the hypothetical box is above the containing block.
But rather than actually calculating the dimensions of that hypothetical box, user agents are free to make a guess at its probable position.
For the purposes of calculating the static position, the containing block of fixed positioned elements is the initial containing block instead of the viewport.
For absolutely positioned elements, the used values of the vertical dimensions must satisfy this constraint:
'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' + 'margin-bottom' + 'bottom' = height of containing block
If all three of 'top', 'height', and 'bottom' are auto, set 'top' to the static position and apply rule number three below.
If none of the three are 'auto': If both 'margin-top' and 'margin-bottom' are 'auto', solve the equation under the extra constraint that the two margins get equal values. If one of 'margin-top' or 'margin-bottom' is 'auto', solve the equation for that value. If the values are over-constrained, ignore the value for 'bottom' and solve for that value.
Otherwise, pick the one of the following six rules that applies.
This situation is similar to the previous one, except that the element has an intrinsic height. The sequence of substitutions is now:
This section applies to:
If 'margin-top', or 'margin-bottom' are 'auto', their used value is 0. If 'height' is 'auto', the height depends on the element's descendants per 10.6.7.
For 'inline-block' elements, the margin box is used when calculating the height of the line box.
In certain cases (see, e.g., sections 10.6.4 and 10.6.6 above), the height of an element that establishes a block formatting context is computed as follows:
If it only has inline-level children, the height is the distance between the top of the topmost line box and the bottom of the bottommost line box.
If it has block-level children, the height is the distance between the top margin-edge of the topmost block-level child box and the bottom margin-edge of the bottommost block-level child box.
Absolutely positioned children are ignored, and relatively positioned boxes are considered without their offset. Note that the child box may be an anonymous block box.
In addition, if the element has any floating descendants whose bottom margin edge is below the element's bottom content edge, then the height is increased to include those edges. Only floats that participate in this block formatting context are taken into account, e.g., floats inside absolutely positioned descendants or other floats are not.
It is sometimes useful to constrain the height of elements to a certain range. Two properties offer this functionality:
| Value: | <length> | <percentage> | inherit |
| Initial: | 0 |
| Applies to: | all elements but non-replaced inline elements, table columns, and column groups |
| Inherited: | no |
| Percentages: | see prose |
| Media: | visual |
| Computed value: | the percentage as specified or the absolute length |
| Value: | <length> | <percentage> | none | inherit |
| Initial: | none |
| Applies to: | all elements but non-replaced inline elements, table columns, and column groups |
| Inherited: | no |
| Percentages: | see prose |
| Media: | visual |
| Computed value: | the percentage as specified or the absolute length or 'none' |
These two properties allow authors to constrain box heights to a certain range. Values have the following meanings:
Negative values for 'min-height' and 'max-height' are illegal.
In CSS 2.1, the effect of 'min-height' and 'max-height' on tables, inline tables, table cells, table rows, and row groups is undefined.
The following algorithm describes how the two properties influence the used value of the 'height' property:
These steps do not affect the real computed values of the above properties. The change of used 'height' has no effect on margin collapsing except as specifically required by rules for 'min-height' or 'max-height' in "Collapsing margins" (8.3.1).
However, for replaced elements with both 'width' and 'height' computed as 'auto', use the algorithm under Minimum and maximum widths above to find the used width and height. Then apply the rules under "Computing heights and margins" above, using the resulting width and height as if they were the computed values.
As described in the section on inline formatting contexts, user agents flow inline-level boxes into a vertical stack of line boxes. The height of a line box is determined as follows:
Empty inline elements generate empty inline boxes, but these boxes still have margins, padding, borders and a line height, and thus influence these calculations just like elements with content.
CSS assumes that every font has font metrics that specify a characteristic height above the baseline and a depth below it. In this section we use A to mean that height (for a given font at a given size) and D the depth. We also define AD = A + D, the distance from the top to the bottom. (See the note below for how to find A and D for TrueType and OpenType fonts.) Note that these are metrics of the font as a whole and need not correspond to the ascender and descender of any individual glyph.
User agent must align the glyphs in a non-replaced inline box to each other by their relevant baselines. Then, for each glyph, determine the A and D. Note that glyphs in a single element may come from different fonts and thus need not all have the same A and D. If the inline box contains no glyphs at all, it is considered to contain a strut (an invisible glyph of zero width) with the A and D of the element's first available font.
Still for each glyph, determine the leading L to add, where L = 'line-height' - AD. Half the leading is added above A and the other half below D, giving the glyph and its leading a total height above the baseline of A' = A + L/2 and a total depth of D' = D + L/2.
Note. L may be negative.
The height of the inline box encloses all glyphs and their half-leading on each side and is thus exactly 'line-height'. Boxes of child elements do not influence this height.
Although margins, borders, and padding of non-replaced elements do not enter into the line box calculation, they are still rendered around inline boxes. This means that if the height specified by 'line-height' is less than the content height of contained boxes, backgrounds and colors of padding and borders may "bleed" into adjoining line boxes. User agents should render the boxes in document order. This will cause the borders on subsequent lines to paint over the borders and text of previous lines.
Note. CSS 2.1 does not define what the content area of an inline box is (see 10.6.1 above) and thus different UAs may draw the backgrounds and borders in different places.
Note. It is recommended that implementations that use OpenType or TrueType fonts use the metrics "sTypoAscender" and "sTypoDescender" from the font's OS/2 table for A and D (after scaling to the current element's font size). In the absence of these metrics, the "Ascent" and "Descent" metrics from the HHEA table should be used.
| Value: | normal | <number> | <length> | <percentage> | inherit |
| Initial: | normal |
| Applies to: | all elements |
| Inherited: | yes |
| Percentages: | refer to the font size of the element itself |
| Media: | visual |
| Computed value: | for <length> and <percentage> the absolute value; otherwise as specified |
On a block container element whose content is composed of inline-level elements, 'line-height' specifies the minimal height of line boxes within the element. The minimum height consists of a minimum height above the baseline and a minimum depth below it, exactly as if each line box starts with a zero-width inline box with the element's font and line height properties. We call that imaginary box a "strut." (The name is inspired by TeX.).
The height and depth of the font above and below the baseline are assumed to be metrics that are contained in the font. (For more details, see CSS level 3.)
On a non-replaced inline element, 'line-height' specifies the height that is used in the calculation of the line box height.
Values for this property have the following meanings:
The three rules in the example below have the same resultant line height:
div { line-height: 1.2; font-size: 10pt } /* number */ div { line-height: 1.2em; font-size: 10pt } /* length */ div { line-height: 120%; font-size: 10pt } /* percentage */
When an element contains text that is rendered in more than one font, user agents may determine the 'normal' 'line-height' value according to the largest font size.
Note. When there is only one value of 'line-height' for all inline boxes in a block container box and they are all in the same font (and there are no replaced elements, inline-block elements, etc.), the above will ensure that baselines of successive lines are exactly 'line-height' apart. This is important when columns of text in different fonts have to be aligned, for example in a table.
| Value: | baseline | sub | super | top | text-top | middle | bottom | text-bottom | <percentage> | <length> | inherit |
| Initial: | baseline |
| Applies to: | inline-level and 'table-cell' elements |
| Inherited: | no |
| Percentages: | refer to the 'line-height' of the element itself |
| Media: | visual |
| Computed value: | for <percentage> and <length> the absolute length, otherwise as specified |
This property affects the vertical positioning inside a line box of the boxes generated by an inline-level element.
Note. Values of this property have different meanings in the context of tables. Please consult the section on table height algorithms for details.
The following values only have meaning with respect to a parent inline element, or to the strut of a parent block container element.
In the following definitions, for inline non-replaced elements, the box used for alignment is the box whose height is the 'line-height' (containing the box's glyphs and the half-leading on each side, see above). For all other elements, the box used for alignment is the margin box.
The following values align the element relative to the line box. Since the element may have children aligned relative to it (which in turn may have descendants aligned relative to them), these values use the bounds of the aligned subtree. The aligned subtree of an inline element contains that element and the aligned subtrees of all children inline elements whose computed 'vertical-align' value is not 'top' or 'bottom'. The top of the aligned subtree is the highest of the tops of the boxes in the subtree, and the bottom is analogous.
The baseline of an 'inline-table' is the baseline of the first row of the table.
The baseline of an 'inline-block' is the baseline of its last line box in the normal flow, unless it has either no in-flow line boxes or if its 'overflow' property has a computed value other than 'visible', in which case the baseline is the bottom margin edge.


--- layout: post title: ! 'Rails 2.3.0 RC1: Templates, Engines, Rack, Metal, much more!' categories: - releases author: David published: true date: 2009-02-01 23:40:00.000000000 +00:00 ---
Rails 2.3 is almost ready for release, but this package is so stock full of amazing new stuff that we’re making dutifully sure that everything works right before we call it official.
So please help us do thorough testing of this release candidate. Lots of the underpinnings changed. Especially the move to Rack. So we need solid testing and will probably have a slightly longer than average release candidate phase to account for that.
But boy will it be worth it. This is one of the most substantial upgrades to Rails in a very long time. A brief rundown of the top hitters:
And that’s just the tip of the iceberg. We’ve put together a complete guide for the Rails 2.3 release notes with much more information.
You can install the release candidate with:
gem install rails --source http://gems.rubyonrails.org
Enjoy, report the bugs, and let’s get Rails 2.3 final out the door soon.


About Us
This project created for BOUN SWE 574 Course at Fall 2020. Our team members are currently working as software engineers from different companies at Istanbul/Turkey.
Project aims to search keywords provided by user at PubMed with using Entrez API and harvest the Entrez API result with using Web Annotation Model and UMLS API to provide more reliable and intelligent search experience.


Here are some things about my pet:
Here is a link to my pet page.
Here is a link to other pets.
Here is a link to my contact page.


We take pride in our work, and it shows. WE are always here for you. Experience and execellent products provide your organization a tangible path to compliance, employee protection, and a benefit's solution without the headaches.
Small, medium, or large organization, we can help. Alberini Benefits Group will work with your needs to build a bridge to better healthier happier employees. Customized, Competitive Benefit Packages A quality benefit package is a great way to help attract and retain the best talent for your business. We represent many top-rated insurance companies and administrators to bring you a comprehensive, high quality benefits program. Whether your business is in need of the basics, such as a health insurance or a dental plan, or you are looking for a whole suite of services, we have you covered.
Protective's Best-in-class Claim Handling Next to health insurance, your workers' compensation coverage may well be one of the ... not place a limitation on applicants because they are members of a protected class. ... Harleysville has partnered with the CorVel Corporation. ... Managed care provides an important tool for controlling medical and indemnity costs.


icon_ic_add_24px
icon_ic_add_48px
icon_ic_add_alarm_24px
icon_ic_add_alarm_48px
icon_ic_chat_24px
icon_ic_chat_48px
icon_ic_check_18px
icon_ic_check_24px
icon_ic_check_36px
icon_ic_check_48px
icon_ic_chevron_right_24px
icon_ic_chevron_right_36px
icon_ic_chevron_right_48px
icon_ic_done_24px
icon_ic_done_48px
icon_ic_done_all_24px
icon_ic_done_all_48px
icon_ic_event_18px
icon_ic_event_24px
icon_ic_event_48px
icon_ic_flash_on_24px
icon_ic_flash_on_48px
icon_ic_folder_shared_18px
icon_ic_folder_shared_24px
icon_ic_folder_shared_48px
icon_ic_folder_shared_48pxv
icon_ic_forum_24px
icon_ic_forum_48px
icon_ic_group_18px
icon_ic_group_24px
icon_ic_group_48px
icon_ic_list_24px
icon_ic_list_48px
icon_ic_menu_18px
icon_ic_menu_24px
icon_ic_menu_36px
icon_ic_menu_48px2
icon_ic_more_horiz_18px
icon_ic_more_horiz_24px
icon_ic_more_horiz_36px
icon_ic_more_horiz_48px
icon_ic_more_vert_18px
icon_ic_more_vert_24px
icon_ic_more_vert_36px
icon_ic_more_vert_48px
icon_ic_palette_24px
icon_ic_palette_48px
icon_ic_schedule_24px
icon_ic_schedule_48px
icon_ic_search_24px
icon_ic_search_48px
icon_ic_send_24px
icon_ic_send_48px
icon_ic_settings_24px
icon_ic_settings_48px
icon_ic_view_list_24px
icon_ic_view_list_48px


Boost.Range |
istream_range
The intention of the istream_range
function is to construct
a new range with a pair of std::istream_iterator
s that wrap a
specified std::basic_istream
instance.
namespace boost { template< class Type, class Elem, class Traits > inline range< std::istream_iterator<Type, Elem, Traits> > istream_range(std::basic_istream<Elem, Traits>& in); }
© Copyright Neil Groves 2009.
Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at www.boost.org/LICENSE_1_0.txt)


When sites are constructed to require horizontal scrolling in order to navigate or read content at a normal size of 100% using standard screen sizes, additional problems can arise for users with low vision or mobility impairments.
This is some text you have to horizontally scroll to read.


|
PMSIS BSP
|
Data Structures | |
| struct | pi_partition_t |
| partition information structure More... | |
Typedefs | |
| typedef void * | pi_partition_table_t |
| partition table object More... | |
Enumerations | |
| enum | pi_partition_type_t |
| Partition type. More... | |
| enum | pi_partition_subtype_t |
| Partition subtype. More... | |
Functions | |
| pi_err_t | pi_partition_table_load (pi_device_t *flash, const pi_partition_table_t *table) |
| Open a partition table from a flash device. More... | |
| void | pi_partition_table_free (pi_partition_table_t table) |
| Close an opened partition table from pi_partition_table_load. More... | |
| const pi_partition_t * | pi_partition_find_first (const pi_partition_table_t table, const pi_partition_type_t type, const pi_partition_subtype_t subtype, const char *label) |
| Find first partition based on one or more parameters. More... | |
| static pi_err_t | pi_partition_close (const pi_partition_t *partition) |
| Close an opened partition device. More... | |
| static pi_err_t | pi_partition_read_async (const pi_partition_t *partition, const uint32_t partition_addr, void *data, const size_t size, pi_task_t *task) |
| Enqueue an asynchronous read copy to the flash partition (from flash partition to processor). More... | |
| static pi_err_t | pi_partition_read (const pi_partition_t *partition, const uint32_t partition_addr, void *data, const size_t size) |
| Enqueue a read copy to the flash partition (from flash to processor). More... | |
| static pi_err_t | pi_partition_write_async (const pi_partition_t *partition, const uint32_t partition_addr, const void *data, const size_t size, pi_task_t *task) |
| Enqueue an asynchronous read copy to the flash partition (from processor to flash partition). More... | |
| static pi_err_t | pi_partition_write (const pi_partition_t *partition, const uint32_t partition_addr, const void *data, const size_t size) |
| Enqueue a write copy to the flash partition (from processor to flash). More... | |
| static pi_err_t | pi_partition_erase_async (const pi_partition_t *partition, uint32_t partition_addr, int size, pi_task_t *task) |
| Erase an area in the flash partition asynchronously. More... | |
| static pi_err_t | pi_partition_erase (const pi_partition_t *partition, uint32_t partition_addr, int size) |
| Erase an area in the flash partition. More... | |
| size_t | pi_partition_get_size (const pi_partition_t *partition) |
| Erase the whole flash partition asynchronously. More... | |
| uint32_t | pi_partition_get_flash_offset (const pi_partition_t *partition) |
| Get flash partition start offset. More... | |
The partition driver provides support for handling partition contained into a device storage. Currently, PMSIS and GAP SDK provide both partitions, binary firmware and filesystem.
The beginning of the filesystem partition is aligned on a flash sector. Thus, an erase partition operation at address zero does not affect the data of the previous partition.
| typedef void* pi_partition_table_t |
| enum pi_partition_type_t |
|
inlinestatic |
This function can be called to close an opened partition device once it is not needed anymore, in order to free all allocated resources. Once this function is called, the device is not accessible anymore and must be opened again before being used.
| partition | The partition structure of the device to close. |
|
inlinestatic |
This will erase the specified area. The duration of this operation may be long and may be retrieved from the datasheet. If the flash only supports sector erasing, all the sectors partially or entirely covered by this aread will be erased. The caller is blocked until the operation is finished.
| partition | The partition descriptor on which to do the operation. |
| partition_addr | The address of the partition area to be erased. |
| size | The size of the area to be erased. |
|
inlinestatic |
This will erase the specified area. The duration of this operation may be long and may be retrieved from the datasheet. If the flash only supports sector erasing, all the sectors partially or entirely covered by this aread will be erased. A task must be specified in order to specify how the caller should be notified when the transfer is finished.
| partition | The partition descriptor on which to do the operation. |
| partition_addr | The address of the partition area to be erased. |
| size | The size of the area to be erased. |
| task | The task used to notify the end of transfer. See the documentation of pi_task_t for more details. |
| const pi_partition_t* pi_partition_find_first | ( | const pi_partition_table_t | table, |
| const pi_partition_type_t | type, | ||
| const pi_partition_subtype_t | subtype, | ||
| const char * | label | ||
| ) |
| table | the partition table descriptor on which to do the operation. This table must be loaded before with pi_partition_table_load(...) |
| type | Partition type, one of pi_partition_type_t values |
| subtype | Partition subtype, one of pi_partition_subtype_t values. To find all partitions of given type, use pi_PARTITION_SUBTYPE_ANY. |
| label | (optional) Partition label. Set this value if looking for partition with a specific name. Pass NULL otherwise. |
| uint32_t pi_partition_get_flash_offset | ( | const pi_partition_t * | partition | ) |
| partition | The partition where the offset will be fetched. |
| size_t pi_partition_get_size | ( | const pi_partition_t * | partition | ) |
This will erase the entire partition. The duration of this operation may be long and may be retrieved from the datasheet. A task must be specified in order to specify how the caller should be notified when the transfer is finished.
| partition | The partition descriptor on which to do the operation. |
| task | The task used to notify the end of transfer. See the documentation of pi_task_t for more details. |
This will erase the entire partition. The duration of this operation may be long and may be retrieved from the datasheet. The caller is blocked until the operation is finished.
| partition | The partition descriptor on which to do the operation. |
| partition | The partition where the size will be fetched. |
|
inlinestatic |
The copy will make a transfer between the flash partition and one of the processor memory areas. The caller is blocked until the transfer is finished. Depending on the chip, there may be some restrictions on the memory which can be used. Check the chip-specific documentation for more details.
| partition | The partition descriptor on which to do the copy. |
| partition_addr | The address of the copy in the partition. |
| data | The address of the copy in the processor. |
| size | The size in bytes of the copy |
|
inlinestatic |
The copy will make a transfer between the flash partition and one of the processor memory areas. A task must be specified in order to specify how the caller should be notified when the transfer is finished. Depending on the chip, there may be some restrictions on the memory which can be used. Check the chip-specific documentation for more details.
| partition | The partition descriptor on which to do the copy. |
| partition_addr | The address of the copy in the partition. |
| data | The buffer address of the copy. |
| size | The size in bytes of the copy. |
| task | The task used to notify the end of transfer. See the documentation of pi_task_t for more details. |
| void pi_partition_table_free | ( | pi_partition_table_t | table | ) |
| table | A reference of the partition table to free. |
| pi_err_t pi_partition_table_load | ( | pi_device_t * | flash, |
| const pi_partition_table_t * | table | ||
| ) |
| flash | The flash device in which to fetch the partition table. |
| table | A reference to the user table variable. if the return code is PI_OK, this pointer contains a reference to the new partition table. |
|
inlinestatic |
The copy will make a write transfer from one of the processor memory areas to the partition. The locations in the flash being written should have first been erased. The caller is blocked until the transfer is finished. Depending on the chip, there may be some restrictions on the memory which can be used. Check the chip-specific documentation for more details.
| partition | The partition descriptor on which to do the copy. |
| partition_addr | The address of the copy in the partition. |
| data | The address of the copy in the processor. |
| size | The size in bytes of the copy |
|
inlinestatic |
The copy will make a transfer between the flash partition and one of the processor memory areas.
A task must be specified in order to specify how the caller should be notified when the transfer is finished. Depending on the chip, there may be some restrictions on the memory which can be used. Check the chip-specific documentation for more details.
| partition | The partition descriptor on which to do the copy. |
| partition_addr | The address of the copy in the partition. |
| data | The buffer address of the copy. |
| size | The size in bytes of the copy. |
| task | The task used to notify the end of transfer. See the documentation of pi_task_t for more details. |


On top of your routine vaccinations, it is reccomended for all travellers to protect yourself aginst:
It is recommended for most travellers to protect yourself aginst:
Consult your doctor to see if you need to protect yourself against:


Topics
Welcome
This is a set of well structured video tutorials, helps you to start codeigniter from the basics correctly. Here you’ll be learning
- How to Install Codeigniter
- Basic concepts behind Codeigniter
- How to get started with coding
This is a set of well structured video tutorials, helps you to start codeigniter from the basics correctly. Here you’ll be learning


Keep in mind that javascript has been around for 19 years. That is a lot of time, and it wasn't as popular back then as it is now. Why is it so good now? What are the great things about this language? What are it's limitation?
I will attempt to answer these questions in the following paragraphs
Javascript is a dynamic programming language that makes the website in which it is used to be dynamic. What does this mean?
If you think about those annoying box fields that ask you to create a password with a set of conditions and that don't allow you to keep on going filling those fun forms. That is javascript making that web site form both annoying and dynamic. It is making the website force you to place some input in that field with a set of conditions that can be set on the client side. The webpage is not going back to the server and asking "Hey bro, this guy just gave us a password, is this password cool with you?".
That dynamic aspect of javascript alone takes a huge strain from the server and that is why people like javascript so much. With the advent of faster computer, there are more complex functions and dynamic capabilities that don't rely on the server any more but on the client.
From what I've researched, here is a list of things it can't do:
They hardly mean anything to me at these point but I think, I'd at least list them here. There must be more things javascript can't do, but the merits and it's growth has stemmed from what it can so I'll be glad to focus on that for the time being.
-Santi


It's an honor to be the Fan Favorite, @GooglePlay! Thanks to all the TV lovers for making us one of the Best Apps of 2018! #GooglePlayBestOfpic.twitter.com/y5EbcEJtkG


Galloping through the village with Faile at his heels, Perrin found the men on the south side in a cluster, peering out over the cleared fields and muttering, some with bows half-drawn. Two wagons blocked the gap the Old Road made in the sharp stakes. The nearest low stone fence still standing, bordering a field of tabac, lay five hundred paces off, with nothing between taller than barley stubble; the ground short of it sprouted arrows like weeds. Smoke curled up in the far distance, a dozen or more thick black plumes, some wide enough to be fields burning.
Cenn Buie was there, and Hari and Darl Coplin. Bili Congar had an arm around the shoulders of his cousin Wit, Daise’s bony husband, who looked as if he wished Bili would not breathe on him. None smelled of fear, only excitement. And Bili of ale. At least ten men at once tried to tell him what had happened; some were louder than others.
“The Trollocs tried us here, as well,” Hari Coplin shouted, “but we showed them, didn’t we?” There were murmurs of agreement, but just as many or more eyed each other doubtfully and shifted their feet.
“We’ve some heroes here, too,” Darl said in a loud, rough voice. “Your lot up at the wood aren’t the only ones.”  When he thought Perrin was not looking, he shot him a spiteful look. It did not necessarily mean he really wished he had been up facing the Westwood; Darl and Hari and most of their relatives usually found a way to see themselves being cheated, whatever the situation.
“This calls for a drink!” old Bili announced, then scowled in disappointment when no one echoed him.
A head lifted above the distant wall and hurriedly ducked back down, but not before Perrin saw a brilliant yellow coat. “Not Trollocs,” he growled disgustedly. “Tinkers! You were shooting at Tuatha’an. Get those wagons out of the way.” Standing in his stirrups, he cupped hands to his mouth. “You can come on!” he shouted. “It is all right! No one will hurt you! I said move those wagons,” he snapped at the men standing around staring at him. Taking Tinkers for Trollocs! “And go fetch your arrows; you’ll have real need for them sooner or later.” Slowly some moved to obey, and he shouted again, “No one will harm you! It is all right! Come on!” The wagons rolled to either side with the creak of axles that needed grease.
A few brightly garbed Tuatha’an climbed over the fence, then a few more, and started toward the village in a hesitant, footsore half-run, seeming almost as afraid of what lay ahead as whatever lay behind. They huddled together at the sight of men dashing out from the village, balancing on the edge of turning back even when the Two Rivers folk trotted by, looking at them curiously, to begin pulling arrows out of the dirt. Yet they did stumble on.
Perrin’s insides turned to ice. Twenty men and women, perhaps, some carrying small children, and a handful of older children running, too, their dazzling colors all torn and stained with dirt. And some with blood, he saw as they came closer. That was all. Out of how many in the caravan? There was Raen, at least, shuffling as though half-dazed and being guided by Ila, one side of her face a dark, swollen bruise. At least they had survived.
Short of the opening, the Tuatha’an stopped, staring uncertainly at the sharp stakes and the mass of armed men. Some of the children clutched their elders and hid their faces. They smelled of fear, of terror. Faile jumped down and ran to them, but though Ila hugged her, she did not take another step nearer. The older woman seemed to be drawing comfort from the younger.
“We won’t hurt you,” Perrin said. I should have made them come. The Light burn me, I should have made them! “You are welcome to our fires.”
“Tinkers.” Hari’s mouth twisted scornfully.  Take everything that isn’t nailed down.”
Darl open his mouth, to support Hari no doubt, but before he could speak someone in the crowd shouted, “So do you, Hari! And you’ll take the nails, too!” Sparse laughter snapped Darl’s jaws shut. Not many laughed, though, and those that did eyed the bedraggled Tuatha’an and looked down in discomfort.
“Hari is right!” Daise Congar called, bulling through, pushing men out of her path. “Tinkers steal, and not just things! They steal children!” Shoving her way to Cenn Buie, she shook a finger as thick as Cenn’s thumb under his nose. He backed away as much as he could in the press; she overtopped him by a head and outweighed him by half. “You are supposed to be on the Village Council, but if you don’t want to listen to the Wisdom, I’ll bring the Women’s Circle into this, and we will take care of it.” Some of the men nodded, muttering.
Cenn scratched his thinning hair, eyeing the Wisdom sideways. “Aaah . . . well . . .
A good many scattered before the dun, but Perrin did not care. “We’ll not turn anyone away,” he said in a tight voice. “No one! Or do you mean to send children off for the Trollocs?” One of the Tuatha’an children began to cry, a sharp wailing, and he wished he had not said that, but Cenn’s face went red as a beet, and even Daise looked abashed.
“Of course we’ll take them in,” the thatcher said gruffly. He rounded on Daise, all puffed up like a banty rooster ready to fight a mastiff. “And if you want to bring the Women’s Circle into it, the Village Council will sit the whole lot of you down sharp! You see if we don’t!”
“You always were an old fool, Cenn Buie,” Daise snorted.  Cenn’s jaw worked furiously, but before he could get a word out Daise put a hand on his narrow chest and thrust him aside. Donning a smile, she strode out to the Tuatha’an and put a comforting arm around Ila. “You just come along with me, and I’ll see you all get hot baths and somewhere to rest. Every house is crowded, but we’ll find places for everyone. Come.”
Marin al’Vere came hurrying through the crowd, and Alsbet Luhhan, Natti Cauthon and Neysa Ayellin and more women, taking up children or putting arms around Tuatha’an women, urging them along, scolding the Two Rivers men to make way. Not that anybody was balking, now; it just took a little time for so many to jostle back and open a path.
Faile gave Perrin an admiring look, but he shook his head. This was not ta’veren work; Two Rivers people might need the right way pointed out to them sometimes, but they could see it when it was. Even Hari Coplin, watching the Tinkers brought in, did not look as sour as he had. Well, not quite as sour. There was no use expecting miracles.
Shambling by, Raen looked up at Perrin dully. “The Way of the Leaf is the right way.  ” He trailed off as if he could not remember what he had been going to say.
“They came last night,” Ila said, mumbling because of her swollen face. Her eyes were almost as glazed as her husband’s. “The dogs might have helped us escape, but the Children killed all the dogs, and . . . There was nothing we could do.” Behind her, Aram shivered in his yellow-striped coat, staring at all the armed men. Most of the Tinker children were crying now.
Perrin frowned at the smoke rising to the south. Twisting in his saddle, he could make out more to the north and east. Even if most of those represented houses already abandoned, the Trollocs had had a busy night. How many would it take to fire that many farms, even running between and taking no more time than needed to toss a torch into an empty house or unwatched field? Maybe as many as they had killed today; What did that say about Trolloc numbers already in the Two Rivers? It did not seem possible one band had done it all, burning all those houses and destroying the Traveling People’s caravan, too.
Eyes falling on the Tuatha’an being led away, he felt a stab of embarrassment. They had seen kith and kin killed last night, and here he was coldly considering numbers. He could hear some of the Two Rivers men muttering, trying to decide which smoke represented whose farm. To all of these people those fires meant real losses, lives to be rebuilt if they could, not just numbers. He was useless here. Now, while Faile was caught up in helping see to the Tinkers, was the time for him to be off after Loial and Gaul.
Master Luhhan, in his blacksmith’s vest and long leather apron, caught Stepper’s bridle. “Perrin, you have to help me. The Warders want me to make parts for more of those catapults, but I’ve twenty men clamoring for me to repair bits of armor their grandfathers’ fool grandfathers bought from some fool merchants’ guards.”
“I would like to give you a hand,” Perrin said, “but I have something else that needs doing. I’d likely be rusty, anyway. I haven’t had much work at a forge the last year.”
“Light, I didn’t mean that. Not for you to work a hammer.” The blacksmith sounded shocked. “Every time I send one of those goose-brains off with a bee in his ear, he’s back ten minutes later with a new argument. I cannot get any work done. They’ll listen to you.”
Perrin doubted it, not if they would not listen to Master Luhhan. Aside from being on the Village Council, Haral Luhhan was big enough to pick up nearly any man in the Two Rivers and toss him out bodily if need be. But he went along to the makeshift forge Master Luhhan had set up beneath a hastily built, open-sided shed near the Green. Six men clustered around the anvils salvaged from the smithy the Whitecloaks had burned, and another idly pumping the big leather bellows until the blacksmith chased him away from the long handles with a shout. To Perrin’s surprise they did listen when he told them to go, with no speech to bend men ‘round a ta’veren’s will, just a plain statement that Master Luhhan was busy. Surely the blacksmith could have done as much himself, but he shook Perrin’s hand and thanked him profusely before setting to work.
Bending down from Stepper’s saddle, Perrin caught one of the men by the shoulder, a bald-headed farmer named Get Eldin, and asked him to stay and warn off anyone else who tried to bother Master Luhhan. Get must have been three times his age, but the leathery, wrinkle-faced man just nodded and took up a station near where Haral had his hammer ringing on hot iron. Now he could be off, before Faile turned up.
Before he could as much as turn Stepper, Bran appeared, spear on his shoulder and steel cap under one stout arm. “Perrin, there has to be a faster way to bring the shepherds and herdsmen in if we’re attacked again. Even sending the fastest runners in the village, Abell couldn’t get half of them back here before those Trollocs came out of the wood.”
That was easy to solve, a matter of remembering an old bugle, tarnished nearly black, that Cenn Buie had hanging on his wall, and settling on a signal of three long blasts that the farthest shepherd could hear. It did bring up signals for other things, of course, such as sending everyone to their places if an attack was expected. Which led to how to know when an attack was expected. Bain and Chiad and the Warders turned out to be more than amenable to scouting, but four were hardly enough, so good woodsmen and trackers had to be found, and provided with horses so they could reach Emond’s Field ahead of any Trollocs they spotted.
After that, Buel Dowtry had to be settled down. The white-haired old fletcher, with a nose nearly as sharp as a broadhead point, knew very well that most farmers usually made their own arrows, but he was adamantly opposed to anyone helping him here in the village, as if he could keep every quiver filled by himself. Perrin was not sure how he smoothed Buel’s ruffled temper, but somehow he left the man happily teaching a knot of boys to tie and glue goose-feather fletchings.
Eward Candwin, the stout cooper, had a different problem. With so many folks needing water, he had more buckets and barrels to make than he could hoop in weeks, alone. It did not take long to find him hands he trusted to chamfer staves at least, but more people came with questions and problems they seemed to think only Perrin had the answers for, from where to burn the bodies of the dead Trollocs to whether it was safe to return to their farms to save what they could. That last he answered with a firm no whenever it was asked—and it was asked more often than any other, by men and women frowning at the smoke rising in the countryside—but most of the time he simply inquired what the questioner thought was a good solution and told him to do that. It was seldom he really had to come up with an answer; people knew what to do, they just had this fool notion they had to ask him.
Dannil and Ban and the others found him and insisted on riding about at his heels with that banner, as if the big one over the Green was not bad enough, until he sent them off to guard the men who had gone back to felling trees along the Westwood. It seemed that Tam had told them some tale about something called the Companions, in Illian, soldiers who rode with the general of an Illianer army and were thrown in wherever the battle was hottest. Tam, of all people! At least they took the banner with them. Perrin felt a right fool with that thing trailing after him.
In the middle of the morning, Luc rode in, all golden-haired arrogance, nodding slightly to acknowledge a few cheers, though why anyone wanted to cheer him seemed a mystery. He brought a trophy that he pulled out of a leather bag and had set on a spear at the edge of the Green for everyone to gawk at. A Myrddraal’s eyeless head. The fellow was modest enough, in a condescending sort of way, but he did let slip that he had killed the Fade when he ran into a band of Trollocs. An admiring train took him around to see the scene of the battle here—they were calling it that—where horses were dragging Trollocs off to great pyres already sending up pillars of oily black smoke. Luc was properly admiring in turn, making only one or two criticisms of how Perrin had disposed his men; that was how the Two Rivers folk told it, with Perrin lining everybody up and giving orders he certainly never had.
To Perrin, Luc gave a patronizing smile of approval. “You did very well, my boy. You were lucky, of course, but there is such a thing as the luck of the beginner, is there not.”
When he went off to his room in the Winespring Inn, Perrin had the head taken down and buried. Not a thing people should be staring at, especially the children.
The questions continued as the day wore on, until he suddenly realized the sun stood straight overhead, he had had nothing to eat, and his stomach was talking to him in no uncertain terms. “Mistress al’Caar,” he said wearily to the long-faced woman at his stirrup, “I suppose the children can play anywhere, so long as somebody watches to make sure they don’t go beyond the last houses. Light, woman, you know that. You certainly know children better than I do! If you don’t, how have you managed to raise four of your own?” Her youngest was six years older than he was!
Nela al’Caar frowned and tossed her head, gray-streaked braid swinging. For a moment he thought she was going to snap his nose off, talking that way to her. He almost wished she would, for a change from everybody wanting to know what he thought should be done. “Of course I know children,” she said. “I just want to make sure it’s done the way you want. That’s what we’ll do, then.”
Sighing, he only waited for her to turn away before reining Stepper around toward the Winespring Inn. Two or three voices called to him, but he refused to listen. What he wanted done. What was wrong with these people? Two Rivers folk did not follow this way. Certainly not Emond’s Fielders. They wanted a say in everything. Arguments in front of the Village Council, arguments among the Council, had to come to blows before they occasioned comment. And if the Women’s Circle thought they kept their own affairs more circumspect, there was not a man who did not know the meaning of tight-jawed women stalking about with their braids all but bristling like angry cats’ tails.
What I want! he thought angrily. What I want is something to eat, someplace where no one is jabbering in my ear. Stepping down in front of the inn, he staggered, and thought he could add a bed to that short list. Only midday, with Stepper doing all the work, and he already felt bone-weary. Maybe Faile had been right after all. Maybe going after Loial and Gaul really was a bad idea.
When he walked into the common room, Mistress al’Vere took one look at him and all but pushed him into a chair with a motherly smile. “You can just give over handing out orders for a while,” she told him firmly. “Emond’s Field can very well survive an hour by itself while you put some food inside you.” She bustled away before he could say Emond’s Field could very well survive by itself without him at all.
The room was almost empty. Natti Cauthon sat at one table, rolling bandages and adding them to the pile in front of her, but she also managed to keep an eye on her daughters, across the room, though both were old enough to be wearing their hair in a braid. The reason was plain enough. Bode and Eldrin sat on either side of Aram, coaxing the Tinker to eat. Feeding him, actually, and wiping his chin, too. From the way they were grinning at the fellow, Perrin was surprised Natti was not at the table with them, braids or no. The fellow was good-looking, he supposed; maybe handsomer than Wil al’Seen. Bode and Eldrin certainly seemed to think so. For his part, Aram smiled back occasionally—they were plumply pretty girls; he would have to be blind not to see it, and Perrin did not think Aram was ever blind to a pretty girl—but he hardly swallowed without running a wide-eyed gaze over the spears and polearms against the walls.
“Mistress al’Vere said you had finally gotten tired of your saddle,” Faile said, popping in through the door to the kitchen. Startlingly, she wore a long white apron like Marin’s; her sleeves were pushed up above her elbows, and she had flour on her hands. As if just realizing it, she whipped the apron off, wiping her hands hastily, and laid it across the back of a chair. “I have never baked anything before,” she said, shoving her sleeves down as she joined him. “It is rather fun kneading dough.  I don’t intend to spend my whole life traveling, buying meals or eating what I can snare or fetch with bow or sling.”
She smiled as if he had said something very pleasing, though he could not for the life of him see what. “The cook will bake, of course. One of her helpers, really, I suppose, but the cook will oversee it.”
“The cook,” he mumbled, shaking his head. “Or one of her helpers. Of course. Why didn’t I think of that?”
“What is the matter, Perrin? You look worried. I don’t think the defenses could be any sounder without a fortress wall.”
“It isn’t that. Faile, this Perrin Goldeneyes business is getting out of hand. I do not know who they think I am, but they keep asking me what to do, asking if it’s all right, when they already know what has to be done, when they could figure it out with two minutes’ thought.”
For a long moment she studied his face, those dark, tilted eyes thoughtful, then said, “How many years has it been since the Queen of Andor ruled here in fact?”
“The Queen of Andor? I don’t really know. A hundred years, maybe. Two hundred. What does that have to do with anything?”
“These people do not remember how to deal with a queen—or a king. They are trying to puzzle it out. You must be patient with them.”
“A king?” he said weakly. He let his head drop down onto his arms on the table. “Oh, Light!”
Laughing softly, Faile ruffled his hair. “Well, perhaps not that. I doubt very much that Morgase would approve. A leader, at least. But she would very definitely approve a man who brought lands back to her that her throne has not controlled in a hundred years or more. She would surely make that man a lord. Perrin of House Aybara, Lord of the Two Rivers. It has a good sound.”
“We do not need any lords in the Two Rivers,” he growled at the oak tabletop. “Or kings, or queens. We are free men!”
“Free men can have a need to follow someone, too,” she said gently. “Most men want to believe in something larger than themselves, something wider than their own fields. That is why there are nations, Perrin, and peoples. Even Raen and Ila see themselves as part of something more than their own caravan. They have lost their wagons and most of their family and friends, but other Tuatha’an still seek the song, and they will again, too, because they belong to more than a few wagons.”
“Who owns these?” Aram asked suddenly.
Perrin raised his head. The young Tinker was on his feet, staring uneasily at the spears lining the walls. “They belong to anybody who wants one, Aram. Nobody is going to hurt you with any of them, believe me.” He was not sure if Aram did believe, not the way he began walking slowly around the room with his hands stuffed into his pockets, eyeing spears and halberds sideways.
Perrin was more than grateful to dig in when Marin brought him a plate of sliced roast goose, with turnips and peas and good crusty bread. At least, he would have dug in, if Faile had not tucked a flower-embroidered napkin under his chin and snatched the knife and fork out of his hands. She seemed to find it amusing to feed him the way Bode and Eldrin had been feeding Aram. The Cauthon girls giggled at him, and Natti and Marin wore little smiles, too. Perrin did not see what was so funny. He was willing to indulge Faile, though, even if he could have fed himself more easily. She kept making him stretch his neck to take what she had on the fork.
Aram’s slow wandering took him around the room three times before he stopped at the foot of the stairs, staring at the barrel of ill-assorted swords. Then he reached out and pulled a sword from the cluster, hefting it awkwardly. The leather-wrapped hilt was long enough for both of his hands. “Can I use this one?” he asked.
Perrin nearly choked.
Alanna appeared at the head of the stairs, with Ila; the Tuatha’an woman looked weary, but the bruise was gone from her face. “ . . . best thing is sleep,” the Aes Sedai was saying. “It is shock to his mind that troubles him most, and I cannot Heal that.”
 “No, Aram! Nooooo!” She almost fell in her haste to get down the stairs and flung herself on Aram, trying to pull his hands from the sword. “No, Aram,” she panted breathlessly. “You must not. Put it down. The Way of the Leaf. You must not! The Way of the Leaf! Please, Aram! Please!”
Aram danced with her, fending her off clumsily, trying to hold the sword away from her. “Why not?” he shouted angrily. “They killed Mother! I saw them! I might have saved her, if I had had a sword. I could have saved her!”
The words sliced at Perrin’s chest. A Tinker with a sword seemed an unnatural thing, almost enough to make his hackles stand, but those words . . . His mother. “Leave him alone,” he said, more roughly than he intended. “Any man has a right to defend himself, to defend his . . . He has a right.”
Aram pushed the sword toward Perrin. “Will you teach me how to use it?”
“I don’t know how,” Perrin told him. “You can find someone, though.”
Tears rolled down Ila’s contorted face. “The Trollocs took my daughter,” she sobbed, her entire body shaking, “and all my grandchildren but one, and now you take him. He is Lost, because of you, Perrin Aybara. You have become a wolf in your heart, and now you will make him one, too.” Turning, she stumbled back up the steps, still racked with sobs.
“I could have saved her!” Aram called after her. “Grandmother! I could have saved her!” She never looked back, and when she vanished around the corner, he slumped against the banister, weeping. “I could have saved her, grandmother. I could have . . . ”
Perrin realized Bode was crying, too, with her face in her hands, and the other women were frowning at him as though he had done something wrong. No, not all of them. Alanna studied him from the head of the stairs with that unreadable Aes Sedai calm, and Faile’s face was nearly as blank.
Wiping his mouth, he tossed the napkin on the table and got up. There was still time to tell Aram to put the sword back, to go ask Ila’s pardon. Time to tell him . . . what? That maybe next time he would not be there to watch his loved ones die? That maybe he could just come back to find their graves?
He put a hand on Aram’s shoulder, and the man flinched, hunching around the sword as if expecting him to take it. The Tinker’s scent carried a wash of emotions, fear and hate and bone-deep sadness. Lost, Ila had called him. His eyes looked lost. “Wash your face, Aram. Then go find Tam al’Thor. Say I ask him to teach you the sword.”
Slowly the other man raised his face. “Thank you,” he stammered, scrubbing at the tears on his cheeks with his sleeve. “Thank you. I will never forget this. Never. I swear it.” Suddenly he hoisted the sword to kiss the straight blade; the hilt had a brass wolfhead for a pommel. “I swear. Is that not how it is done?”
“I suppose it is,” Perrin said sadly, wondering why he should feel sad. The Way of the Leaf was a fine belief, like a dream of peace, but like the dream it could not last where there was violence. He did not know of a place without that. A dream for some other man, some other time. Some other Age perhaps. “Go on, Aram. You have a lot to learn, and there may not be much time.” Still bubbling thanks, the Tinker did not wait to wash his tears away, but ran straight out of the inn, carrying the sword upright before him in both hands.
Conscious of Eldrin’s scowl and Marin’s fists on her hips and Natti’s frown, not to mention Bode’s weeping, Perrin walked back to his chair. Alanna had gone from her place at the top of the stairs. Faile watched him pick up his knife and fork. “You disapprove?” he said quietly. “A man has a right to defend himself, Faile. Even Aram. No one can make him follow the Way of the Leaf if he doesn’t want to.”
“I do not like to see you in pain,” she said very softly.
His knife paused in cutting a piece of goose. Pain? That dream was not for him. “I am just tired,” he told her, and smiled. He did not think she believed him.
 He wore his round steel cap again. “Riders coming from the north, Perrin. A lot of riders, I think it must be the Whitecloaks.”
Faile darted away as Perrin rose, and by the time he was outside on Stepper, with the Mayor muttering to himself about what he meant to say to the Whitecloaks, she came riding her black mare around the side of the inn. More people were running north than stayed at their tasks. Perrin was in no particular hurry. The Children of the Light might well be there to arrest him. They probably were. He did not mean to go along in chains, but he was not anxious to ask people to fight Whitecloaks for him. He followed behind Bran, joining the stream of men and women and children crossing the Wagon Bridge across the Winespring Water, Stepper’s and Swallow’s hooves clattering on the thick planks. A few tall willows grew here along the water. The bridge was where the North Road began, than ran to Watch Hill and beyond. Some of the distant smoke plumes had thinned to wisps as fires burned themselves out.
Where the road left the village, he found a pair of wagons blocking the road and men gathered behind pointed, slanting stakes with their bows and spears and such, smelling of excitement, murmuring to each other and all jammed together to watch what was coming down the road: a long double column of white-cloaked horsemen trailing a cloud of dust, conical helmets and burnished plate-and-mail shining in the afternoon sun, steel-tipped lances all at the same angle. At their head rode a youngish man, stiff-backed and stern-faced, who looked vaguely familiar to Perrin. With the arrival of the Mayor, the murmurs hushed expectantly. Or maybe it was Perrin’s arrival that quieted them.
Two hundred paces or so from the stakes, the stern-faced man raised a hand, and the column halted with sharp orders echoing down the files. He came on with just half a dozen Whitecloaks for company, running his eyes over the wagons and sharp stakes and the men behind. His manner would have named him a man of importance even without the knots of rank beneath the flaring sunburst on his cloak.
Luc had appeared from somewhere, resplendent on his shiny black stallion in rich red wool and golden embroidery. Perhaps it was natural enough that the Whitecloak officer chose to address himself to Luc, though his dark eyes continued to probe. “I am Dain Bornhald,” he announced, reining in, “Captain of the Children of the Light. You have done this for us? I have heard that Emond’s Field is closed to the Children, yes? Truly a village of the Shadow if it is closed to the Children of the Light.”
Dain Bornhald, not Geofram. A son, perhaps. Not that it made any difference. Perrin supposed one would try to arrest him as soon as another. Sure enough, Bornhald’s gaze swept past him, then jerked back. A convulsion seemed to seize the man; one gauntleted hand darted to his sword, his lips peeled back in a silent snarl, and for a moment Perrin was sure the man was about to charge, fling his horse onto the spiky barrier, to reach him. The man looked as if he bore Perrin a personal hatred. Up close, that hard face had a touch of slackness to it, a shine in those eyes that Perrin was used to seeing in Bili Congar’s. He thought he could smell brandy fumes.
The hollow-cheeked man beside Bornhald was more than familiar. Perrin would never forget those deep-set eyes, like dark burning coals. Tall and gaunt and hard as an anvil, Jaret Byar truly did look at him with hate. Whether or not Bornhald was a zealot, Byar surely was.
Luc apparently had the sense not to try usurping Bran’s place—indeed, he appeared intent on examining the white-cloaked column as the dust settled, revealing more Children stretching up the road—to Perrin’s disgust, though Bran looked to him—to the blacksmith’s apprentice—waited for his nod before answering. He was the Mayor! Bornhald and Byar plainly took note of the silent exchange.
“Emond’s Field is not precisely closed to you,” Bran said, standing up straight with his spear propped out to one side. “We have decided to defend ourselves, and have this very morning. If you want to see our work, look there.” He pointed toward the smoke rising from the Trollocs’ pyres. A sickly-sweet smell of burning flesh drifted in the air, but no one except Perrin seemed to notice.
“You have killed a few Trollocs?” Bornhald said contemptuously. “Your luck and skill amaze me.”
“More than a few!” somebody called out of the Two Rivers crowd. “Hundreds!”
“We had a battle!” another voice cried, and dozens more shouted angrily on top of one another
“We fought them and won!”
“Where were you?”
“We can defend ourselves without any Whitecloaks!”
“The Two Rivers!”
“The Two Rivers and Perrin Goldeneyes!”
“Goldeneyes!”
“Goldeneyes!”
Leof, who should have been over guarding the woodsmen, started waving that crimson wolfhead banner.
Bornhald’s hot-eyed hate took them all in, but Byar danced his bay gelding forward with a snarl. “Do you farmers think you know battle?” he roared. “Last night one of your villages was all but wiped out by Trollocs!  He fell silent at a weary gesture from Bornhald, a fierce-trained dog obeying his master, but his words had quieted the Two Rivers people.
“Which village?” Bran’s voice was dignified and troubled both. “We all know people in Watch Hill, and Deven Ride.”
“Watch Hill has not been troubled,” Bornhald replied, “and I know nothing of Deven Ride. This morning a rider brought me word that Taren Ferry hardly exists any longer. If you have friends there, many people did escape across the river. Across the river.” His face tightened momentarily. “I myself lost nearly fifty good soldiers.”
The news produced a few queasy murmurs; no one liked to hear that sort of thing, but on the other hand, no one here knew anyone in Taren Ferry. Likely none of them had ever been that far.
Luc pushed his horse forward, the stallion snapping at Stepper. Perrin reined his own mount tightly before the two began fighting, but Luc appeared not to notice or care. “Taren Ferry?” he said in a flat voice. “Trollocs attacked Taren Ferry last night?”
Bornhald shrugged. “I said it, did I not? It seems that the Trollocs have at last decided to raid the villages. How providential that you here were warned in time to prepare these fine defenses.” His stare ran over the pointed hedge and the men behind it before settling on Perrin.
“Was the man called Ordeith at Taren Ferry last night?” Luc asked.
Perrin stared at him. He had not known Luc even knew of Padan Fain, or the name he used now. But people did talk, especially when someone they knew as a peddler came back with authority among Whitecloaks.
Bornhald’s reaction was as strange as the question.  “You know Ordeith?” he said, leaning toward Luc in his saddle.
It was Luc’s turn to shrug casually. “I have seen him here and there since coming to the Two Rivers. A disreputable-looking man, and those who follow him no less. The sort who might have been careless enough to allow a Trolloc attack to succeed. Was he there? If so, one can hope he died for his folly. If not, one hopes you have him here with you, close under your eye.”
“I do not know where he is,” Bornhald snapped. “Or care! I did not come here to talk of Ordeith!” His horse pranced nervously as Bornhald flung out a hand, pointing at Perrin. “I arrest you as a Darkfriend. You will be taken to Amador, and there tried under the Dome of Truth.”
Byar stared at his Captain in disbelief. Behind the barrier separating the Whitecloaks from the Two Rivers men, angry mutters rose, spears and bills were hefted, bows raised. The farther Whitecloaks began spreading out in a gleaming line under shouted orders from a fellow as big in his armor as Master Luhhan, sliding lances into holders along their saddles, unlimbering short horsebows. At that range they could do little more than cover the escape of Bornhald and the men with him, if they did indeed manage an escape, but Bornhald appeared oblivious of any danger, and of anything at all save Perrin.
“There will be no arrests,” Bran said sharply, “We have decided that. No more arrests without proof of some crime, and proof we believe. You’ll never show me anything to convince me Perrin is a Darkfriend, so you might as well put your hand down.”
“He betrayed my father to his death at Falme,” Bornhald shouted. Rage shook him. “Betrayed him to Darkfriends and Tar Valon witches who murdered a thousand of the Children with the One Power!” Byar nodded vigorously.
Some of the Two Rivers folk shifted uncertainly; word had spread of what Verin and Alanna had done that morning, and the deeds had grown in spreading. Whatever they thought about Perrin, a hundred tales of Aes Sedai, almost all wrong, made for easy belief in Aes Sedai destroying a thousand Whitecloaks. And if they believed that, they might come to believe the rest.
“I betrayed no one,” Perrin said in a loud voice so everyone could hear.  I don’t know whether they are Darkfriends, but I do know they use the One Power in battle.”
“Liar!” Spittle flew from Bornhald’s lips. “The Seanchan are a tale concocted by the White Tower to hide their foul lies!
Bran shook his head wonderingly, pushing his steel cap over to one side so he could scratch his fringe of gray hair. “I don’t know anything about these—Seanchan?—about these Seanchan. What I do know is that Perrin is no Darkfriend, and you are not arresting anybody.”
The situation was growing more dangerous by the minute, Perrin realized. Byar saw it and tugged at Bornhald’s arm, whispering to him, but the Whitecloak captain would not, or perhaps could not, back away now that he had Perrin in front of his eyes. Bran and the Two Rivers men had their heels planted, too; they might not be willing to let the Whitecloaks take him even if he confessed to everything Bornhald claimed. Unless someone tossed some water fast, everything was going to explode like a fistful of dry straw tossed on a forge-fire.
He hated having to think quickly. Loial had the right of it. Hasty thinking led to people being hurt. But he thought he saw a way here. “Are you willing to hold off my arrest, Bornhald? Until the Trollocs are done with? I won’t be going anywhere before then.”
“Why should I hold off?” The man was blind with hate. If he went on, a good many men were going to die, including him most likely, and he could not see. There was no use pointing it out.
“Haven’t you noticed all the farms burning this morning?” Perrin said instead. He made a sweeping gesture that took in all the dwindling plumes of smoke. “Look around. You said it yourself. The Trollocs aren’t content with raiding a farm or two each night anymore. They’re up to raiding villages. If you try to make it back to Watch Hill, you may not get there. You were lucky to come this far. But if you stay here, in Emond’s Field . . . ” Bran rounded on him, and other men shouted loud noes; Faile rode close and seized his arm, but he ignored all of them. “ . . . you will know where I am, and your soldiers will be welcome to help our defenses.”
“Are you sure about this, Perrin?” Bran said, grabbing Stepper’s stirrup, while from the other side Faile said urgently, “No, Perrin! It is too great a risk.  You must not do this!”
“I won’t have men fighting men if I can stop it,” he told them firmly. “We are not going to do the Trollocs’ work for them.”
Faile practically flung his arm away. Scowling at Bornhald, she produced a sharpening stone from her pouch and a knife from somewhere, and began honing the blade with a silk-soft whisk-whisk.
“Hari Coplin won’t know what to think, now,” Bran said wryly.  “You have heard his terms. Now hear mine. If you come into Emond’s Field, you arrest no one without the say-so of the Village Council, which you will not get, so you arrest no one. You don’t go into anybody’s house unless you are asked. You make no trouble, and you share in the defense where and when you’re asked. And I don’t want to so much as smell a Dragon’s Fang! Will you agree? If not, you can ride back as you came.” Byar stared at the round man as if a sheep had reared up on its hind legs and offered to wrestle.
Bornhald never took his eyes off Perrin. “Done,” he said at last. “Until the Trolloc threat is gone, done!” Wrenching his horse around, he galloped back toward the line of his men, snowy cloak billowing behind him.
As the Mayor ordered the wagons rolled aside, Perrin realized that Luc was looking at him. The fellow sat slumped easily in his saddle, a languorous hand on his sword hilt, blue eyes amused.
“I thought you would object,” Perrin said, “the way I hear you’ve been talking people up against the Whitecloaks.”
Luc spread his hands smoothly. “If these people want Whitecloaks among them, let them have Whitecloaks. But you should be careful, young Goldeneyes. I know something of taking an enemy into your bosom. His blade goes in quicker when he is close.” With a laugh, he pushed his stallion off through the crowd, back into the village.
“He is right,” Faile said, still stropping her knife on the stone. “Perhaps this Bornhald will keep his word not to arrest you, but what is to stop one of his men from putting a blade in your back? You should not have done this.”
“I had to,” he told her. “Better than doing the Trollocs’ work.”
The Whitecloaks were beginning to ride in, Bornhald and Byar at their head. Those two glared at him with unabated hatred, and the others, riding by in pairs . . . Cold, hard eyes in cold, hard faces swung to regard him as they passed. They did not hate, but they saw a Darkfriend when they saw him. And Byar, at least, was capable of anything.
He had had to do it, but he thought maybe it would not be such a bad idea to let Dannil and Ban and the others follow him around the way they wanted to. He was not going to be able to sleep easy without somebody guarding his door. Guards. Like some fool lord. At least Faile would be happy. If only he could make them lose that banner somewhere.


The newer version of the Fusion3D viewer is based on Qt. The core of OpenInventor is OS independent as is the Coin3d library implementation. Low-level OS-dependent functions are implemented in several bridge libraries. SoQt is a bridge to Qt which in turn interfaces with a number of OSs. (Quarter is a newer bridge library to Qt but is lighter weight and does not have some of the key viewer functionality that Fusion3D depends on.)
Pros: The implementation is 64-bit allowing much more memory so that much bigger maps can be accomodated. Qt interfaces with a large number of OS's and has been tested with both Windows and Ubuntu. It should be relatively to simple to port to virtually any other platform that supports OpenGL.
Cons: Qt does not support the SpaceNavigator so this functionality has been lost -- it could probably be reimplemented at a very low level but that would probably require a lot of effort. (The loss of the SpaceNavigator was offset somewhat by adding the ability to pan using the right mouse button.)
The older version based on Microsoft Foundation Classes (MFC) has been retained. This version uses the SoWin library bridge to MFC.
Pros: It does retain the SpaceNavigator.
Cons: The SoWin library is 32-bit only and MFC is Windows only, so this version is limited to 32-bit Windows.
If GDAL is installed then this environment variable may be set, but if it is not then try the following options:
GDAL_DATA should point to a subdirectory supplied with the GDAL distribution where various .csv files and other text files describe various coordinate systems (directory 'gdal_data' in some Windows distributions, 'share/gdal' in some linux distributions). PROJ_LIB should be the path to the file proj.db (not including the filename itself). 1. If possible, add the definitions to the system or user environment variables. For linux, add the paths to the file '/etc/environment' something like GDAL_DATA="/usr/share/gdal" PROJ_LIB="/usr/share/proj" Restart or otherwise ensure that the new environment variables are incorporated 2a. If GDAL_DATA is unset at runtime, Fusion3D will set it to a subdirectory within the install directory GDAL_DATA=/Fusion3D/bin/GDAL/gdal-data This works on Windows for the Release version of the code but not the Debug version 2b. If PROJ_LIB is unset at runtime, Fusion3D will set it to a subdirectory within the install directory PROJ_LIB= /Fusion3D/bin/GDAL/proj6/share This works on Windows for the Release version of the code but not the Debug version 3. For Windows and Visual Studio, you can set an environment variable within Visual Studio Project Properties -> Configuration Properties -> Debugging -> Environment set environment variable (eg GDAL_DATA=C:\Fusion3D\bin\GDAL\gdal-data)
We used only the A1 tile of the 4 available, and further cropped the point cloud to minimize the Fusion3D distribution download. We derived DSMs from the downloaded A1 point cloud using the ARL 'gridder' utility. This utility produces two DSMs: a last-hit (a2) DSM and a first-hit (a1) DSM.
The point cloud was cropped to the upper-left corner of the image to minimize size. It was also culled with another ARL utility to eliminate point-cloud points very near the last-hit DSM. This is not necessary for the viewer but was done to illustrate how the DSM and point cloud can be used together. It has 2 advantages: It reduces the cloud size (and total dataset size) by about half and it also reduces visual clutter.
The executable for the 4 utilities should be included in the Qt version of the Fusion3D bin directory.
The code was originally written to create DEMS from very large collections of point-cloud files. It was used to make maps for Woson North Korea and for Montreal. It has the capacity to process hundreds of point-cloud files at a time and create very large maps made up of multiple DEM tiles.
The gridding technique used by BuckEye and others was very poor for our purposes and the approach used here is much better (see various Dammann papers and symposium presentations).
The code has been tested on relatively clean .las point-cloud files (as would be generated by a good linear-mode lidar). Only points that are very far from the average surface and that are certainly noise are filtered out. It has also been tested on a few very particular .bpf point-cloud files that have been processed by the FINE algorithm (see below). It the input filetype is .bpf, it is assumed that it is this subtype and processed accordingly.
The code sometimes crashed when run in Debug mode. The issue appeared to be with GDAL and have to do with the GDAL class OGRSpatialReference. There were no issues in Release mode. GDAL provides executables for Windows only for Release mode, so this may be what causes the problem.
When the files are culled, they have to be combined with the DSM since they lose almost all their smooth areas like grass and roof tops. The combination looks better since the point clouds add clutter to the DSM and the point clouds are denser also. So culling is useful if the 2 datasets are combined.
The culling process takes some time, so we implemented it in a separate utility. We made the ROI larger than default (1280x1280 rather than 128x128) and that sped up the computations greatly. With default values it was spending most of its time rereading the elevation data for new ROIs.
One specifies all all point cloud files within a directory that match a pattern (default *.las). The search is recursive so finds files in subdirectories. Likewise, one finds all DSMs within a directory that match a pattern (default *.tif). One also specifies a culling threshold; all points are culled whose elevation is closer than that threshold to the corresponding DSM elevation.
The output filenames are constructed from the input point cloud filenames by inserting "_cull". For example the input file test.las would generate an output file test_cull.las. The process is to read a block of point cloud data from the input file, cull it, then write it out. Therefore, it should be able to read arbitrarily large files without memory problems.
The resulting texture image will be just large enough to encompass all the input files and will be black in any areas where there is no input data. The code moves file-by-file, summing each input pixel from that file into the appropriate (downsampled) mosaic pixel. Thus every output pixel is the average of all the input pixels that overlap it. The code is currently implemented for MrSID and GeoTiff input files and a GeoTiff output file. It cannot write MrSID files since we do not have a license to write MrSID (only to read these files). Since the Fusion3D viewer reads the resulting output file only once at full resolution, there is not a significant advantage of MrSID over GeoTiff anyway.
A limitation of the current implementation is that it doesn't do well with making a mosaic from grayscale images. These cant be matched nicely with color MrSID imagery. Adding false color to the images could be done as it is in the Fusion3D viewer but this would require associated elevation images, greatly complicating the implementation and the user interface. The Fusion3D viewer is also not yet capable of adding false color to a grayscale mosaic.
| Library | Version | Release | Debug | Notes |
|---|---|---|---|---|
| Tested | ||||
| Coin3d | 4.0 | Required | Required | Core graphics library inplementing the OpenInventor API |
| SoQt | 1.6.0 | Required | Required | Bridge library implementing OS-dependent OpenInventor functions through Qt |
| Qt | 5.12.6 | Required | Required | Multi-platform operating system interface |
| GDAL | 3.1.2 | Required | Required | General-purpose library for import/export of vector and raster file formats |
| MrSID | 9.5.4 | Required | Required | Import only library for MrSID images (used for texturing the DEM maps) |
| Libkml | 2.2 | Not Needed | Required | Import/export of KML files |
| assimp | 5.0.1 | Optional | Optional | No core functionality but necessary to overlay CAD models onto the maps |
1. Assimp library is required only to overlay CAD models onto the terrain maps. It can import many CAD formats including .obj, COLLADA 2. GDAL includes a release version of the KML libraries However, for Visual Studio Libkml is written to be internal to the calling code rather than accessed through a .dll, the release libraries are inconsistent with the debug version, and a debug version of Libkml is required.
Set environment variable to provide the path to platform-specific plugins: QT_QPA_PLATFORM_PLUGIN =\plugins\platforms
The premade solution is set up to build both Release and Debug in x64. It is included in subdirectory build/msvc2017. The Visual Studio solution can be extended to x86 but this will require extra editing.
Building with Visual Studio and Qt requires that the Visual Studio Qt Addin be installed. This addin is available free as a .vsix file that will automatically install when opened.
The following changes will probably have to be made to the solution:
The optional Assimp library: Library included in the premade solution To remove it: All Projects -> Properties -> C/C++ -> Preprocessor -> Preproc Defs: Delete LIBS_ASSIMP Fusion3D/TestAdelaide Projects -> Properties -> Linker -> Input: delete assimp-vc141-mt.lib Modify paths to Include Directories for the external libraries listed above lfusion3d Project -> Properties -> C/C++ -> General -> Additional Include Dirs: modify paths Modify paths to Library Directories for the external libraries listed above Fusion3D/TestAdelaide Projects -> Properties -> Linker -> General: modify paths
In file:If this is not possible, then you can redefine the the __GNUC__ value in the internals.h file like the following\MrSID_DSDK-<IP_ADDRESS>09-win64-vc15\Raster_DSDK\include\lt_platform.h Change line: #if (defined(__GNUC__) || defined(__GNUG__)) && (3 <= __GNUC__ && __GNUC__ <= 5) To line: #if (defined(__GNUC__) || defined(__GNUG__)) && (3 <= __GNUC__ && __GNUC__ <= 9) // Any number >= to current compiler version
#define __GNUC__ 5This will generate warnings but it appears it has no ill effect.


From setting up a new office or revamping an existing one. We will run all the background tasks to get your business running smoothly. We believe in matching IT systems with your business requirements with the opportunity to extend as your business expands. Everything is offered as a fixed rate so there are no hidden costs or overheads.
Once your office is set up and running we continue to monitor your service remotely and can trouble shoot problems early. Where necessary we provide technical support to ensure running of your business is not disrupted.
We have some great support options. Some start from as little as $25 per month. Please give us a call for prices and discounts.


{% extends "base.html" %} {% block content %}
Unfortunately, due to an overwhelming number of applications, you were not admitted in the first round of acceptances, so you have been placed on a waiting list. We will be accepting students on the waitlist on a rolling basis, so make sure to stay tuned for any updates.