DecoratorTiled.h

00001 /*
00002  * This source file is part of libRocket, the HTML/CSS Interface Middleware
00003  *
00004  * For the latest information, see http://www.librocket.com
00005  *
00006  * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
00007  *
00008  * Permission is hereby granted, free of charge, to any person obtaining a copy
00009  * of this software and associated documentation files (the "Software"), to deal
00010  * in the Software without restriction, including without limitation the rights
00011  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00012  * copies of the Software, and to permit persons to whom the Software is
00013  * furnished to do so, subject to the following conditions:
00014  *
00015  * The above copyright notice and this permission notice shall be included in
00016  * all copies or substantial portions of the Software.
00017  * 
00018  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00019  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00020  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00021  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00022  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00023  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00024  * THE SOFTWARE.
00025  *
00026  */
00027 
00028 #ifndef ROCKETCOREDECORATORTILED_H
00029 #define ROCKETCOREDECORATORTILED_H
00030 
00031 #include <Rocket/Core/Decorator.h>
00032 #include <Rocket/Core/Vertex.h>
00033 
00034 namespace Rocket {
00035 namespace Core {
00036 
00037 struct Texture;
00038 
00045 class DecoratorTiled : public Decorator
00046 {
00047 public:
00048         DecoratorTiled();
00049         virtual ~DecoratorTiled();
00050 
00055         enum TileRepeatMode
00056         {
00057                 STRETCH = 0,                    // Stretches a single tile across the required surface.
00058                 CLAMP_STRETCH = 1,              // Clamps the tile to the upper left, stretching the tile inwards to fit into the element if it is too small.
00059                 CLAMP_TRUNCATE = 2,             // Clamps the tile to the upper left, truncating the tile to fit into the element if it is too small.
00060                 REPEAT_STRETCH = 3,             // Repeats the tile, stretching the final tile inwards.
00061                 REPEAT_TRUNCATE = 4,    // Repeats the tile, truncating the final tile.
00062         };
00063 
00067         enum TileOrientation
00068         {
00069                 ROTATE_0_CW = 0,                // Rotated zero degrees clockwise.
00070                 ROTATE_90_CW = 1,               // Rotated 90 degrees clockwise.
00071                 ROTATE_180_CW = 2,              // Rotated 180 degrees clockwise.
00072                 ROTATE_270_CW = 3,              // Rotated 270 degrees clockwise.
00073                 FLIP_HORIZONTAL = 4,    // Flipped horizontally.
00074                 FLIP_VERTICAL = 5               // Flipped vertically.
00075         };
00076 
00083         struct Tile
00084         {
00086                 Tile();
00087 
00089                 void CalculateDimensions(Element* element, const Texture& texture);
00091                 Vector2f GetDimensions(Element* element);
00092 
00100                 void GenerateGeometry(std::vector< Vertex >& vertices, std::vector< int >& indices, Element* element, const Vector2f& surface_origin, const Vector2f& surface_dimensions, const Vector2f& tile_dimensions) const;
00101 
00102                 struct TileData
00103                 {
00104                         Vector2f dimensions;
00105                         Vector2f texcoords[2];
00106                 };
00107 
00108                 typedef std::map< RenderInterface*, TileData > TileDataMap;
00109 
00110                 int texture_index;
00111                 Vector2f texcoords[2];
00112                 bool texcoords_absolute[2][2];
00113 
00114                 mutable TileDataMap data;
00115 
00116                 TileRepeatMode repeat_mode;
00117                 TileOrientation orientation;
00118         };
00119 
00120 protected:
00125         void ScaleTileDimensions(Vector2f& tile_dimensions, float axis_value, int axis);
00126 };
00127 
00128 }
00129 }
00130 
00131 #endif