fix some buggy output
parent
6faceb9d16
commit
6a6629f4c7
|
@ -105,8 +105,8 @@ typedef struct Cram_ImageData
|
||||||
int32_t width;
|
int32_t width;
|
||||||
int32_t height;
|
int32_t height;
|
||||||
|
|
||||||
int32_t offsetX;
|
int32_t trimOffsetX;
|
||||||
int32_t offsetY;
|
int32_t trimOffsetY;
|
||||||
int32_t untrimmedWidth;
|
int32_t untrimmedWidth;
|
||||||
int32_t untrimmedHeight;
|
int32_t untrimmedHeight;
|
||||||
} Cram_ImageData;
|
} Cram_ImageData;
|
||||||
|
|
69
src/cram.c
69
src/cram.c
|
@ -59,7 +59,8 @@ struct Cram_Image
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
Rect originalRect;
|
Rect originalRect;
|
||||||
Rect rect;
|
Rect trimmedRect;
|
||||||
|
Rect packedRect;
|
||||||
Cram_Image *duplicateOf;
|
Cram_Image *duplicateOf;
|
||||||
uint8_t *pixels; /* Will be NULL if duplicateOf is not NULL! */
|
uint8_t *pixels; /* Will be NULL if duplicateOf is not NULL! */
|
||||||
size_t hash;
|
size_t hash;
|
||||||
|
@ -124,9 +125,9 @@ static uint32_t Cram_Internal_NextPowerOfTwo(uint32_t v)
|
||||||
static uint8_t Cram_Internal_IsImageEqual(Cram_Image *a, Cram_Image *b)
|
static uint8_t Cram_Internal_IsImageEqual(Cram_Image *a, Cram_Image *b)
|
||||||
{
|
{
|
||||||
int32_t i;
|
int32_t i;
|
||||||
if (a->hash == b->hash && a->rect.w == b->rect.w && a->rect.h == b->rect.h)
|
if (a->hash == b->hash && a->trimmedRect.w == b->trimmedRect.w && a->trimmedRect.h == b->trimmedRect.h)
|
||||||
{
|
{
|
||||||
for (i = 0; i < a->rect.w * a->rect.h * 4; i += 1)
|
for (i = 0; i < a->trimmedRect.w * a->trimmedRect.h * 4; i += 1)
|
||||||
{
|
{
|
||||||
if (a->pixels[i] != b->pixels[i])
|
if (a->pixels[i] != b->pixels[i])
|
||||||
{
|
{
|
||||||
|
@ -532,7 +533,6 @@ void Cram_AddFile(Cram_Context *context, const char *path)
|
||||||
}
|
}
|
||||||
|
|
||||||
image = Cram_malloc(sizeof(Cram_Image));
|
image = Cram_malloc(sizeof(Cram_Image));
|
||||||
internalContext->images[internalContext->imageCount] = image;
|
|
||||||
|
|
||||||
image->name = Cram_Internal_GetImageName(path);
|
image->name = Cram_Internal_GetImageName(path);
|
||||||
|
|
||||||
|
@ -592,29 +592,29 @@ void Cram_AddFile(Cram_Context *context, const char *path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
image->rect.x = leftTrim;
|
image->trimmedRect.x = leftTrim;
|
||||||
image->rect.y = topTrim;
|
image->trimmedRect.y = topTrim;
|
||||||
image->rect.w = rightTrim - leftTrim;
|
image->trimmedRect.w = rightTrim - leftTrim;
|
||||||
image->rect.h = bottomTrim - topTrim;
|
image->trimmedRect.h = bottomTrim - topTrim;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
image->rect = image->originalRect;
|
image->trimmedRect = image->originalRect;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy and free source pixels */
|
/* copy and free source pixels */
|
||||||
image->pixels = Cram_malloc(image->rect.w * image->rect.h * 4);
|
image->pixels = Cram_malloc(image->trimmedRect.w * image->trimmedRect.h * 4);
|
||||||
|
|
||||||
Rect dstRect;
|
Rect dstRect;
|
||||||
dstRect.x = 0;
|
dstRect.x = 0;
|
||||||
dstRect.y = 0;
|
dstRect.y = 0;
|
||||||
dstRect.w = image->rect.w;
|
dstRect.w = image->trimmedRect.w;
|
||||||
dstRect.h = image->rect.h;
|
dstRect.h = image->trimmedRect.h;
|
||||||
Cram_Internal_CopyPixels((uint32_t*) image->pixels, image->rect.w, (uint32_t*) pixels, width, &dstRect, &image->rect);
|
Cram_Internal_CopyPixels((uint32_t*) image->pixels, image->trimmedRect.w, (uint32_t*) pixels, width, &dstRect, &image->trimmedRect);
|
||||||
stbi_image_free(pixels);
|
stbi_image_free(pixels);
|
||||||
|
|
||||||
/* hash */
|
/* hash */
|
||||||
image->hash = stbds_hash_bytes(image->pixels, image->rect.w * image->rect.h * 4, 0);
|
image->hash = stbds_hash_bytes(image->pixels, image->trimmedRect.w * image->trimmedRect.h * 4, 0);
|
||||||
|
|
||||||
/* check if this is a duplicate */
|
/* check if this is a duplicate */
|
||||||
image->duplicateOf = NULL;
|
image->duplicateOf = NULL;
|
||||||
|
@ -625,7 +625,7 @@ void Cram_AddFile(Cram_Context *context, const char *path)
|
||||||
if (Cram_Internal_IsImageEqual(image, internalContext->images[i]))
|
if (Cram_Internal_IsImageEqual(image, internalContext->images[i]))
|
||||||
{
|
{
|
||||||
/* this is duplicate data! */
|
/* this is duplicate data! */
|
||||||
image->duplicateOf = image;
|
image->duplicateOf = internalContext->images[i];
|
||||||
Cram_free(image->pixels);
|
Cram_free(image->pixels);
|
||||||
image->pixels = NULL;
|
image->pixels = NULL;
|
||||||
break;
|
break;
|
||||||
|
@ -633,6 +633,7 @@ void Cram_AddFile(Cram_Context *context, const char *path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internalContext->images[internalContext->imageCount] = image;
|
||||||
internalContext->imageCount += 1;
|
internalContext->imageCount += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -672,8 +673,8 @@ int8_t Cram_Pack(Cram_Context *context)
|
||||||
{
|
{
|
||||||
packerRect = &packerRects[numRects];
|
packerRect = &packerRects[numRects];
|
||||||
|
|
||||||
packerRect->w = internalContext->images[i]->rect.w + internalContext->padding;
|
packerRect->w = internalContext->images[i]->trimmedRect.w + internalContext->padding;
|
||||||
packerRect->h = internalContext->images[i]->rect.h + internalContext->padding;
|
packerRect->h = internalContext->images[i]->trimmedRect.h + internalContext->padding;
|
||||||
|
|
||||||
numRects += 1;
|
numRects += 1;
|
||||||
}
|
}
|
||||||
|
@ -691,8 +692,10 @@ int8_t Cram_Pack(Cram_Context *context)
|
||||||
{
|
{
|
||||||
packerRect = &packerRects[numRects];
|
packerRect = &packerRects[numRects];
|
||||||
|
|
||||||
internalContext->images[i]->rect.x = packerRect->x;
|
internalContext->images[i]->packedRect.x = packerRect->x;
|
||||||
internalContext->images[i]->rect.y = packerRect->y;
|
internalContext->images[i]->packedRect.y = packerRect->y;
|
||||||
|
internalContext->images[i]->packedRect.w = internalContext->images[i]->trimmedRect.w;
|
||||||
|
internalContext->images[i]->packedRect.h = internalContext->images[i]->trimmedRect.h;
|
||||||
|
|
||||||
maxWidth = Cram_max(maxWidth, packerRect->x + packerRect->w);
|
maxWidth = Cram_max(maxWidth, packerRect->x + packerRect->w);
|
||||||
maxHeight = Cram_max(maxHeight, packerRect->y + packerRect->h);
|
maxHeight = Cram_max(maxHeight, packerRect->y + packerRect->h);
|
||||||
|
@ -711,21 +714,21 @@ int8_t Cram_Pack(Cram_Context *context)
|
||||||
{
|
{
|
||||||
if (!internalContext->images[i]->duplicateOf)
|
if (!internalContext->images[i]->duplicateOf)
|
||||||
{
|
{
|
||||||
dstRect.x = internalContext->images[i]->rect.x;
|
dstRect.x = internalContext->images[i]->packedRect.x;
|
||||||
dstRect.y = internalContext->images[i]->rect.y;
|
dstRect.y = internalContext->images[i]->packedRect.y;
|
||||||
dstRect.w = internalContext->images[i]->rect.w;
|
dstRect.w = internalContext->images[i]->trimmedRect.w;
|
||||||
dstRect.h = internalContext->images[i]->rect.h;
|
dstRect.h = internalContext->images[i]->trimmedRect.h;
|
||||||
|
|
||||||
srcRect.x = 0;
|
srcRect.x = 0;
|
||||||
srcRect.y = 0;
|
srcRect.y = 0;
|
||||||
srcRect.w = internalContext->images[i]->rect.w;
|
srcRect.w = internalContext->images[i]->trimmedRect.w;
|
||||||
srcRect.h = internalContext->images[i]->rect.h;
|
srcRect.h = internalContext->images[i]->trimmedRect.h;
|
||||||
|
|
||||||
Cram_Internal_CopyPixels(
|
Cram_Internal_CopyPixels(
|
||||||
(uint32_t*) internalContext->pixels,
|
(uint32_t*) internalContext->pixels,
|
||||||
internalContext->width,
|
internalContext->width,
|
||||||
(uint32_t*) internalContext->images[i]->pixels,
|
(uint32_t*) internalContext->images[i]->pixels,
|
||||||
internalContext->images[i]->rect.w,
|
internalContext->images[i]->trimmedRect.w,
|
||||||
&dstRect,
|
&dstRect,
|
||||||
&srcRect
|
&srcRect
|
||||||
);
|
);
|
||||||
|
@ -740,17 +743,17 @@ int8_t Cram_Pack(Cram_Context *context)
|
||||||
image = internalContext->images[i];
|
image = internalContext->images[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
internalContext->imageDatas[i].x = image->rect.x;
|
internalContext->imageDatas[i].x = image->packedRect.x;
|
||||||
internalContext->imageDatas[i].y = image->rect.y;
|
internalContext->imageDatas[i].y = image->packedRect.y;
|
||||||
internalContext->imageDatas[i].width = image->rect.w;
|
internalContext->imageDatas[i].width = image->trimmedRect.w;
|
||||||
internalContext->imageDatas[i].height = image->rect.h;
|
internalContext->imageDatas[i].height = image->trimmedRect.h;
|
||||||
|
|
||||||
internalContext->imageDatas[i].offsetX = image->rect.x - image->originalRect.x;
|
internalContext->imageDatas[i].trimOffsetX = image->trimmedRect.x - image->originalRect.x;
|
||||||
internalContext->imageDatas[i].offsetY = image->rect.y - image->originalRect.y;
|
internalContext->imageDatas[i].trimOffsetY = image->trimmedRect.y - image->originalRect.y;
|
||||||
internalContext->imageDatas[i].untrimmedWidth = image->originalRect.w;
|
internalContext->imageDatas[i].untrimmedWidth = image->originalRect.w;
|
||||||
internalContext->imageDatas[i].untrimmedHeight = image->originalRect.h;
|
internalContext->imageDatas[i].untrimmedHeight = image->originalRect.h;
|
||||||
|
|
||||||
internalContext->imageDatas[i].name = strdup(image->name);
|
internalContext->imageDatas[i].name = strdup(internalContext->images[i]->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
Cram_free(packerRects);
|
Cram_free(packerRects);
|
||||||
|
|
|
@ -64,25 +64,19 @@ void JsonBuilder_Internal_RemoveTrailingComma(JsonBuilder *builder)
|
||||||
|
|
||||||
void JsonBuilder_AppendProperty(JsonBuilder *builder, char *propertyName, char *propertyString, uint8_t isString)
|
void JsonBuilder_AppendProperty(JsonBuilder *builder, char *propertyName, char *propertyString, uint8_t isString)
|
||||||
{
|
{
|
||||||
size_t lineLength;
|
|
||||||
|
|
||||||
lineLength = strlen(propertyName) + strlen(propertyString) + 6;
|
|
||||||
if (isString)
|
|
||||||
{
|
|
||||||
lineLength += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonBuilder_Internal_MaybeExpand(builder, lineLength);
|
|
||||||
JsonBuilder_Internal_Indent(builder);
|
JsonBuilder_Internal_Indent(builder);
|
||||||
|
|
||||||
|
JsonBuilder_Internal_MaybeExpand(builder, strlen(propertyName) + 4);
|
||||||
builder->index += sprintf(&builder->string[builder->index], "\"%s\": ", propertyName);
|
builder->index += sprintf(&builder->string[builder->index], "\"%s\": ", propertyName);
|
||||||
|
|
||||||
if (isString)
|
if (isString)
|
||||||
{
|
{
|
||||||
|
JsonBuilder_Internal_MaybeExpand(builder, strlen(propertyString) + 4);
|
||||||
builder->index += sprintf(&builder->string[builder->index], "\"%s\",\n", propertyString);
|
builder->index += sprintf(&builder->string[builder->index], "\"%s\",\n", propertyString);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
JsonBuilder_Internal_MaybeExpand(builder, strlen(propertyString) + 2);
|
||||||
builder->index += sprintf(&builder->string[builder->index], "%s,\n", propertyString);
|
builder->index += sprintf(&builder->string[builder->index], "%s,\n", propertyString);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,7 +96,7 @@ void JsonBuilder_AppendIntProperty(JsonBuilder *builder, char *propertyName, int
|
||||||
void JsonBuilder_StartObject(JsonBuilder *builder)
|
void JsonBuilder_StartObject(JsonBuilder *builder)
|
||||||
{
|
{
|
||||||
JsonBuilder_Internal_Indent(builder);
|
JsonBuilder_Internal_Indent(builder);
|
||||||
JsonBuilder_Internal_MaybeExpand(builder, 1);
|
JsonBuilder_Internal_MaybeExpand(builder, 2);
|
||||||
builder->index += sprintf(&builder->string[builder->index], "{\n");
|
builder->index += sprintf(&builder->string[builder->index], "{\n");
|
||||||
builder->indentLevel += 1;
|
builder->indentLevel += 1;
|
||||||
}
|
}
|
||||||
|
@ -142,7 +136,7 @@ void JsonBuilder_Finish(JsonBuilder *builder)
|
||||||
builder->indentLevel = 0;
|
builder->indentLevel = 0;
|
||||||
|
|
||||||
JsonBuilder_Internal_RemoveTrailingComma(builder);
|
JsonBuilder_Internal_RemoveTrailingComma(builder);
|
||||||
JsonBuilder_Internal_MaybeExpand(builder, 3);
|
JsonBuilder_Internal_MaybeExpand(builder, 2);
|
||||||
|
|
||||||
builder->index += sprintf(&builder->string[builder->index], "}\n");
|
builder->index += sprintf(&builder->string[builder->index], "}\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,8 +221,8 @@ int main(int argc, char *argv[])
|
||||||
JsonBuilder_AppendIntProperty(jsonBuilder, "Y", imageDatas[i].y);
|
JsonBuilder_AppendIntProperty(jsonBuilder, "Y", imageDatas[i].y);
|
||||||
JsonBuilder_AppendIntProperty(jsonBuilder, "W", imageDatas[i].width);
|
JsonBuilder_AppendIntProperty(jsonBuilder, "W", imageDatas[i].width);
|
||||||
JsonBuilder_AppendIntProperty(jsonBuilder, "H", imageDatas[i].height);
|
JsonBuilder_AppendIntProperty(jsonBuilder, "H", imageDatas[i].height);
|
||||||
JsonBuilder_AppendIntProperty(jsonBuilder, "OffsetX", imageDatas[i].offsetX);
|
JsonBuilder_AppendIntProperty(jsonBuilder, "TrimOffsetX", imageDatas[i].trimOffsetX);
|
||||||
JsonBuilder_AppendIntProperty(jsonBuilder, "OffsetY", imageDatas[i].offsetY);
|
JsonBuilder_AppendIntProperty(jsonBuilder, "TrimOffsetY", imageDatas[i].trimOffsetY);
|
||||||
JsonBuilder_AppendIntProperty(jsonBuilder, "UntrimmedWidth", imageDatas[i].untrimmedWidth);
|
JsonBuilder_AppendIntProperty(jsonBuilder, "UntrimmedWidth", imageDatas[i].untrimmedWidth);
|
||||||
JsonBuilder_AppendIntProperty(jsonBuilder, "UntrimmedHeight", imageDatas[i].untrimmedHeight);
|
JsonBuilder_AppendIntProperty(jsonBuilder, "UntrimmedHeight", imageDatas[i].untrimmedHeight);
|
||||||
JsonBuilder_EndObject(jsonBuilder);
|
JsonBuilder_EndObject(jsonBuilder);
|
||||||
|
|
Loading…
Reference in New Issue