test_texture_examples.cpp

Back to Textures

test/pastel/gfx/

// Description: More testing for Textures
// DocumentationOf: textures.h

#include "test/test_init.h"

#include <test/pastel/gfx/test_pastelgfx.h>

#include <pastel/gfx/color.h>
#include <pastel/gfx/texture.h>
#include <pastel/gfx/drawing.h>
#include <pastel/gfx/image_file/pcx.h>
#include <pastel/gfx/image_gfxrenderer.h>
#include <pastel/gfx/gfxrenderer_tools.h>

TEST_CASE("Transform (TextureExample)")
{
    Texture<Color>* inputTexture = 
        gfxStorage().get<EwaImage_Texture<Color>*>("lena_texture");
    ENSURE(inputTexture);

    AffineTransformation<real> transform = affineRotation<real>(2, 0, 1, constantPi<real>() / 6);
    transform.translation() += 0.25;

    Transform_Texture<Color> distortedTexture =
        transformTexture(*inputTexture, transform);

    Array<Color> image(Vector2i(512, 512));
    drawBox(AlignedBox2(Vector2(0, 0), Vector2(image.extent())),
        distortedTexture,
        arrayView(image));

    savePcx(image, "transform_texture.pcx");
}

TEST_CASE("Radial (TextureExample)")
{
    EwaImage_Texture<Color>& texture = 
        *gfxStorage().get<EwaImage_Texture<Color>*>("lena_texture");          

    Array<Color, 2> image(Vector2i(768, 256));

    real minRadius = 0.25;
    real maxRadius = 0.5;
    real angleBegin = constantPi<real>() / 10;

    const real angleEnd = 1.2423 * constantPi<real>();

    Radial_Texture<Color> distortedTexture =
        radialTexture(texture, Vector2(0.5),
        Vector2(minRadius, angleBegin), Vector2(maxRadius, angleEnd));

    AffineTransformation<real> textureFlip(
        matrix2x2<real>(0, 1,
                1, 0),
        Vector2(0, 0));

    Transform_Texture<Color> flippedTexture = 
        transformTexture(distortedTexture, textureFlip);

    drawBox(
        AlignedBox2(0, 0, image.width(), image.height()),
        flippedTexture,
        arrayView(image));

    transform(arrayView(image), fitColor);

    savePcx(image, "radial_texture.pcx");

    {
        Array<Color, 2> image(Vector2i(512, 512));

        drawBox(
            AlignedBox2(0, 0, image.width(), image.height()),
            texture,
            arrayView(image));

        Image_GfxRenderer<Color> renderer;
        renderer.setImage(&image);
        renderer.setFilled(false);
        renderer.setColor(Color(0, 1, 0));
        renderer.setViewWindow(
            AlignedBox2(0, 0, 1, 1));

        drawCircle(renderer, Sphere2(Vector2(0.5), minRadius), 40);
        drawCircle(renderer, Sphere2(Vector2(0.5), maxRadius), 40);
        drawSegment(renderer, Vector2(0.5) + Segment2(
            transformPoint(affineRotation<real>(2, 0, 1, angleBegin), Vector2(minRadius, 0)),
            transformPoint(affineRotation<real>(2, 0, 1, angleBegin), Vector2(maxRadius, 0))));
        drawSegment(renderer, Vector2(0.5) + Segment2(
            transformPoint(affineRotation<real>(2, 0, 1, angleEnd), Vector2(minRadius, 0)),
            transformPoint(affineRotation<real>(2, 0, 1, angleEnd), Vector2(maxRadius, 0))));

        savePcx(image, "radial_texture_input.pcx");
    }
}