mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
SLN fix It works, but with the wrong images and the wrong characters! Fix another bug in atlastool's binary output Get Android building again. Oops, didn't mean to disable this permanently. Error checking Minor cleanup Gotta tweak my git ignores... Regenerate metadata
146 lines
2.4 KiB
C++
146 lines
2.4 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
|
|
#define ATLAS_MAGIC ('A' + ('T' << 8) + ('L' << 16) | ('A' << 24))
|
|
|
|
// Metadata file structure v0:
|
|
//
|
|
// AtlasHeader
|
|
// For each image:
|
|
// AtlasImage
|
|
// For each font:
|
|
// AtlasFontHeader
|
|
// For each range:
|
|
// AtlasRange
|
|
// For each char:
|
|
// AtlasChar
|
|
|
|
struct Atlas;
|
|
|
|
struct ImageID {
|
|
public:
|
|
ImageID() : id(nullptr) {}
|
|
explicit ImageID(const char *_id) : id(_id) {}
|
|
|
|
static inline ImageID invalid() {
|
|
return ImageID{ nullptr };
|
|
}
|
|
|
|
bool isValid() const {
|
|
return id != nullptr;
|
|
}
|
|
|
|
bool isInvalid() const {
|
|
return id == nullptr;
|
|
}
|
|
|
|
bool operator ==(const ImageID &other) {
|
|
return (id == other.id) || !strcmp(id, other.id);
|
|
}
|
|
|
|
bool operator !=(const ImageID &other) {
|
|
if (id == other.id) {
|
|
return false;
|
|
}
|
|
return strcmp(id, other.id) != 0;
|
|
}
|
|
|
|
private:
|
|
const char *id;
|
|
friend struct Atlas;
|
|
};
|
|
|
|
struct FontID {
|
|
public:
|
|
explicit FontID(const char *_id) : id(_id) {}
|
|
|
|
static inline FontID invalid() {
|
|
return FontID{ nullptr };
|
|
}
|
|
|
|
bool isInvalid() const {
|
|
return id == nullptr;
|
|
}
|
|
|
|
private:
|
|
const char *id;
|
|
friend struct Atlas;
|
|
};
|
|
|
|
struct AtlasChar {
|
|
// texcoords
|
|
float sx, sy, ex, ey;
|
|
// offset from the origin
|
|
float ox, oy;
|
|
// distance to move the origin forward
|
|
float wx;
|
|
// size in pixels
|
|
unsigned short pw, ph;
|
|
};
|
|
|
|
struct AtlasCharRange {
|
|
int start;
|
|
int end;
|
|
int start_index;
|
|
};
|
|
|
|
struct AtlasFontHeader {
|
|
float padding;
|
|
float height;
|
|
float ascend;
|
|
float distslope;
|
|
int numRanges;
|
|
int numChars;
|
|
char name[32];
|
|
};
|
|
|
|
struct AtlasFont {
|
|
~AtlasFont();
|
|
|
|
float padding;
|
|
float height;
|
|
float ascend;
|
|
float distslope;
|
|
const AtlasChar *charData;
|
|
const AtlasCharRange *ranges;
|
|
int numRanges;
|
|
int numChars;
|
|
char name[32];
|
|
|
|
// Returns 0 on no match.
|
|
const AtlasChar *getChar(int utf32) const ;
|
|
};
|
|
|
|
struct AtlasImage {
|
|
float u1, v1, u2, v2;
|
|
int w, h;
|
|
char name[32];
|
|
};
|
|
|
|
struct AtlasHeader {
|
|
int magic;
|
|
int version;
|
|
int numFonts;
|
|
int numImages;
|
|
};
|
|
|
|
struct Atlas {
|
|
~Atlas();
|
|
bool Load(const uint8_t *data, size_t data_size);
|
|
bool IsMetadataLoaded() {
|
|
return images != nullptr;
|
|
}
|
|
|
|
AtlasFont *fonts = nullptr;
|
|
int num_fonts = 0;
|
|
AtlasImage *images = nullptr;
|
|
int num_images = 0;
|
|
|
|
// These are inefficient linear searches, try not to call every frame.
|
|
const AtlasFont *getFont(FontID id) const;
|
|
const AtlasImage *getImage(ImageID id) const;
|
|
|
|
bool measureImage(ImageID id, float *w, float *h) const;
|
|
};
|