Skip to content

Commit e7cb8c7

Browse files
committed
Add nTileClusterPasses, nColourClusterPasses
1 parent 79d0f6c commit e7cb8c7

File tree

6 files changed

+72
-9
lines changed

6 files changed

+72
-9
lines changed

Qualetize.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ struct BGRAf_t Qualetize(
3636
int MaxTilePals,
3737
int MaxPalSize,
3838
int PalUnused,
39+
int nTileClusterPasses,
40+
int nColourClusterPasses,
3941
const struct BGRA8_t *BitRange,
4042
int DitherType,
4143
float DitherLevel,
@@ -44,7 +46,15 @@ struct BGRAf_t Qualetize(
4446
int i;
4547

4648
//! Do processing
47-
TilesData_QuantizePalettes(TilesData, Palette, MaxTilePals, MaxPalSize, PalUnused);
49+
TilesData_QuantizePalettes(
50+
TilesData,
51+
Palette,
52+
MaxTilePals,
53+
MaxPalSize,
54+
PalUnused,
55+
nTileClusterPasses,
56+
nColourClusterPasses
57+
);
4858

4959
//! Reduce palette range
5060
for(i=0;i<MaxTilePals*MaxPalSize;i++) {

Qualetize.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ struct BGRAf_t Qualetize(
2929
int MaxTilePals,
3030
int MaxPalSize,
3131
int PalUnused,
32+
int nTileClusterPasses,
33+
int nColourClusterPasses,
3234
const struct BGRA8_t *BitRange,
3335
int DitherType,
3436
float DitherLevel,

Tiles.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
//! NOTE: Something is probably broken about how clustering is
1111
//! implemented. Sometimes results converge, and other times
1212
//! they /diverge/. This probably needs to be investigated.
13-
#define MAX_PALETTE_INDICES_PASSES 8
14-
#define MAX_PALETTE_QUANTIZATION_PASSES 8
13+
#define DEFAULT_TILECLUSTER_PASSES 8
14+
#define DEFAULT_COLOURCLUSTER_PASSES 8
1515

1616
/**************************************/
1717
#define ALIGN2N(x,N) (((x) + (N)-1) &~ ((N)-1))
@@ -125,11 +125,23 @@ struct TilesData_t *TilesData_FromBitmap(const struct BmpCtx_t *Ctx, int TileW,
125125
/**************************************/
126126

127127
//! Create quantized palette
128-
int TilesData_QuantizePalettes(struct TilesData_t *TilesData, struct BGRAf_t *Palette, int MaxTilePals, int MaxPalSize, int PalUnusedEntries) {
128+
int TilesData_QuantizePalettes(
129+
struct TilesData_t *TilesData,
130+
struct BGRAf_t *Palette,
131+
int MaxTilePals,
132+
int MaxPalSize,
133+
int PalUnusedEntries,
134+
int nTileClusterPasses,
135+
int nColourClusterPasses
136+
) {
129137
int i, j, k;
130138
int nPxTile = TilesData->TileW * TilesData->TileH;
131139
int nTiles = TilesData->TilesX * TilesData->TilesY;
132140

141+
//! Set default passes as needed
142+
if(nTileClusterPasses == 0) nTileClusterPasses = DEFAULT_TILECLUSTER_PASSES;
143+
if(nColourClusterPasses == 0) nColourClusterPasses = DEFAULT_COLOURCLUSTER_PASSES;
144+
133145
//! Unused entries should not count towards
134146
//! the maximum palette size
135147
MaxPalSize -= PalUnusedEntries;
@@ -143,7 +155,7 @@ int TilesData_QuantizePalettes(struct TilesData_t *TilesData, struct BGRAf_t *Pa
143155
}
144156

145157
//! Categorize tiles by palette
146-
QuantCluster_Quantize(Clusters, MaxTilePals, TilesData->TileValue, nTiles, TilesData->TilePalIdx, MAX_PALETTE_INDICES_PASSES);
158+
QuantCluster_Quantize(Clusters, MaxTilePals, TilesData->TileValue, nTiles, TilesData->TilePalIdx, nTileClusterPasses);
147159

148160
//! Quantize tile palettes
149161
for(i=0;i<MaxTilePals;i++) {
@@ -161,7 +173,7 @@ int TilesData_QuantizePalettes(struct TilesData_t *TilesData, struct BGRAf_t *Pa
161173
if(!PxCnt) continue;
162174

163175
//! Perform quantization
164-
QuantCluster_Quantize(Clusters, MaxPalSize, PxTemp, PxCnt, TilesData->PxTempIdx, MAX_PALETTE_QUANTIZATION_PASSES);
176+
QuantCluster_Quantize(Clusters, MaxPalSize, PxTemp, PxCnt, TilesData->PxTempIdx, nColourClusterPasses);
165177

166178
//! Extract palette from cluster centroids
167179
for(j=0;j<PalUnusedEntries;j++) *Palette++ = (struct BGRAf_t){0,0,0,0};

Tiles.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,15 @@ struct TilesData_t *TilesData_FromBitmap(const struct BmpCtx_t *Ctx, int TileW,
3434
//! NOTE: PalUnusedEntries is used for 'padding', such as on
3535
//! the GBA/NDS where index 0 of every palette is transparent
3636
//! NOTE: Palette is generated in YUVA mode
37-
int TilesData_QuantizePalettes(struct TilesData_t *TilesData, struct BGRAf_t *Palette, int MaxTilePals, int MaxPalSize, int PalUnusedEntries);
37+
int TilesData_QuantizePalettes(
38+
struct TilesData_t *TilesData,
39+
struct BGRAf_t *Palette,
40+
int MaxTilePals,
41+
int MaxPalSize,
42+
int PalUnusedEntries,
43+
int nTileClusterPasses,
44+
int nColourClusterPasses
45+
);
3846

3947
/**************************************/
4048
//! EOF

tilequant.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ int main(int argc, const char *argv[]) {
3838
" -th:8 - Set tile height\n"
3939
" -bgra:5551 - Set BGRA bit depth\n"
4040
" -dither:floyd,1.0 - Set dither mode, level\n"
41+
" -tilepasses:0 - Set tile cluster passes (0 = default)\n"
42+
" -colourpasses:0 - Set colour cluster passes (0 = default)\n"
4143
"Dither modes available (and default level):\n"
4244
" -dither:none - No dithering\n"
4345
" -dither:floyd,1.0 - Floyd-Steinberg\n"
@@ -55,6 +57,8 @@ int main(int argc, const char *argv[]) {
5557
int nPalettes = 16;
5658
int nColoursPerPalette = 16;
5759
int nUnusedColoursPerPalette = 1;
60+
int nTileClusterPasses = 0;
61+
int nColourClusterPasses = 0;
5862
int TileW = 8;
5963
int TileH = 8;
6064
struct BGRA8_t BitRange = {.b = 0x1F, .g = 0x1F, .r = 0x1F, .a = 0x01};
@@ -113,8 +117,19 @@ int main(int argc, const char *argv[]) {
113117
if(!ArgOk) printf("Unrecognized dither mode: %s\n", ArgStr);
114118
ArgOk = 1;
115119
}
116-
#undef ARGMATCH
117120

121+
//! nTileClusterPasses
122+
ARGMATCH(argv[argi], "-tilepasses:") {
123+
ArgOk = 1;
124+
nTileClusterPasses = atoi(ArgStr);
125+
}
126+
127+
//! nColourClusterPasses
128+
ARGMATCH(argv[argi], "-colourpasses:") {
129+
ArgOk = 1;
130+
nColourClusterPasses = atoi(ArgStr);
131+
}
132+
#undef ARGMATCH
118133
//! Unrecognized?
119134
if(!ArgOk) printf("Unrecognized argument: %s\n", ArgStr);
120135
}
@@ -146,7 +161,19 @@ int main(int argc, const char *argv[]) {
146161
return -1;
147162
}
148163
struct BGRAf_t RMSE = Qualetize(
149-
&Image, TilesData, PxData, Palette, nPalettes, nColoursPerPalette, nUnusedColoursPerPalette, &BitRange, DitherMode, DitherLevel, 1
164+
&Image,
165+
TilesData,
166+
PxData,
167+
Palette,
168+
nPalettes,
169+
nColoursPerPalette,
170+
nUnusedColoursPerPalette,
171+
nTileClusterPasses,
172+
nColourClusterPasses,
173+
&BitRange,
174+
DitherMode,
175+
DitherLevel,
176+
1
150177
);
151178
free(TilesData);
152179

tilequantDLL.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ DECLSPEC int QualetizeFromRawImage(
4343
int TileW,
4444
int TileH,
4545
int32_t *TilePalIdx,
46+
int nTileClusterPasses,
47+
int nColourClusterPasses,
4648
const uint8_t BitRange[4],
4749
int DitherMode,
4850
float DitherLevel
@@ -68,6 +70,8 @@ DECLSPEC int QualetizeFromRawImage(
6870
nPalettes,
6971
nColoursPerPalette,
7072
nUnusedColoursPerPalette,
73+
nTileClusterPasses,
74+
nColourClusterPasses,
7175
(const struct BGRA8_t*)BitRange,
7276
DitherMode,
7377
DitherLevel,

0 commit comments

Comments
 (0)