void psdHandle::setLayer(QStringList& p_rStrList,PsdLayers layers, QStringList& p_rImageList, int level) { if(NULL == layers) return; QString rResult; vector<shared_ptr<PsdLayer> >::reverse_iterator iter = layers->rbegin(), end = layers->rend(); for (; iter != end; iter++) { shared_ptr<PsdLayer> layer = *iter; if (layer->getType() == PsdLayer::LayerTypeGroup) { concate(rResult,layer->getName(),level); //printf("%*s+ %s(%d)\n", level, "", layer->getName(),level); p_rStrList << rResult; setLayer(p_rStrList,((PsdLayerGroup *) layer.get())->getLayers(), p_rImageList,level + 2); } else { layerImage(layers,p_rImageList); concate(rResult,layer->getName(),level); p_rStrList << rResult; //printf("%*s- %s(%d)\n", level, "", layer->getName(),level); } } }
void psdHandle::layerImage(PsdLayers layers,QStringList& p_rStrList) { vector<shared_ptr<PsdLayer> >::reverse_iterator iter = layers->rbegin(), end = layers->rend(); PsdStatus status; for (; iter != end; iter++) { shared_ptr<PsdLayer> layer = *iter; if (layer->getType() == PsdLayer::LayerTypeGroup) { layerImage(((PsdLayerGroup *) layer.get())->getLayers(),p_rStrList); } else { shared_ptr<PsdImageData> imageData = layer->getImageData(); if(NULL == imageData) continue; setPngFileName(layer->getName()); if(PsdStatusOK == imageData->storePNGFile(sFilePathPng)) { p_rStrList << imageData->getStoredPNGFilePath(); //qDebug() << "Pic path:" << imageData->getStoredPNGFilePath(); } } } }
bool EditorObject::build(ResourceFile & resources) { // create the container to hold the graphic ids delete m_compiledGraphics; m_compiledGraphics = new Array3<QString>(tileCountX(), tileCountY(), layerCount()); Array3< QList<QImage> * > animations(tileCountX(), tileCountY(), layerCount()); // initialize animation list for (int z=0; z<layerCount(); z++) { for (int y=0; y<tileCountY(); ++y) { for (int x=0; x<tileCountX(); ++x) { animations.set(x,y,z,new QList<QImage>()); } } } // find out the greatest frames per second int fps = 0; for (int layerIndex=0; layerIndex<m_graphics.size(); ++layerIndex) { QList<ObjectGraphic *> * layer = m_graphics.at(layerIndex); for (int i=0; i<layer->size(); ++i) { ObjectGraphic * graphicInstance = layer->at(i); if (graphicInstance->graphic->framesPerSecond() > fps) fps = graphicInstance->graphic->framesPerSecond(); } } // for each animation frame int frame = 0; while (true) { if (frame > 0) { // check if the animation has looped yet. bool firstFrame = true; for (int layerIndex=0; layerIndex<m_graphics.size(); ++layerIndex) { QList<ObjectGraphic *> * layer = m_graphics.at(layerIndex); for (int i=0; i<layer->size(); ++i) { ObjectGraphic * graphicInstance = layer->at(i); if ((frame+1) % graphicInstance->graphic->frameCount() != 0) { firstFrame = false; break; } } if (! firstFrame) break; } // this means all animations have looped and we're done // collecting frames if (firstFrame) break; } for (int z=0; z<layerCount(); ++z) { // render the layer once into a QImage QImage layerImage(tileCountX() * Tile::sizeInt, tileCountY() * Tile::sizeInt, QImage::Format_ARGB32); layerImage.fill(Qt::transparent); QPainter layerPainter(&layerImage); render(layerPainter, z, frame, fps); // for each tile, draw that tile into a different QImage for (int y=0; y<tileCountY(); ++y) { for (int x=0; x<tileCountX(); ++x) { QImage tileImage(Tile::sizeInt, Tile::sizeInt, QImage::Format_ARGB32); tileImage.fill(Qt::transparent); QPainter p(&tileImage); p.drawImage(0, 0, layerImage, x * Tile::sizeInt, y * Tile::sizeInt, Tile::sizeInt, Tile::sizeInt); QList<QImage> * frames = animations.get(x,y,z); frames->append(tileImage); } } } ++frame; } int frameCount = frame; // create a spritesheet for each tile for (int z=0; z<layerCount(); ++z) { for (int y=0; y<tileCountY(); ++y) { for (int x=0; x<tileCountX(); ++x ) { // create the spritesheet QList<QImage> * frames = animations.get(x,y,z); QImage spritesheet(Tile::sizeInt * frameCount, Tile::sizeInt, QImage::Format_ARGB32); spritesheet.fill(Qt::transparent); QPainter p(&spritesheet); for (int i=0; i<frameCount; ++i) p.drawImage(i * Tile::sizeInt, 0, frames->at(i % frames->size())); // create the binary data QByteArray tile; // magic character tile.append("G"); int codeVersion = 1; tile.append((char *) &codeVersion, 4); int graphicType = Graphic::gtAnimation; tile.append((char *) &graphicType, 4); int storageType = Graphic::stPNG; tile.append((char *) &storageType, 4); // color key: hardcode magenta char red = 255; char green = 0; char blue = 255; tile.append(&red, 1); tile.append(&green, 1); tile.append(&blue, 1); tile.append((char *) &frameCount, 4); tile.append((char *) &fps, 4); // frame width and height tile.append((char *) &Tile::sizeInt, 4); tile.append((char *) &Tile::sizeInt, 4); // save spritesheet into memory QByteArray imageData; QBuffer buffer(&imageData); buffer.open(QIODevice::WriteOnly); spritesheet.save(&buffer, "PNG"); int imageDataSize = imageData.size(); tile.append((char *) &imageDataSize, 4); tile.append(imageData); // come up with a name QString dash = "-"; QString ext = ".ani"; QString graphicName = m_name + dash + QString::number(x) + dash + QString::number(y) + dash + QString::number(z) + ext; resources.updateResource(graphicName.toStdString(), tile.constData(), tile.size()); m_compiledGraphics->set(x,y,z,graphicName); } } } // cleanup animation list for (int z=0; z<layerCount(); z++) { for (int y=0; y<tileCountY(); ++y) { for (int x=0; x<tileCountX(); ++x) { delete animations.get(x,y,z); } } } return true; }