1 /*****************************************************************************/ 2 // TGATranslator 3 // Written by Michael Wilber, OBOS Translation Kit Team 4 // 5 // TGATranslator.h 6 // 7 // This BTranslator based object is for opening and writing TGA files. 8 // 9 // 10 // Copyright (c) 2002 OpenBeOS Project 11 // 12 // Permission is hereby granted, free of charge, to any person obtaining a 13 // copy of this software and associated documentation files (the "Software"), 14 // to deal in the Software without restriction, including without limitation 15 // the rights to use, copy, modify, merge, publish, distribute, sublicense, 16 // and/or sell copies of the Software, and to permit persons to whom the 17 // Software is furnished to do so, subject to the following conditions: 18 // 19 // The above copyright notice and this permission notice shall be included 20 // in all copies or substantial portions of the Software. 21 // 22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 23 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 25 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 28 // DEALINGS IN THE SOFTWARE. 29 /*****************************************************************************/ 30 31 #ifndef TGA_TRANSLATOR_H 32 #define TGA_TRANSLATOR_H 33 34 #include <Translator.h> 35 #include <TranslatorFormats.h> 36 #include <TranslationDefs.h> 37 #include <GraphicsDefs.h> 38 #include <InterfaceDefs.h> 39 #include <DataIO.h> 40 #include <ByteOrder.h> 41 #include "BaseTranslator.h" 42 43 #define TGA_TRANSLATOR_VERSION B_TRANSLATION_MAKE_VERSION(1,0,0) 44 #define TGA_IN_QUALITY 0.7 45 #define TGA_IN_CAPABILITY 0.8 46 #define TGA_OUT_QUALITY 0.7 47 #define TGA_OUT_CAPABILITY 0.6 48 49 #define BBT_IN_QUALITY 0.7 50 #define BBT_IN_CAPABILITY 0.6 51 #define BBT_OUT_QUALITY 0.6 52 #define BBT_OUT_CAPABILITY 0.8 53 54 // TGA Translator Settings 55 #define TGA_SETTING_RLE "tga /rle" 56 #define TGA_SETTING_IGNORE_ALPHA "tga /ignore_alpha" 57 58 // TGA files are stored in the Intel byte order :) 59 struct TGAFileHeader { 60 uint8 idlength; 61 // Number of bytes in the Image ID field 62 uint8 colormaptype; 63 // 0 Has NO color-map (palette) 64 // 1 Has color-map (palette) 65 uint8 imagetype; 66 // 0 No Image Data Included 67 // 1 Uncompressed, Color-mapped image 68 // 2 Uncompressed, True-color image 69 // 3 Uncompressed, Black-and-white (Greyscale?) image 70 // 9 Run-length encoded, Color-mapped image 71 // 10 Run-length encoded, True-color image 72 // 11 Run-length encoded, Black-and-white (Greyscale?) image 73 }; 74 75 #define TGA_NO_COLORMAP 0 76 #define TGA_COLORMAP 1 77 78 #define TGA_NO_IMAGE_DATA 0 79 80 #define TGA_NOCOMP_COLORMAP 1 81 #define TGA_NOCOMP_TRUECOLOR 2 82 #define TGA_NOCOMP_BW 3 83 #define TGA_RLE_COLORMAP 9 84 #define TGA_RLE_TRUECOLOR 10 85 #define TGA_RLE_BW 11 86 87 // Information about the color map (palette). These bytes are 88 // always present, but are zero if no color map is present 89 struct TGAColorMapSpec { 90 uint16 firstentry; // first useful entry in the color map 91 uint16 length; // number of color map entries 92 uint8 entrysize; // number of bits per entry 93 }; 94 95 struct TGAImageSpec { 96 uint16 xorigin; 97 uint16 yorigin; 98 uint16 width; 99 uint16 height; 100 uint8 depth; 101 // pixel depth includes alpha bits! 102 uint8 descriptor; 103 // bits 3-0: number of attribute bits per pixel 104 // bits 5&4: order pixels are drawn to the screen 105 // Screen Dest of Image Origin 106 // first pixel bit 5 bit 4 107 ////////////////////////////////////////// 108 // bottom left 0 0 109 // bottom right 0 1 110 // top left 1 0 111 // top right 1 1 112 // bits 7&6: must be zero 113 }; 114 115 #define TGA_ORIGIN_VERT_BIT 0x20 116 #define TGA_ORIGIN_BOTTOM 0 117 #define TGA_ORIGIN_TOP 1 118 119 #define TGA_ORIGIN_HORZ_BIT 0x10 120 #define TGA_ORIGIN_LEFT 0 121 #define TGA_ORIGIN_RIGHT 1 122 123 #define TGA_DESC_BITS76 0xc0 124 #define TGA_DESC_ALPHABITS 0x0f 125 126 #define TGA_RLE_PACKET_TYPE_BIT 0x80 127 128 #define TGA_HEADERS_SIZE 18 129 130 #define TGA_STREAM_BUFFER_SIZE 1024 131 132 class TGATranslator : public BaseTranslator { 133 public: 134 TGATranslator(); 135 136 virtual status_t DerivedIdentify(BPositionIO *inSource, 137 const translation_format *inFormat, BMessage *ioExtension, 138 translator_info *outInfo, uint32 outType); 139 140 virtual status_t DerivedTranslate(BPositionIO *inSource, 141 const translator_info *inInfo, BMessage *ioExtension, 142 uint32 outType, BPositionIO *outDestination, int32 baseType); 143 144 virtual BView *NewConfigView(TranslatorSettings *settings); 145 146 protected: 147 virtual ~TGATranslator(); 148 // this is protected because the object is deleted by the 149 // Release() function instead of being deleted directly by 150 // the user 151 152 private: 153 uint8 tga_alphabits(TGAFileHeader &filehead, TGAColorMapSpec &mapspec, 154 TGAImageSpec &imagespec); 155 156 status_t translate_from_bits(BPositionIO *inSource, uint32 outType, 157 BPositionIO *outDestination); 158 159 status_t translate_from_tganm_to_bits(BPositionIO *inSource, 160 BPositionIO *outDestination, TGAFileHeader &filehead, 161 TGAColorMapSpec &mapspec, TGAImageSpec &imagespec); 162 163 status_t translate_from_tganmrle_to_bits(BPositionIO *inSource, 164 BPositionIO *outDestination, TGAFileHeader &filehead, 165 TGAColorMapSpec &mapspec, TGAImageSpec &imagespec); 166 167 status_t translate_from_tgamrle_to_bits(BPositionIO *inSource, 168 BPositionIO *outDestination, TGAFileHeader &filehead, 169 TGAColorMapSpec &mapspec, TGAImageSpec &imagespec, uint8 *pmap); 170 171 status_t translate_from_tga(BPositionIO *inSource, uint32 outType, 172 BPositionIO *outDestination); 173 174 }; 175 176 #endif // #ifndef TGA_TRANSLATOR_H 177 178