Ejemplo n.º 1
0
static std::unique_ptr<RuleSet> makeRuleSet(const Vector<RuleFeature>& rules)
{
    size_t size = rules.size();
    if (!size)
        return nullptr;
    auto ruleSet = std::make_unique<RuleSet>();
    for (size_t i = 0; i < size; ++i)
        ruleSet->addRule(rules[i].rule, rules[i].selectorIndex, rules[i].hasDocumentSecurityOrigin ? RuleHasDocumentSecurityOrigin : RuleHasNoSpecialState);
    ruleSet->shrinkToFit();
    return ruleSet;
}
void 
OpenSteer::PolylineSegmentedPathwaySegmentRadii::setPathway( size_type numOfPoints,
                                                             Ogre::Vector3 const points[],
                                                             float const radii[],
                                                             bool closedCycle )
{
    assert( allRadiiNonNegative( radii, radii + radiiCount( numOfPoints, closedCycle ) ) && "All radii must be positive or zero." );
    path_.setPath( numOfPoints, points, closedCycle );
    segmentRadii_.assign( radii, radii + radiiCount( numOfPoints, closedCycle ) );
    shrinkToFit( segmentRadii_ );
    
}
void 
OpenSteer::PolylineSegmentedPath::setPath( size_type numOfPoints,
                                           Vec3 const newPoints[],
                                           bool closedCycle )
{
    assert( 1 < numOfPoints && "Path must have at least two distinct points." );
    // While testing say that no cyclus is used because the first point hasn't 
    // been copied to the back.
    assert( adjacentPathPointsDifferent( newPoints, newPoints + numOfPoints, false ) && "Adjacent path points must be different." );
    
    closedCycle_ = closedCycle;
    
    size_type numberOfPoints = numOfPoints;
    if ( closedCycle_ ) {
        ++numberOfPoints;
    }
    
    points_.reserve( numberOfPoints );
    segmentTangents_.resize( numberOfPoints - 1 );
    segmentLengths_.resize( numberOfPoints - 1 );
    
    points_.assign( newPoints, newPoints + numOfPoints );
    
    if ( closedCycle_ ) {
        points_.push_back( points_[ 0 ] );
    }
    
    updateTangentsAndLengths( points_ , 
                              segmentTangents_, 
                              segmentLengths_, 
                              0, 
                              numOfPoints,
                              closedCycle_ );
    
    shrinkToFit( points_ );
    shrinkToFit( segmentTangents_ );
    shrinkToFit( segmentLengths_ );
}
Ejemplo n.º 4
0
std::unique_ptr<Lines> createLines(RenderBlockFlow& flow)
{
    auto lines = std::make_unique<Lines>();

    RenderText& textRenderer = toRenderText(*flow.firstChild());
    ASSERT(!textRenderer.firstTextBox());

    const RenderStyle& style = *flow.style();
    const unsigned textLength = textRenderer.textLength();

    float wordTrailingSpaceWidth = style.font().width(TextRun(&space, 1));

    LazyLineBreakIterator lineBreakIterator(textRenderer.text(), style.locale());
    int nextBreakable = -1;

    unsigned lineEndOffset = 0;
    while (lineEndOffset < textLength) {
        lineEndOffset = skipWhitespaces(textRenderer, lineEndOffset, textLength);
        unsigned lineStartOffset = lineEndOffset;
        unsigned runEndOffset = lineEndOffset;
        LineWidth lineWidth(flow, false, DoNotIndentText);
        while (runEndOffset < textLength) {
            ASSERT(!isWhitespace(textRenderer.characterAt(runEndOffset)));

            bool previousWasSpaceBetweenRuns = runEndOffset > lineStartOffset && isWhitespace(textRenderer.characterAt(runEndOffset - 1));
            unsigned runStartOffset = previousWasSpaceBetweenRuns ? runEndOffset - 1 : runEndOffset;

            ++runEndOffset;
            while (runEndOffset < textLength) {
                if (runEndOffset > lineStartOffset && isBreakable(lineBreakIterator, runEndOffset, nextBreakable, false))
                    break;
                ++runEndOffset;
            }

            unsigned runLength = runEndOffset - runStartOffset;
            bool includeEndSpace = runEndOffset < textLength && textRenderer.characterAt(runEndOffset) == ' ';
            float wordWidth;
            if (includeEndSpace)
                wordWidth = textWidth(textRenderer, runStartOffset, runLength + 1, lineWidth.committedWidth(), style) - wordTrailingSpaceWidth;
            else
                wordWidth = textWidth(textRenderer, runStartOffset, runLength, lineWidth.committedWidth(), style);

            lineWidth.addUncommittedWidth(wordWidth);
            if (!lineWidth.fitsOnLine()) {
                if (!lineWidth.committedWidth()) {
                    lineWidth.commit();
                    lineEndOffset = runEndOffset;
                }
                break;
            }
            lineWidth.commit();
            lineEndOffset = runEndOffset;
            runEndOffset = skipWhitespaces(textRenderer, runEndOffset, textLength);
        }
        if (lineStartOffset == lineEndOffset)
            continue;

        Line line;
        line.textOffset = lineStartOffset;
        line.textLength = lineEndOffset - lineStartOffset;
        line.width = lineWidth.committedWidth();

        lines->append(line);
    }

    textRenderer.clearNeedsLayout();

    lines->shrinkToFit();
    return lines;
}