Beispiel #1
0
 TileMapPtr LoadTileMapTMX(FileProvider* fp, const char* filename) {
     if (!fp || !filename) return  TileMapPtr();
     GHL::DataStream* ds = fp->OpenFile(filename);
     if (!ds) {
         LogError() << "not found file " << filename;
         return TileMapPtr();
     }
     GHL::Data* tmx_data = GHL_ReadAllData( ds );
     ds->Release();
     sb_assert(tmx_data);
     pugi::xml_document doc;
     pugi::xml_parse_result parse_res = doc.load_buffer(tmx_data->GetData(),
                                                        tmx_data->GetSize(),
                                                        pugi::parse_default, pugi::encoding_utf8);
     tmx_data->Release();
     if (!parse_res) {
         LogError() << "failed parse " << filename;
         LogError() << parse_res.description();
         return TileMapPtr();
     }
     pugi::xml_node n = doc.document_element();
     size_t w = n.attribute("width").as_uint();
     size_t h = n.attribute("height").as_uint();
     TileMapPtr map = TileMapPtr(new TileMap(w,h));
     for (pugi::xml_node_iterator it = n.begin();it!=n.end();++it) {
         if (::strcmp(it->name(), "layer")==0) {
             size_t lw = it->attribute("width").as_uint();
             size_t lh = it->attribute("height").as_uint();
             pugi::xml_node data_node = it->child("data");
             if (data_node) {
                 TileMapLayerPtr layer;
                 if (!data_node.attribute("compression") &&
                     !data_node.attribute("encoding")) {
                     size_t x = 0;
                     size_t y = 0;
                     layer = TileMapLayerPtr(new TileMapLayer(lw,lh));
                     for (pugi::xml_node_iterator ii=data_node.begin(); ii!=data_node.end(); ++ii) {
                         if (::strcmp(ii->name(), "tile")==0) {
                             TileMapLayer::data_t d = ii->attribute("gid").as_uint();
                             layer->SetAt(x, y, d);
                             ++x;
                             if (x>=lw) {
                                 ++y;
                                 x = 0;
                             }
                         }
                     }
                 }
                 if (!layer) {
                     GHL::Data* d = 0;
                     if (::strcmp(data_node.attribute("encoding").as_string(),"base64")==0) {
                         d = Base64DecodeData(data_node.child_value());
                     } else {
                         continue;
                     }
                     if (!d) continue;
                     if (::strcmp(data_node.attribute("compression").as_string(),"zlib")==0) {
                         GHL::UInt32 size = sizeof(GHL::UInt32)*lw*lh;
                         VectorData<GHL::Byte>* dd = new VectorData<GHL::Byte>();
                         dd->vector().resize(size);
                         
                         if( GHL_UnpackZlib(d, dd->vector().data(), &size ) && size == dd->GetSize() ) {
                             d->Release();
                             d = dd;
                         } else {
                             dd->Release();
                             d->Release();
                             continue;
                         }
                     } else if (data_node.attribute("compression")) {
                         LogError() << "unsupported compression " << data_node.attribute("compression").as_string();
                         d->Release();
                         continue;
                     }
                     layer = TileMapLayerPtr(new TileMapLayer(lw,lh,d));
                 }
                 if (layer) {
                     map->SetLayer(it->attribute("name").as_string(), layer);
                 }
             }
         }
     }
     return map;
 }
Beispiel #2
0
 void IndependentMvnSuf::Update(const VectorData &d){
   update_raw(d.value());
 }
Beispiel #3
0
				inline VectorData(VectorData const & vector, Size free_space = 0) : reference_count(1), vectorsize(0), vectorcapacity(vector.size() + free_space), elements(Memory<Element>::allocate(vectorcapacity)) {
					for(;vectorsize < vector.size(); vectorsize++) new (&elements[vectorsize]) Element(vector.elements[vectorsize]);
				}
 void DS::Update(const VectorData &x) {
   n_ += 1.0;
   sumlog_ += log(x.value());
 }