1 /*
2     Copyright (c) 2008-2009 NetAllied Systems GmbH
3 
4     This file is part of COLLADAStreamWriter.
5 
6     Licensed under the MIT Open Source License,
7     for details please see LICENSE file or the website
8     http://www.opensource.org/licenses/mit-license.php
9 */
10 
11 #include "COLLADASWFormatHint.h"
12 #include "COLLADASWConstants.h"
13 
14 namespace COLLADASW
15 {
16 
17     // ----------------------------------------
FormatHint()18     FormatHint::FormatHint( )
19         : ElementWriter ( NULL )
20         , BaseExtraTechnique ()
21         , mIsInitialized ( false )
22         , mPrecision ( UNKNOWN_PRECISION )
23     {
24 
25     }
26 
27     // ----------------------------------------
FormatHint(StreamWriter * streamWriter,Channels channels,Range range)28     FormatHint::FormatHint( StreamWriter* streamWriter, Channels channels, Range range )
29         : ElementWriter ( streamWriter )
30         , BaseExtraTechnique ()
31         , mIsInitialized ( true )
32         , mChannels ( channels )
33         , mRange ( range )
34         , mPrecision ( UNKNOWN_PRECISION )
35     {
36 
37     }
38 
39     // ----------------------------------------
addOption(Option option)40     void FormatHint::addOption( Option option )
41     {
42         mOptions.push_back ( option );
43     }
44 
45     // ----------------------------------------
setPrecision(Precision precision)46     void FormatHint::setPrecision( Precision precision )
47     {
48         mPrecision = precision;
49     }
50 
51     // ----------------------------------------
getChannelsString(Channels channel)52     const String& FormatHint::getChannelsString( Channels channel )
53     {
54         switch ( channel )
55         {
56         case RGB: return CSWC::CSW_CHANNEL_RGB; break;
57         case RGBA: return CSWC::CSW_CHANNEL_RGBA; break;
58         case L: return CSWC::CSW_CHANNEL_L; break;
59         case LA: return CSWC::CSW_CHANNEL_LA; break;
60         case D:  return CSWC::CSW_CHANNEL_D; break;
61         case XYZ:  return CSWC::CSW_CHANNEL_XYZ; break;
62         case XYZW: return CSWC::CSW_CHANNEL_XYZW; break;
63         default:
64             fprintf ( stderr, "Unknown channel! Cannot proceed!" );
65             return CSWC::EMPTY_STRING;
66         }
67     }
68 
69     // ----------------------------------------
getRangeString(Range range)70     const String& FormatHint::getRangeString( Range range )
71     {
72         switch ( range )
73         {
74         case SNORM: return CSWC::CSW_RANGE_SNORM; break;
75         case UNORM: return CSWC::CSW_RANGE_UNORM; break;
76         case SINT: return CSWC::CSW_RANGE_SINT; break;
77         case UINT: return CSWC::CSW_RANGE_UINT; break;
78         case FLOAT:  return CSWC::CSW_RANGE_FLOAT; break;
79         default:
80             fprintf ( stderr, "Unknown range! Cannot proceed!" );
81             return CSWC::EMPTY_STRING;
82         }
83     }
84 
85     // ----------------------------------------
getPrecisionString(Precision precision)86     const String& FormatHint::getPrecisionString( Precision precision )
87     {
88         switch ( precision )
89         {
90         case LOW: return CSWC::CSW_PRECISION_LOW; break;
91         case MID: return CSWC::CSW_PRECISION_MID; break;
92         case HIGH: return CSWC::CSW_PRECISION_HIGH; break;
93         default:
94             fprintf ( stderr, "Unknown precision! Cannot proceed!" );
95             return CSWC::EMPTY_STRING;
96         }
97     }
98 
99     // ----------------------------------------
getOptionString(Option option)100     const String& FormatHint::getOptionString( Option option )
101     {
102         switch ( option )
103         {
104         case SRGB_GAMMA: return CSWC::CSW_OPTION_SRGB_GAMMA; break;
105         case NORMALIZED3: return CSWC::CSW_OPTION_NORMALIZED3; break;
106         case NORMALIZED4: return CSWC::CSW_OPTION_NORMALIZED4; break;
107         case COMPRESSABLE: return CSWC::CSW_OPTION_COMPRESSABLE; break;
108         default:
109             fprintf ( stderr, "Unknown option! Cannot proceed!" );
110             return CSWC::EMPTY_STRING;
111         }
112     }
113 
114     // ----------------------------------------
add() const115     void FormatHint::add() const
116     {
117         if ( mIsInitialized )
118         {
119             mSW->openElement ( CSWC::CSW_ELEMENT_FORMAT_HINT );
120 
121             mSW->openElement ( CSWC::CSW_ELEMENT_CHANNELS );
122             mSW->appendValues ( getChannelsString ( mChannels ) );
123             mSW->closeElement();
124 
125             mSW->openElement ( CSWC::CSW_ELEMENT_RANGE );
126             mSW->appendValues ( getRangeString ( mRange ) );
127             mSW->closeElement();
128 
129             if ( mPrecision != UNKNOWN_PRECISION )
130             {
131                 mSW->openElement ( CSWC::CSW_ELEMENT_PRECISION );
132                 mSW->appendValues ( getPrecisionString ( mPrecision ) );
133                 mSW->closeElement();
134             }
135 
136             for ( size_t i=0; i<mOptions.size(); ++i )
137             {
138                 mSW->openElement ( CSWC::CSW_ELEMENT_OPTION );
139                 mSW->appendValues ( getOptionString ( mOptions[i] ) );
140                 mSW->closeElement();
141             }
142 
143             mSW->closeElement ();
144         }
145     }
146 
147 }
148