corona  1.0.2
SaveTGA.cpp
Go to the documentation of this file.
00001 #ifdef _MSC_VER
00002 #pragma warning(disable : 4786)
00003 #endif
00004 
00005 
00006 #include <memory>
00007 #include <png.h>
00008 #include "Debug.h"
00009 #include "Save.h"
00010 #include "Utility.h"
00011 
00012 
00013 namespace corona {
00014 
00015   bool SaveTGA(File* file, Image* source) {
00016     COR_GUARD("SaveTGA");
00017 
00018     std::auto_ptr<Image> image(CloneImage(source, PF_B8G8R8A8));
00019     if (!image.get()) {
00020       return false;
00021     }
00022 
00023     const int width  = image->getWidth();
00024     const int height = image->getHeight();
00025 
00026     // generate the header
00027     byte header[18];
00028     header[0] = 0;               // id_length
00029     header[1] = 0;               // cm_type
00030     header[2] = 2;               // image_type (uncompressed true color)
00031     write16_le(header + 3,  0);  // cm_first
00032     write16_le(header + 5,  0);  // cm_length
00033     header[7] = 0;               // cm_entry_size
00034     write16_le(header + 8,  0);  // x_origin
00035     write16_le(header + 10, 0);  // y_origin
00036     write16_le(header + 12, width);
00037     write16_le(header + 14, height);
00038     header[16] = 32;             // pixel_depth
00039     header[17] = (1 << 5) | 7;   // origin at upper/left, 8 bits of alpha data
00040 
00041     if (file->write(header, 18) != 18) {
00042       return false;
00043     }
00044 
00045     // write pixels
00046     const int data_size = width * height * 4;
00047     if (file->write(image->getPixels(), data_size) != data_size) {
00048       return false;
00049     }
00050 
00051     return true;
00052   }
00053 
00054 }