Skip to content

Export to cocos2dx and CSS, 3 new output image formats, refactoring #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions src/atlasmetadatawriter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include "atlasmetadatawriter.h"

AtlasMetadataWriter::AtlasMetadataWriter()
: m_stream(&m_bytes)
{
}

void AtlasMetadataWriter::WriteTexture(const QString &path, const QSize &size)
{
(void)size;
m_stream << "textures: " << path << "\n";
}

void AtlasMetadataWriter::WriteFrame(const QString &name, const QPoint &pos, const QRect &crop,
const QSize &origSize, bool rotated)
{
m_stream << name << "\t" <<
pos.x() << "\t" <<
pos.y() << "\t" <<
crop.width() << "\t" <<
crop.height() << "\t" <<
crop.x() << "\t" <<
crop.y() << "\t" <<
origSize.width() << "\t" <<
origSize.height() << "\t" <<
(rotated ? "r" : "") << "\n";
}

QByteArray AtlasMetadataWriter::ToBytes() const
{
m_stream.flush();
return m_bytes;
}
21 changes: 21 additions & 0 deletions src/atlasmetadatawriter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef ATLASMETADATAWRITER_H
#define ATLASMETADATAWRITER_H

#include "imetadatawriter.h"
#include <QTextStream>

class AtlasMetadataWriter : public IMetadataWriter
{
public:
AtlasMetadataWriter();

void WriteTexture(const QString &path, const QSize &size) override;
void WriteFrame(const QString &name, const QPoint &pos, const QRect &crop, const QSize &origSize, bool rotated) override;
QByteArray ToBytes()const override;

private:
QByteArray m_bytes;
mutable QTextStream m_stream;
};

#endif // ATLASMETADATAWRITER_H
140 changes: 140 additions & 0 deletions src/cocosmetadatawriter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
#include "cocosmetadatawriter.h"
#include <QXmlStreamWriter>

namespace
{
const char PLIST_DTD[] = R"***(<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">)***";

void writeKey(QXmlStreamWriter &xml, const QString &key)
{
xml.writeTextElement("key", key);
}

void writeInteger(QXmlStreamWriter &xml, int value)
{
xml.writeTextElement("integer", QString::number(value));
}

void writeReal(QXmlStreamWriter &xml, double value)
{
xml.writeTextElement("real", QString::number(value));
}

void writeString(QXmlStreamWriter &xml, const QString &value)
{
xml.writeTextElement("string", value);
}

void writeBool(QXmlStreamWriter &xml, bool value)
{
xml.writeEmptyElement(value ? "true" : "false");
}

void writeSize(QXmlStreamWriter &xml, const QSize &value)
{
char buffer[80];
sprintf(buffer, "{%d,%d}", value.width(), value.height());
writeString(xml, buffer);
}
}

CocosMetadataWriter::CocosMetadataWriter()
{
}

void CocosMetadataWriter::WriteTexture(const QString &path, const QSize &size)
{
m_meta.texturePath = path;
m_meta.textureSize = size;
}

void CocosMetadataWriter::WriteFrame(const QString &name, const QPoint &pos, const QRect &crop, const QSize &origSize, bool rotated)
{
FrameData data;
data.name = name;
data.pos = pos;
data.crop = crop;
data.origSize = origSize;
data.rotated = rotated;
m_frames << data;
}

QByteArray CocosMetadataWriter::ToBytes() const
{
QByteArray content;
QXmlStreamWriter xml(&content);
xml.setAutoFormatting(true);
xml.setAutoFormattingIndent(-1);

xml.writeStartDocument("1.0");
xml.writeDTD(PLIST_DTD);
xml.writeStartElement("plist");
xml.writeAttribute("version", "1.0");
xml.writeStartElement("dict");
writeFrames(xml);
writeMetadata(xml);
writeTexture(xml);
xml.writeEndElement(); // dict
xml.writeEndElement(); // plist
xml.writeEndDocument();

return content;
}

void CocosMetadataWriter::writeFrames(QXmlStreamWriter &xml) const
{
writeKey(xml, "frames");
xml.writeStartElement("dict");
for (const FrameData &frame : m_frames)
{
writeKey(xml, frame.name);
xml.writeStartElement("dict");
writeKey(xml, "width");
writeInteger(xml, frame.crop.width());
writeKey(xml, "height");
writeInteger(xml, frame.crop.height());
writeKey(xml, "originalWidth");
writeInteger(xml, frame.origSize.width());
writeKey(xml, "originalHeight");
writeInteger(xml, frame.origSize.height());
writeKey(xml, "x");
writeInteger(xml, frame.pos.x());
writeKey(xml, "y");
writeInteger(xml, frame.pos.y());
writeKey(xml, "offsetX");
writeReal(xml, frame.crop.x());
writeKey(xml, "offsetY");
writeReal(xml, frame.crop.y());
writeKey(xml, "rotated");
writeBool(xml, frame.rotated);
xml.writeEndElement(); // dict
}
xml.writeEndElement(); // dict
}

void CocosMetadataWriter::writeMetadata(QXmlStreamWriter &xml) const
{
writeKey(xml, "metadata");
xml.writeStartElement("dict");
writeKey(xml, "format");
writeInteger(xml, 0);
writeKey(xml, "textureFileName");
writeString(xml, m_meta.texturePath);
writeKey(xml, "realTextureFileName");
writeString(xml, m_meta.texturePath);
writeKey(xml, "size");
writeSize(xml, m_meta.textureSize);

xml.writeEndElement(); // dict
}

void CocosMetadataWriter::writeTexture(QXmlStreamWriter &xml) const
{
writeKey(xml, "texture");
xml.writeStartElement("dict");
writeKey(xml, "width");
writeInteger(xml, m_meta.textureSize.width());
writeKey(xml, "height");
writeInteger(xml, m_meta.textureSize.height());
xml.writeEndElement(); // dict
}
43 changes: 43 additions & 0 deletions src/cocosmetadatawriter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#ifndef COCOSMETADATAWRITER_H
#define COCOSMETADATAWRITER_H

#include "imetadatawriter.h"
#include <QList>
QT_BEGIN_NAMESPACE
class QXmlStreamWriter;
QT_END_NAMESPACE

class CocosMetadataWriter : public IMetadataWriter
{
public:
CocosMetadataWriter();

void WriteTexture(const QString &path, const QSize &size) override;
void WriteFrame(const QString &name, const QPoint &pos, const QRect &crop, const QSize &origSize, bool rotated) override;
QByteArray ToBytes() const override;

private:
struct FrameData
{
QString name;
QPoint pos;
QRect crop;
QSize origSize;
bool rotated = false;
};

struct Metadata
{
QString texturePath;
QSize textureSize;
};

void writeFrames(QXmlStreamWriter &xml)const;
void writeMetadata(QXmlStreamWriter &xml)const;
void writeTexture(QXmlStreamWriter &xml)const;

QList<FrameData> m_frames;
Metadata m_meta;
};

#endif // COCOSMETADATAWRITER_H
Loading