void TexturePacker::save_resources(const CL_String &filename) { // Map containing generated texture filenames for packed CL_Textures std::map<CL_Texture, CL_String> generated_texture_filenames; int generated_texture_index = 0; CL_String images_pathname = CL_PathHelp::get_fullpath(filename); // Loop through all resource items std::vector<ResourceItem *> &items = get_resource_items(); std::vector<ResourceItem *>::size_type item_index, item_size; item_size = items.size(); for(item_index = 0; item_index < item_size; ++item_index) { SpriteResourceItem *sprite_item = dynamic_cast<SpriteResourceItem *>(items[item_index]); if (sprite_item) process_resource(sprite_item->resource, sprite_item->packed_sub_textures, generated_texture_filenames, generated_texture_index, images_pathname); ImageResourceItem *image_item = dynamic_cast<ImageResourceItem *>(items[item_index]); if (image_item) process_resource(image_item->resource, image_item->packed_sub_textures, generated_texture_filenames, generated_texture_index, images_pathname); } // Save the entire resource DOM resources.save(filename); }
clan::TextureGroup *TexturePacker::pack(clan::Canvas &canvas, const clan::Size &texture_size, int border_size, bool sort_on_width) { clan::TextureGroup *group = new clan::TextureGroup(texture_size); std::vector<ResourceItem *> items = get_resource_items(); if(sort_on_width) std::sort(items.begin(), items.end(), ImageWidthSortPredicate); std::vector<ResourceItem *>::size_type item_index, item_size; item_size = items.size(); for(item_index = 0; item_index < item_size; ++item_index) { SpriteResourceItem *sprite_item = dynamic_cast<SpriteResourceItem *>(items[item_index]); if(sprite_item) { sprite_item->packed_sub_textures.clear(); unsigned int size = sprite_item->sprite.get_frame_count(); for(unsigned int index = 0; index < size; ++index) { clan::Size frame_size = sprite_item->sprite.get_frame_size(index); clan::Subtexture sub_texture = group->add(canvas, clan::Size(frame_size.width + border_size*2, frame_size.height + border_size*2)); sprite_item->packed_sub_textures.push_back(sub_texture); clan::Subtexture subtexture = sprite_item->sprite.get_frame_texture(index); clan::PixelBuffer pb = subtexture.get_texture().get_pixeldata(canvas, clan::tf_rgba8); pb = pb.copy(subtexture.get_geometry()); last_border_size = border_size; if (last_border_size < 0) last_border_size= 0; clan::PixelBuffer new_pb = clan::PixelBufferHelp::add_border(pb, border_size, pb.get_size()); sub_texture.get_texture().set_subimage(canvas, sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size()); } } ImageResourceItem *image_item = dynamic_cast<ImageResourceItem *>(items[item_index]); if(image_item) { image_item->packed_sub_textures.clear(); clan::Size frame_size = image_item->image.get_size(); clan::Subtexture sub_texture = group->add(canvas, clan::Size(frame_size.width + border_size*2, frame_size.height + border_size*2)); image_item->packed_sub_textures.push_back(sub_texture); clan::Subtexture subtexture = image_item->image.get_texture(); clan::PixelBuffer pb = subtexture.get_texture().get_pixeldata(canvas, clan::tf_rgba8); pb = pb.copy(subtexture.get_geometry()); last_border_size = border_size; if (last_border_size < 0) last_border_size = 0; clan::PixelBuffer new_pb = clan::PixelBufferHelp::add_border(pb, border_size, pb.get_size()); sub_texture.get_texture().set_subimage(canvas, sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size()); } if(!func_pack_progress.is_null()) func_pack_progress.invoke((int)item_index + 1, (int)item_size); } return group; }
CL_TextureGroup *TexturePacker::pack(CL_GraphicContext &gc, const CL_Size &texture_size, int border_size) { CL_TextureGroup *group = new CL_TextureGroup(gc, texture_size); std::vector<ResourceItem *> &items = get_resource_items(); std::vector<ResourceItem *>::size_type item_index, item_size; item_size = items.size(); for(item_index = 0; item_index < item_size; ++item_index) { SpriteResourceItem *sprite_item = dynamic_cast<SpriteResourceItem *>(items[item_index]); if(sprite_item) { sprite_item->packed_sub_textures.clear(); const std::vector<CL_SpriteDescriptionFrame> &frames = sprite_item->sprite_description.get_frames(); std::vector<CL_SpriteDescriptionFrame>::size_type index, size; size = frames.size(); for(index = 0; index < size; ++index) { CL_Rect frame_rect = frames[index].rect; CL_Subtexture sub_texture = group->add(gc, CL_Size(frame_rect.get_width() + border_size*2, frame_rect.get_height() + border_size*2)); sprite_item->packed_sub_textures.push_back(sub_texture); CL_Texture texture = frames[index].texture; const CL_PixelBuffer &pb = texture.get_pixeldata(); last_border_size = border_size; if (last_border_size < 0) last_border_size= 0; CL_PixelBuffer new_pb = CL_PixelBufferHelp::add_border(pb, border_size, pb.get_size()); sub_texture.get_texture().set_subimage(sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size()); } } ImageResourceItem *image_item = dynamic_cast<ImageResourceItem *>(items[item_index]); if(image_item) { image_item->packed_sub_textures.clear(); const std::vector<CL_SpriteDescriptionFrame> &frames = image_item->sprite_description.get_frames(); std::vector<CL_SpriteDescriptionFrame>::size_type index, size; size = frames.size(); for(index = 0; index < size; ++index) { CL_Rect frame_rect = frames[index].rect; CL_Subtexture sub_texture = group->add(gc, CL_Size(frame_rect.get_width() + border_size*2, frame_rect.get_height() + border_size*2)); image_item->packed_sub_textures.push_back(sub_texture); CL_Texture texture = frames[index].texture; const CL_PixelBuffer &pb = texture.get_pixeldata(); last_border_size = border_size; if (last_border_size < 0) last_border_size = 0; CL_PixelBuffer new_pb = CL_PixelBufferHelp::add_border(pb, border_size, pb.get_size()); sub_texture.get_texture().set_subimage(sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size()); } } if(!func_pack_progress.is_null()) func_pack_progress.invoke((int)item_index + 1, (int)item_size); } return group; }
TextureGroup *TexturePacker::pack(Canvas &canvas, const Size &texture_size, int border_size, bool sort_on_width) { TextureGroup *group = new TextureGroup(texture_size); std::vector<ResourceItem *> items = get_resource_items(); if(sort_on_width) std::sort(items.begin(), items.end(), ImageWidthSortPredicate); std::vector<ResourceItem *>::size_type item_index, item_size; item_size = items.size(); for(item_index = 0; item_index < item_size; ++item_index) { SpriteResourceItem *sprite_item = dynamic_cast<SpriteResourceItem *>(items[item_index]); if(sprite_item) { sprite_item->packed_sub_textures.clear(); const std::vector<SpriteDescriptionFrame> &frames = sprite_item->sprite_description.get_frames(); std::vector<SpriteDescriptionFrame>::size_type index, size; size = frames.size(); for(index = 0; index < size; ++index) { Rect frame_rect = frames[index].rect; Subtexture sub_texture = group->add(canvas, Size(frame_rect.get_width() + border_size*2, frame_rect.get_height() + border_size*2)); sprite_item->packed_sub_textures.push_back(sub_texture); Texture2D texture = frames[index].texture; const PixelBuffer &pb = texture.get_pixeldata(canvas); last_border_size = border_size; if (last_border_size < 0) last_border_size= 0; PixelBuffer new_pb = PixelBufferHelp::add_border(pb, border_size, pb.get_size()); sub_texture.get_texture().set_subimage(canvas, sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size()); } } ImageResourceItem *image_item = dynamic_cast<ImageResourceItem *>(items[item_index]); if(image_item) { image_item->packed_sub_textures.clear(); const std::vector<SpriteDescriptionFrame> &frames = image_item->sprite_description.get_frames(); std::vector<SpriteDescriptionFrame>::size_type index, size; size = frames.size(); for(index = 0; index < size; ++index) { Rect frame_rect = frames[index].rect; Subtexture sub_texture = group->add(canvas, Size(frame_rect.get_width() + border_size*2, frame_rect.get_height() + border_size*2)); image_item->packed_sub_textures.push_back(sub_texture); Texture2D texture = frames[index].texture; const PixelBuffer &pb = texture.get_pixeldata(canvas); last_border_size = border_size; if (last_border_size < 0) last_border_size = 0; PixelBuffer new_pb = PixelBufferHelp::add_border(pb, border_size, pb.get_size()); sub_texture.get_texture().set_subimage(canvas, sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size()); } } if(!func_pack_progress.is_null()) func_pack_progress.invoke((int)item_index + 1, (int)item_size); } return group; }