// static Sprite* Sprite::createBasicSprite(doc::PixelFormat format, int width, int height, int ncolors) { // Create the sprite. base::UniquePtr<doc::Sprite> sprite(new doc::Sprite(format, width, height, ncolors)); sprite->setTotalFrames(doc::frame_t(1)); // Create the main image. doc::ImageRef image(doc::Image::create(format, width, height)); doc::clear_image(image.get(), 0); // Create the first transparent layer. { base::UniquePtr<doc::LayerImage> layer(new doc::LayerImage(sprite)); layer->setName("Layer 1"); // Create the cel. { base::UniquePtr<doc::Cel> cel(new doc::Cel(doc::frame_t(0), image)); cel->setPosition(0, 0); // Add the cel in the layer. layer->addCel(cel); cel.release(); // Release the cel because it is in the layer } // Add the layer in the sprite. sprite->folder()->addLayer(layer.release()); // Release the layer because it's owned by the sprite } return sprite.release(); }
Document* Document::createBasicDocument(PixelFormat format, int width, int height, int ncolors) { // Create the sprite. UniquePtr<Sprite> sprite(new Sprite(format, width, height, ncolors)); sprite->setTotalFrames(FrameNumber(1)); // Create the main image. int indexInStock; { UniquePtr<Image> image(Image::create(format, width, height)); // Clear the image with mask color. image_clear(image, 0); // Add image in the sprite's stock. indexInStock = sprite->getStock()->addImage(image); image.release(); // Release the image because it is in the sprite's stock. } // Create the first transparent layer. { UniquePtr<LayerImage> layer(new LayerImage(sprite)); layer->setName("Layer 1"); // Create the cel. { UniquePtr<Cel> cel(new Cel(FrameNumber(0), indexInStock)); cel->setPosition(0, 0); // Add the cel in the layer. layer->addCel(cel); cel.release(); // Release the cel because it is in the layer } // Add the layer in the sprite. sprite->getFolder()->addLayer(layer.release()); // Release the layer because it's owned by the sprite } // Create the document with the new sprite. UniquePtr<Document> document(new Document(sprite)); sprite.release(); // Release the sprite because it is in the document. document->setFilename("Sprite"); return document.release(); // Release the document (it does not throw) returning the raw pointer }
int main(int, char** argv) { Render::RenderSettings settings; settings.windowWidth = 1280; settings.windowHeight = 960; Render::init(settings); Input::InputManager input(&keyPress, NULL, NULL, NULL, NULL, NULL); Render::SpriteGroup cel(argv[1]); max = cel.size(); while(!done) { input.poll(); input.processInput(); Render::clear(); Render::drawAt(cel[celIndex], 0, 0); Render::draw(); } }
int main(int argc, char** argv) { if (argc < 2) { help(argv); return 0; } // Open MPQ HANDLE handle; SFileOpenArchive(argv[1], 0, STREAM_FLAG_READ_ONLY, &handle); FAIO::init(argv[1]); // For now only smaltext.cel Cel::CelDecoder cel("ctrlpan/smaltext.cel"); // Prepare ascii vector according to order in cel file std::vector<int> ascii; for (int i = 'a'; i <= 'z'; i++) ascii.push_back(i); for (int i = '1'; i <= '9'; i++) ascii.push_back(i); ascii.push_back('0'); // I can't find mapping in ascii table for one signs so // I marked it as 255 std::vector<int> asciiSigns = {'-', '=', '+', '(', ')', '[', ']', '"', 255, '`', '\'', ':', ';', ',', '.', '/', '?', '!', '&', '%', '#', '$', '*', '<', '>', '@', '\\', '^', '_', '|', '~'}; ascii.insert(ascii.end(), asciiSigns.begin(), asciiSigns.end()); std::map<int, std::string> mapping; int positionX = 0; for (int32_t i = 0; i < cel.numFrames(); i++) { Cel::CelFrame& frame = cel[i]; int32_t maximumVisibleX = 0; for (int32_t x = 0; x < frame.width(); x++) { for (int32_t y = 0; y < frame.height(); y++) { if (frame.get(x, y).visible) if (x > maximumVisibleX) maximumVisibleX = x; } } std::string asciiStr, positionXStr, maximumVisibleXStr; int asciiIdx = ascii[i]; // Additional 2 pixels for every letter maximumVisibleX += 2; if (maximumVisibleX > frame.width()) maximumVisibleX = frame.width(); // Convert values to string char buffer[10]; sprintf(buffer, "%d", asciiIdx); asciiStr = buffer; sprintf(buffer, "%d", maximumVisibleX); maximumVisibleXStr = buffer; sprintf(buffer, "%d", positionX); positionXStr = buffer; // Create output std::string out = "<char id=\"" + asciiStr + "\" x=\"" + positionXStr + "\" y=\"0\" width=\"" + maximumVisibleXStr + "\" height=\"11\" xoffset=\"0\" yoffset=\"0\" xadvance=\"" + maximumVisibleXStr + "\" />"; mapping[asciiIdx] = out; // Move further positionX += 13; } // Sort by ascii std::sort(ascii.begin(), ascii.end()); for (int i : ascii) { std::cout << mapping[i] << std::endl; } FAIO::FAFileObject::quit(); }
int main() { cel(); return 0; }
static Cel *ase_file_read_cel_chunk(FILE *f, Sprite *sprite, int frame, PixelFormat pixelFormat, FileOp *fop, ASE_Header *header, size_t chunk_end) { /* read chunk data */ int layer_index = fgetw(f); int x = ((short)fgetw(f)); int y = ((short)fgetw(f)); int opacity = fgetc(f); int cel_type = fgetw(f); Layer* layer; ase_file_read_padding(f, 7); layer = sprite->indexToLayer(layer_index); if (!layer) { fop_error(fop, "Frame %d didn't found layer with index %d\n", frame, layer_index); return NULL; } if (!layer->is_image()) { fop_error(fop, "Invalid .ase file (frame %d in layer %d which does not contain images\n", frame, layer_index); return NULL; } // Create the new frame. UniquePtr<Cel> cel(new Cel(frame, 0)); cel->setPosition(x, y); cel->setOpacity(opacity); switch (cel_type) { case ASE_FILE_RAW_CEL: { // Read width and height int w = fgetw(f); int h = fgetw(f); if (w > 0 && h > 0) { Image* image = Image::create(pixelFormat, w, h); // Read pixel data switch (image->getPixelFormat()) { case IMAGE_RGB: read_raw_image<RgbTraits>(f, image, fop, header); break; case IMAGE_GRAYSCALE: read_raw_image<GrayscaleTraits>(f, image, fop, header); break; case IMAGE_INDEXED: read_raw_image<IndexedTraits>(f, image, fop, header); break; } cel->setImage(sprite->getStock()->addImage(image)); } break; } case ASE_FILE_LINK_CEL: { // Read link position int link_frame = fgetw(f); Cel* link = static_cast<LayerImage*>(layer)->getCel(link_frame); if (link) { // Create a copy of the linked cel (avoid using links cel) Image* image = Image::createCopy(sprite->getStock()->getImage(link->getImage())); cel->setImage(sprite->getStock()->addImage(image)); } else { // Linked cel doesn't found return NULL; } break; } case ASE_FILE_COMPRESSED_CEL: { // Read width and height int w = fgetw(f); int h = fgetw(f); if (w > 0 && h > 0) { Image* image = Image::create(pixelFormat, w, h); // Try to read pixel data try { switch (image->getPixelFormat()) { case IMAGE_RGB: read_compressed_image<RgbTraits>(f, image, chunk_end, fop, header); break; case IMAGE_GRAYSCALE: read_compressed_image<GrayscaleTraits>(f, image, chunk_end, fop, header); break; case IMAGE_INDEXED: read_compressed_image<IndexedTraits>(f, image, chunk_end, fop, header); break; } } // OK, in case of error we can show the problem, but continue // loading more cels. catch (const std::exception& e) { fop_error(fop, e.what()); } cel->setImage(sprite->getStock()->addImage(image)); } break; } } Cel* newCel = cel.release(); static_cast<LayerImage*>(layer)->addCel(newCel); return newCel; }