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