/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_rendering_Texture_idl__
#define __com_sun_star_rendering_Texture_idl__

#ifndef __com_sun_star_geometry_AffineMatrix2D_idl__
#include <com/sun/star/geometry/AffineMatrix2D.idl>
#endif
#ifndef __com_sun_star_rendering_StrokeAttributes_idl__
#include <com/sun/star/rendering/StrokeAttributes.idl>
#endif

module com { module sun { module star { module rendering {

published interface XBitmap;
published interface XParametricPolyPolygon2D;

/** Contains all information needed to define a texture.<p>

    This structure contains all information necessary to define a
    texture. A texture describes the filled area of polygonal shapes,
    providing its own transformation matrix, repeat mode, and
    transparency.<p>

    To achieve uniformity, if this texture has a bitmap set, it is
    scaled in such a way that it will cover the same [0,1]x[0,1] box
    as the hatch and the gradient. The transformation member can then
    be used to scale the complete texture as it fits suit.<p>

    @since OOo 2.0
 */
published struct Texture
{
    /** Texture transformation from texture to primitive space.<p>

        This member allows arbitrary transformations of the texture,
        relative to the textured primitive. Thus, the total
        transformation from the [0,1]x[0,1] texture space to the
        device coordinate space is the concatenation of texture,
        render state, and view state transformation (with only render
        state and view state transformation being applied to the
        textured primitive).<p>
     */
    ::com::sun::star::geometry::AffineMatrix2D	AffineTransform;

    //-------------------------------------------------------------------------

    /** Overall transparency of the texturing.<p>

        The valid range for this value is [0,1], where 0 denotes
        complete transparency, and 1 denotes fully opaque.<p>
     */
    double					                    Alpha;

    //-------------------------------------------------------------------------

    /** Specifies the number of parameterized polygons used for the texture.<p>

        This member specifies the number of polygons the parametric
        polygon interface is queried. The continuous range [0,1] of
        the XParametricPolyPolygon::getOutline() method is divided up
        into numberOfHatchPolygons equal parts, and for everyone of
        these parts, the start of the interval is plugged into the
        getOutline method. For example, if numberOfHatchPolygons is 2,
        then getOutline is called twice, once with 0.0 and once with
        0.5. Use this parameter to control the density of the
        hatching.<p>
     */
    long					                    NumberOfHatchPolygons;

    //-------------------------------------------------------------------------

    /** Texture bitmap.<p>

        This member can be used together with gradient and hatching.<p>

        The bitmap is scaled to a one-by-one rectangle, to cover the
        same area as both the gradient and the hatching.<p>
    */
    XBitmap					                    Bitmap;

    //-------------------------------------------------------------------------

    /** Texture gradient.<p>

        This member can be used together with bitmap and hatching. The
        parametric polygons color value is used to fill the returned
        polygonal outlines.<p>
     */
    XParametricPolyPolygon2D                    Gradient;

    //-------------------------------------------------------------------------

    /** Texture hatching.<p>

        This member can be used together with bitmap and gradient. The
        parametric polygons color value is used to stroke the returned
        polygonal outlines.<p>
     */
    XParametricPolyPolygon2D                    Hatching;

    //-------------------------------------------------------------------------

    /** Specifies the stroke attributes used for hatching.<p>

        Use 0.0 as the strokeWidth here to indicate hair lines.<p>
     */
    StrokeAttributes		                    HatchAttributes;

    //-------------------------------------------------------------------------

    /** Repeat mode of the texture, x direction.<p>

        The repeat mode is separated into x and y direction, this is
        the x direction part. Permissible values are from the
        <type>TexturingMode</type> constants.<p>
    */
    byte				                        RepeatModeX;

    /** Repeat mode of the texture, y direction.<p>

        The repeat mode is separated into x and y direction, this is
        the y direction part. Permissible values are from the
        <type>TexturingMode</type> constants.<p>
    */
    byte				                        RepeatModeY;

};

}; }; }; };

#endif
