Skip to content

Commit

Permalink
Cleanup|Patch: Defined flags enumeration for Patch::load() arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
danij-deng committed Dec 13, 2012
1 parent e86254e commit c34e8f2
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 42 deletions.
30 changes: 25 additions & 5 deletions doomsday/engine/include/resource/patch.h
Expand Up @@ -61,23 +61,41 @@ namespace de {
QPoint origin;
};

/**
* Flags for @ref load()
*/
enum Flag
{
/// If the color of a pixel uses index #0 write the default color
/// (black) as the color value and set the alpha to zero.
MaskZero = 0x1,

/// Clip the composited image to the logical dimensions of the patch
/// ; otherwise perform no clipping (use the pixel dimensions).
ClipToLogicalDimensions = 0x2
};
Q_DECLARE_FLAGS(Flags, Flag)

public:
/**
* Attempt to read metadata from @a data.
* @param data Data to read metadata from.
*/
static Metadata loadMetadata(IByteArray const &data);

/**
* Attempt to interpret @a data as a Patch.
* @param data Data to interpret as a Patch.
* @param maskZero Used with sky textures.
* @param flags Flags determining how the data should be interpreted.
*/
static Block load(IByteArray const &data,
bool maskZero = false, bool clipToLogicalDimensions = false);
static Block load(IByteArray const &data, Flags = 0);

/**
* @copydoc load()
* @param xlatTable If not @c NULL, use this translation table when
* compositing final color palette indices.
*/
static Block load(IByteArray const &data, IByteArray const &xlatTable,
bool maskZero = false, bool clipToLogicalDimensions = false);
static Block load(IByteArray const &data, IByteArray const &xlatTable, Flags = 0);

/**
* Determines whether @a data looks like it can be interpreted as a Patch.
Expand All @@ -89,6 +107,8 @@ namespace de {
static bool recognize(IByteArray const &data);
};

Q_DECLARE_OPERATORS_FOR_FLAGS(Patch::Flags)

} // namespace de

#endif /// LIBDENG_RESOURCE_PATCH_H
11 changes: 6 additions & 5 deletions doomsday/engine/src/gl/gl_texmanager.cpp
Expand Up @@ -2349,11 +2349,11 @@ static Block loadAndTranslatePatch(IByteArray const &data, int tclass = 0, int t
{
if(dbyte const *xlatTable = R_TranslationTable(tclass, tmap))
{
return Patch::load(data, ByteRefArray(xlatTable, 256), false/*don't mask*/, true/*clip to logical dimensions*/);
return Patch::load(data, ByteRefArray(xlatTable, 256), Patch::ClipToLogicalDimensions);
}
else
{
return Patch::load(data, false/*don't mask*/, true/*clip to logical dimensions*/);
return Patch::load(data, Patch::ClipToLogicalDimensions);
}
}

Expand Down Expand Up @@ -2436,7 +2436,7 @@ DGLuint GL_PrepareExtTexture(char const *name, gfxmode_t mode, int useMipmap,
return texture;
}

static TexSource loadPatchComposite(image_t &image, de::Texture &tex, bool zeroMask,
static TexSource loadPatchComposite(image_t &image, de::Texture &tex, bool maskZero,
bool useZeroOriginIfOneComponent)
{
LOG_AS("GL_LoadPatchComposite");
Expand All @@ -2461,7 +2461,8 @@ static TexSource loadPatchComposite(image_t &image, de::Texture &tex, bool zeroM
{
try
{
Block patchImg = Patch::load(fileData, zeroMask);
Patch::Flags loadFlags = maskZero? Patch::MaskZero : 0;
Block patchImg = Patch::load(fileData, loadFlags);
Patch::Metadata info = Patch::loadMetadata(fileData);

QPoint origin = i->origin();
Expand All @@ -2479,7 +2480,7 @@ static TexSource loadPatchComposite(image_t &image, de::Texture &tex, bool zeroM
file.unlock();
}

if(zeroMask || palettedIsMasked(image.pixels, image.size.width, image.size.height))
if(maskZero || palettedIsMasked(image.pixels, image.size.width, image.size.height))
image.flags |= IMGF_IS_MASKED;

// For debug:
Expand Down
69 changes: 37 additions & 32 deletions doomsday/engine/src/resource/patch.cpp
Expand Up @@ -184,28 +184,12 @@ static int calcRealHeight(Columns const &columns)
return geom.height();
}

static Patch::Metadata prepareMetadata(Header const &hdr, int realHeight)
static Block compositeImage(Reader &reader, IByteArray const *xlatTable,
Columns const &columns, Patch::Metadata const &meta,
Patch::Flags flags)
{
Patch::Metadata meta;
meta.dimensions = QSize(hdr.dimensions[0], realHeight);
meta.logicalDimensions = QSize(hdr.dimensions[0], hdr.dimensions[1]);
meta.origin = QPoint(hdr.origin[0], hdr.origin[1]);
return meta;
}

static Block load(IByteArray const &data, IByteArray const *xlatTable,
bool maskZero, bool clipToLogicalDimensions)
{
Reader reader = Reader(data);

// Read the header.
Header hdr; reader >> hdr;

// Read and prepare the column => post map.
Columns columns = readColumns(hdr.dimensions[0], reader);

// Prepare metadata.
Patch::Metadata meta = prepareMetadata(hdr, calcRealHeight(columns));
bool const maskZero = flags.testFlag(Patch::MaskZero);
bool const clipToLogicalDimensions = flags.testFlag(Patch::ClipToLogicalDimensions);

#ifdef DENG_DEBUG
// Is the "logical" height of the image equal to the actual height of the
Expand All @@ -226,12 +210,12 @@ static Block load(IByteArray const &data, IByteArray const *xlatTable,

// Determine the dimensions of the output buffer.
QSize const &dimensions = clipToLogicalDimensions? meta.logicalDimensions : meta.dimensions;
int const w = dimensions.width();
int const h = dimensions.height();
size_t const pels = w * h;

int const w = dimensions.width();
int const h = dimensions.height();
size_t const pels = w * h;

Block output = QByteArray(2 * pels, 0);
// Create the output buffer and fill with default color (black) and alpha (transparent).
Block output = QByteArray(2 * pels, 0);

// Map the pixel color channels in the output buffer.
dbyte *top = output.data();
Expand Down Expand Up @@ -318,27 +302,48 @@ static Block load(IByteArray const &data, IByteArray const *xlatTable,

} // internal

static Patch::Metadata prepareMetadata(internal::Header const &hdr, int realHeight)
{
Patch::Metadata meta;
meta.dimensions = QSize(hdr.dimensions[0], realHeight);
meta.logicalDimensions = QSize(hdr.dimensions[0], hdr.dimensions[1]);
meta.origin = QPoint(hdr.origin[0], hdr.origin[1]);
return meta;
}

Patch::Metadata Patch::loadMetadata(IByteArray const &data)
{
LOG_AS("Patch::loadMetadata");
Reader reader = Reader(data);

internal::Header hdr; reader >> hdr;
internal::Columns columns = internal::readColumns(hdr.dimensions[0], reader);
return internal::prepareMetadata(hdr, calcRealHeight(columns));

return prepareMetadata(hdr, calcRealHeight(columns));
}

Block Patch::load(IByteArray const &data, IByteArray const &xlatTable,
bool maskZero, bool clipToLogicalDimensions)
Block Patch::load(IByteArray const &data, IByteArray const &xlatTable, Patch::Flags flags)
{
LOG_AS("Patch::load");
return internal::load(data, &xlatTable, maskZero, clipToLogicalDimensions);
Reader reader = Reader(data);

internal::Header hdr; reader >> hdr;
internal::Columns columns = internal::readColumns(hdr.dimensions[0], reader);

Metadata meta = prepareMetadata(hdr, calcRealHeight(columns));
return internal::compositeImage(reader, &xlatTable, columns, meta, flags);
}

Block Patch::load(IByteArray const &data, bool maskZero, bool clipToLogicalDimensions)
Block Patch::load(IByteArray const &data, Patch::Flags flags)
{
LOG_AS("Patch::load");
return internal::load(data, 0/* no translation */, maskZero, clipToLogicalDimensions);
Reader reader = Reader(data);

internal::Header hdr; reader >> hdr;
internal::Columns columns = internal::readColumns(hdr.dimensions[0], reader);

Metadata meta = prepareMetadata(hdr, calcRealHeight(columns));
return internal::compositeImage(reader, 0/* no translation */, columns, meta, flags);
}

bool Patch::recognize(IByteArray const &data)
Expand Down

0 comments on commit c34e8f2

Please sign in to comment.