예제 #1
0
void Path::addPath (const Path& other,
                    const AffineTransform& transformToApply)
{
    size_t i = 0;
    const float* const d = other.data.elements;

    while (i < other.numElements)
    {
        const float type = d [i++];

        if (type == closeSubPathMarker)
        {
            closeSubPath();
        }
        else
        {
            float x = d[i++];
            float y = d[i++];
            transformToApply.transformPoint (x, y);

            if (type == moveMarker)
            {
                startNewSubPath (x, y);
            }
            else if (type == lineMarker)
            {
                lineTo (x, y);
            }
            else if (type == quadMarker)
            {
                float x2 = d [i++];
                float y2 = d [i++];
                transformToApply.transformPoint (x2, y2);

                quadraticTo (x, y, x2, y2);
            }
            else if (type == cubicMarker)
            {
                float x2 = d [i++];
                float y2 = d [i++];
                float x3 = d [i++];
                float y3 = d [i++];
                transformToApply.transformPoints (x2, y2, x3, y3);

                cubicTo (x, y, x2, y2, x3, y3);
            }
            else
            {
                // something's gone wrong with the element list!
                jassertfalse;
            }
        }
    }
}
예제 #2
0
//==============================================================================
void Path::applyTransform (const AffineTransform& transform) noexcept
{
    bounds.reset();
    bool firstPoint = true;
    float* d = data.elements;
    float* const end = d + numElements;

    while (d < end)
    {
        const float type = *d++;

        if (type == moveMarker)
        {
            transform.transformPoint (d[0], d[1]);

            if (firstPoint)
            {
                firstPoint = false;
                bounds.reset (d[0], d[1]);
            }
            else
            {
                bounds.extend (d[0], d[1]);
            }

            d += 2;
        }
        else if (type == lineMarker)
        {
            transform.transformPoint (d[0], d[1]);
            bounds.extend (d[0], d[1]);
            d += 2;
        }
        else if (type == quadMarker)
        {
            transform.transformPoints (d[0], d[1], d[2], d[3]);
            bounds.extend (d[0], d[1], d[2], d[3]);
            d += 4;
        }
        else if (type == cubicMarker)
        {
            transform.transformPoints (d[0], d[1], d[2], d[3], d[4], d[5]);
            bounds.extend (d[0], d[1], d[2], d[3]);
            bounds.extend (d[4], d[5]);
            d += 6;
        }
    }
}
void Direct2DLowLevelGraphicsContext::pathToGeometrySink (const Path& path, ID2D1GeometrySink* sink, const AffineTransform& transform)
{
    Path::Iterator it (path);

    while (it.next())
    {
        switch (it.elementType)
        {
            case Path::Iterator::cubicTo:
            {
                D2D1_BEZIER_SEGMENT seg;

                transform.transformPoint (it.x1, it.y1);
                seg.point1 = D2D1::Point2F (it.x1, it.y1);

                transform.transformPoint (it.x2, it.y2);
                seg.point2 = D2D1::Point2F (it.x2, it.y2);

                transform.transformPoint(it.x3, it.y3);
                seg.point3 = D2D1::Point2F (it.x3, it.y3);

                sink->AddBezier (seg);
                break;
            }

            case Path::Iterator::lineTo:
            {
                transform.transformPoint (it.x1, it.y1);
                sink->AddLine (D2D1::Point2F (it.x1, it.y1));
                break;
            }

            case Path::Iterator::quadraticTo:
            {
                D2D1_QUADRATIC_BEZIER_SEGMENT seg;

                transform.transformPoint (it.x1, it.y1);
                seg.point1 = D2D1::Point2F (it.x1, it.y1);

                transform.transformPoint (it.x2, it.y2);
                seg.point2 = D2D1::Point2F (it.x2, it.y2);

                sink->AddQuadraticBezier (seg);
                break;
            }

            case Path::Iterator::closePath:
            {
                sink->EndFigure (D2D1_FIGURE_END_CLOSED);
                break;
            }

            case Path::Iterator::startNewSubPath:
            {
                transform.transformPoint (it.x1, it.y1);
                sink->BeginFigure (D2D1::Point2F (it.x1, it.y1), D2D1_FIGURE_BEGIN_FILLED);
                break;
            }
        }
    }
}
const D2D1_POINT_2F Direct2DLowLevelGraphicsContext::pointTransformed (int x, int y, const AffineTransform& transform)
{
    transform.transformPoint (x, y);
    return D2D1::Point2F ((FLOAT) x, (FLOAT) y);
}