--- /dev/null
+/*****************************************************************************/
+/* */
+/* bitmap.c */
+/* */
+/* Bitmap definition for the sp65 sprite and bitmap utility */
+/* */
+/* */
+/* */
+/* (C) 2012, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
+/* */
+/* */
+/* This software is provided 'as-is', without any expressed or implied */
+/* warranty. In no event will the authors be held liable for any damages */
+/* arising from the use of this software. */
+/* */
+/* Permission is granted to anyone to use this software for any purpose, */
+/* including commercial applications, and to alter it and redistribute it */
+/* freely, subject to the following restrictions: */
+/* */
+/* 1. The origin of this software must not be misrepresented; you must not */
+/* claim that you wrote the original software. If you use this software */
+/* in a product, an acknowledgment in the product documentation would be */
+/* appreciated but is not required. */
+/* 2. Altered source versions must be plainly marked as such, and must not */
+/* be misrepresented as being the original software. */
+/* 3. This notice may not be removed or altered from any source */
+/* distribution. */
+/* */
+/*****************************************************************************/
+
+
+
+/* common */
+#include "check.h"
+#include "xmalloc.h"
+
+/* sp65 */
+#include "bitmap.h"
+#include "error.h"
+
+
+
+/*****************************************************************************/
+/* Code */
+/*****************************************************************************/
+
+
+
+Bitmap* NewBitmap (unsigned Width, unsigned Height)
+/* Create a new bitmap. The type is set to unknown and the palette to NULL */
+{
+ Bitmap* B;
+
+ /* Calculate the size of the bitmap in pixels */
+ unsigned long Size = (unsigned long) Width * Height;
+
+ /* Some safety checks */
+ PRECONDITION (Size > 0 && Size <= BM_MAX_SIZE);
+
+ /* Allocate memory */
+ B = xmalloc (sizeof (*B) + (Size - 1) * sizeof (B->Data[0]));
+
+ /* Initialize the data */
+ B->Type = bmUnknown;
+ SB_Init (&B->Name);
+ B->Width = Width;
+ B->Height = Height;
+ B->Pal = 0;
+
+ /* Return the bitmap */
+ return B;
+}
+
+
+
+void FreeBitmap (Bitmap* B)
+/* Free a dynamically allocated bitmap */
+{
+ /* Free the palette */
+ xfree (B->Pal);
+}
+
+
+
+Color GetPixelColor (const Bitmap* B, unsigned X, unsigned Y)
+/* Get the color for a given pixel. For indexed bitmaps, the palette entry
+ * is returned.
+ */
+{
+ /* Get the pixel at the given coordinates */
+ Pixel P = GetPixel (B, X, Y);
+
+ /* If the bitmap has a palette, return the color from the palette. For
+ * simplicity, we will only check the palette, not the type.
+ */
+ if (B->Pal) {
+ if (P.Index >= B->Pal->Count) {
+ /* Palette index is invalid */
+ Error ("Invalid palette index %u at position %u/%u of \"%*s\"",
+ P.Index, X, Y, SB_GetLen (&B->Name),
+ SB_GetConstBuf (&B->Name));
+ }
+ return B->Pal->Entries[P.Index];
+ } else {
+ return P.C;
+ }
+}
+
+
+
+Pixel GetPixel (const Bitmap* B, unsigned X, unsigned Y)
+/* Return a pixel from the bitmap. The returned value may either be a color
+ * or a palette index, depending on the type of the bitmap.
+ */
+{
+ /* Check the coordinates */
+ PRECONDITION (X < B->Width && Y < B->Height);
+
+ /* Return the pixel */
+ return B->Data[Y * B->Width + X];
+}
+
+
+
--- /dev/null
+/*****************************************************************************/
+/* */
+/* bitmap.h */
+/* */
+/* Bitmap definition for the sp65 sprite and bitmap utility */
+/* */
+/* */
+/* */
+/* (C) 2012, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
+/* */
+/* */
+/* This software is provided 'as-is', without any expressed or implied */
+/* warranty. In no event will the authors be held liable for any damages */
+/* arising from the use of this software. */
+/* */
+/* Permission is granted to anyone to use this software for any purpose, */
+/* including commercial applications, and to alter it and redistribute it */
+/* freely, subject to the following restrictions: */
+/* */
+/* 1. The origin of this software must not be misrepresented; you must not */
+/* claim that you wrote the original software. If you use this software */
+/* in a product, an acknowledgment in the product documentation would be */
+/* appreciated but is not required. */
+/* 2. Altered source versions must be plainly marked as such, and must not */
+/* be misrepresented as being the original software. */
+/* 3. This notice may not be removed or altered from any source */
+/* distribution. */
+/* */
+/*****************************************************************************/
+
+
+
+#ifndef BITMAP_H
+#define BITMAP_H
+
+
+
+/* common */
+#include "strbuf.h"
+
+/* sp65 */
+#include "palette.h"
+#include "pixel.h"
+
+
+
+/*****************************************************************************/
+/* Data */
+/*****************************************************************************/
+
+
+
+/* Safety limit for the size of the bitmap in pixels */
+#define BM_MAX_SIZE 4194304UL
+
+/* Bitmap type */
+typedef enum BitmapType BitmapType;
+enum BitmapType {
+ bmUnknown,
+ bmMonochrome,
+ bmIndexed,
+ bmRGB,
+ bmRGBA
+};
+
+/* Bitmap structure */
+typedef struct Bitmap Bitmap;
+struct Bitmap {
+
+ /* Type of the bitmap */
+ BitmapType Type;
+
+ /* Name of the bitmap. This is used for error messages and should be
+ * something that allows the user to identify which bitmap the message
+ * refers to. For bitmaps loaded from a file, using the file name is
+ * a good idea.
+ */
+ StrBuf Name;
+
+ /* Size of the bitmap */
+ unsigned Width;
+ unsigned Height;
+
+ /* Palette for monochrome and indexed bitmap types, otherwise NULL */
+ Palette* Pal;
+
+ /* Pixel data, dynamically allocated */
+ Pixel Data[1];
+};
+
+
+
+/*****************************************************************************/
+/* Code */
+/*****************************************************************************/
+
+
+
+Bitmap* NewBitmap (unsigned Width, unsigned Height);
+/* Create a new bitmap. The type is set to unknown and the palette to NULL */
+
+void FreeBitmap (Bitmap* B);
+/* Free a dynamically allocated bitmap */
+
+Color GetPixelColor (const Bitmap* B, unsigned X, unsigned Y);
+/* Get the color for a given pixel. For indexed bitmaps, the palette entry
+ * is returned.
+ */
+
+Pixel GetPixel (const Bitmap* B, unsigned X, unsigned Y);
+/* Return a pixel from the bitmap. The returned value may either be a color
+ * or a palette index, depending on the type of the bitmap.
+ */
+
+
+
+/* End of bitmap.h */
+
+#endif
+
+
+
--- /dev/null
+/*****************************************************************************/
+/* */
+/* color.h */
+/* */
+/* Color definition for the sp65 sprite and bitmap utility */
+/* */
+/* */
+/* */
+/* (C) 2012, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
+/* */
+/* */
+/* This software is provided 'as-is', without any expressed or implied */
+/* warranty. In no event will the authors be held liable for any damages */
+/* arising from the use of this software. */
+/* */
+/* Permission is granted to anyone to use this software for any purpose, */
+/* including commercial applications, and to alter it and redistribute it */
+/* freely, subject to the following restrictions: */
+/* */
+/* 1. The origin of this software must not be misrepresented; you must not */
+/* claim that you wrote the original software. If you use this software */
+/* in a product, an acknowledgment in the product documentation would be */
+/* appreciated but is not required. */
+/* 2. Altered source versions must be plainly marked as such, and must not */
+/* be misrepresented as being the original software. */
+/* 3. This notice may not be removed or altered from any source */
+/* distribution. */
+/* */
+/*****************************************************************************/
+
+
+
+#ifndef COLOR_H
+#define COLOR_H
+
+
+
+/*****************************************************************************/
+/* Data */
+/*****************************************************************************/
+
+
+
+/* Color structure */
+typedef struct Color Color;
+struct Color {
+ unsigned char R;
+ unsigned char G;
+ unsigned char B;
+ unsigned char A;
+};
+
+
+
+/*****************************************************************************/
+/* Code */
+/*****************************************************************************/
+
+
+
+/* End of color.h */
+
+#endif
+
+
+
# -----------------------------------------------------------------------------
# List of all object files
-OBJS = error.o \
- main.o
+OBJS = bitmap.o \
+ error.o \
+ main.o \
+ palette.o
LIBS = $(COMMON)/common.a
--- /dev/null
+/*****************************************************************************/
+/* */
+/* palette.c */
+/* */
+/* Color palette definition for the sp65 sprite and bitmap utility */
+/* */
+/* */
+/* */
+/* (C) 2012, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
+/* */
+/* */
+/* This software is provided 'as-is', without any expressed or implied */
+/* warranty. In no event will the authors be held liable for any damages */
+/* arising from the use of this software. */
+/* */
+/* Permission is granted to anyone to use this software for any purpose, */
+/* including commercial applications, and to alter it and redistribute it */
+/* freely, subject to the following restrictions: */
+/* */
+/* 1. The origin of this software must not be misrepresented; you must not */
+/* claim that you wrote the original software. If you use this software */
+/* in a product, an acknowledgment in the product documentation would be */
+/* appreciated but is not required. */
+/* 2. Altered source versions must be plainly marked as such, and must not */
+/* be misrepresented as being the original software. */
+/* 3. This notice may not be removed or altered from any source */
+/* distribution. */
+/* */
+/*****************************************************************************/
+
+
+
+/* common */
+#include "check.h"
+#include "xmalloc.h"
+
+/* sp65 */
+#include "palette.h"
+
+
+
+/*****************************************************************************/
+/* Code */
+/*****************************************************************************/
+
+
+
+Palette* NewPalette (unsigned Entries)
+/* Create a new palette with the given number of entries */
+{
+ Palette* P;
+
+ /* Some safety checks */
+ PRECONDITION (Entries > 0 && Entries <= 256);
+
+ /* Allocate memory */
+ P = xmalloc (sizeof (*P) + (Entries - 1) * sizeof (P->Entries[0]));
+
+ /* Initialize the struct, then return it */
+ P->Count = Entries;
+ return P;
+}
+
+
+
+void FreePalette (Palette* P)
+/* Free a dynamically allocated palette */
+{
+ xfree (P);
+}
+
+
+
--- /dev/null
+/*****************************************************************************/
+/* */
+/* palette.h */
+/* */
+/* Color palette definition for the sp65 sprite and bitmap utility */
+/* */
+/* */
+/* */
+/* (C) 2012, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
+/* */
+/* */
+/* This software is provided 'as-is', without any expressed or implied */
+/* warranty. In no event will the authors be held liable for any damages */
+/* arising from the use of this software. */
+/* */
+/* Permission is granted to anyone to use this software for any purpose, */
+/* including commercial applications, and to alter it and redistribute it */
+/* freely, subject to the following restrictions: */
+/* */
+/* 1. The origin of this software must not be misrepresented; you must not */
+/* claim that you wrote the original software. If you use this software */
+/* in a product, an acknowledgment in the product documentation would be */
+/* appreciated but is not required. */
+/* 2. Altered source versions must be plainly marked as such, and must not */
+/* be misrepresented as being the original software. */
+/* 3. This notice may not be removed or altered from any source */
+/* distribution. */
+/* */
+/*****************************************************************************/
+
+
+
+#ifndef PALETTE_H
+#define PALETTE_H
+
+
+
+/* sp65 */
+#include "color.h"
+
+
+
+/*****************************************************************************/
+/* Data */
+/*****************************************************************************/
+
+
+
+typedef struct Palette Palette;
+struct Palette {
+ unsigned Count; /* Number of entries */
+ Color Entries[1]; /* Palette entries - dynamic */
+};
+
+
+
+/*****************************************************************************/
+/* Code */
+/*****************************************************************************/
+
+
+
+Palette* NewPalette (unsigned Entries);
+/* Create a new palette with the given number of entries */
+
+void FreePalette (Palette* P);
+/* Free a dynamically allocated palette */
+
+
+
+/* End of palette.h */
+
+#endif
+
+
+
--- /dev/null
+/*****************************************************************************/
+/* */
+/* pixel.h */
+/* */
+/* Pixel definition for the sp65 sprite and bitmap utility */
+/* */
+/* */
+/* */
+/* (C) 2012, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
+/* */
+/* */
+/* This software is provided 'as-is', without any expressed or implied */
+/* warranty. In no event will the authors be held liable for any damages */
+/* arising from the use of this software. */
+/* */
+/* Permission is granted to anyone to use this software for any purpose, */
+/* including commercial applications, and to alter it and redistribute it */
+/* freely, subject to the following restrictions: */
+/* */
+/* 1. The origin of this software must not be misrepresented; you must not */
+/* claim that you wrote the original software. If you use this software */
+/* in a product, an acknowledgment in the product documentation would be */
+/* appreciated but is not required. */
+/* 2. Altered source versions must be plainly marked as such, and must not */
+/* be misrepresented as being the original software. */
+/* 3. This notice may not be removed or altered from any source */
+/* distribution. */
+/* */
+/*****************************************************************************/
+
+
+
+#ifndef PIXEL_H
+#define PIXEL_H
+
+
+
+/* sp65 */
+#include "color.h"
+
+
+
+/*****************************************************************************/
+/* Data */
+/*****************************************************************************/
+
+
+
+/* A pixel is either a color or a palette index, depending on the bitmap */
+typedef union Pixel Pixel;
+union Pixel {
+ Color C;
+ unsigned Index;
+};
+
+
+
+/*****************************************************************************/
+/* Code */
+/*****************************************************************************/
+
+
+
+/* End of pixel.h */
+
+#endif
+
+
+