Add logic to load texture images from a graphic file

This commit is contained in:
Gregory Nutt 2014-12-07 09:53:12 -06:00
parent 7d86b9ce7a
commit 76e03225e0
5 changed files with 476 additions and 27 deletions

View File

@ -47,10 +47,10 @@ STACKSIZE = 2048
ASRCS =
CSRCS = trv_bitmapfile.c trv_bitmaps.c trv_color.c trv_createworld.c
CSRCS += trv_doors.c trv_fsutils.c trv_graphics.c trv_input.c trv_mem.c
CSRCS += trv_planefiles.c trv_planelists.c trv_pov.c trv_rayavoid.c
CSRCS += trv_raycast.c trv_raycntl.c trv_rayprune.c trv_rayrend.c
CSRCS += trv_texturefile.c trv_trigtbl.c
CSRCS += trv_doors.c trv_fsutils.c trv_graphicfile.c trv_graphics.c
CSRCS += trv_input.c trv_mem.c trv_pcx.c trv_planefiles.c trv_planelists.c
CSRCS += trv_pov.c trv_rayavoid.c trv_raycast.c trv_raycntl.c
CSRCS += trv_rayprune.c trv_rayrend.c trv_texturefile.c trv_trigtbl.c
MAINSRC = trv_main.c
ifeq ($(CONFIG_NX),y)

View File

@ -41,40 +41,18 @@
****************************************************************************/
#include "trv_types.h"
#include "trv_color.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* MAGIC_LENGTH must be the length of the longest MAGIC string. */
#define MAGIC_LENGTH 5
#define GIF_MAGIC "GIF87"
#define GIF89_MAGIC "GIF89"
#define PPM_MAGIC "P6"
/****************************************************************************
* Public Type Definitions
****************************************************************************/
enum trv_graphicfile_format_e
{
GRAPHICFILE_UNKNOWN = 0,
GRAPHICFILE_GIF87,
GRAPHICFILE_GIF89,
GRAPHICFILE_PPM,
GRAPHICFILE_PCX
};
enum trv_graphicfile_type_e
{
GRAPHICFILE_TRUECOLOR = 0,
GRAPHICFILE_PALETTED
};
struct trv_graphicfile_s
{
uint8_t type; /* See enum trv_graphicfile_type_e */
uint16_t height;
uint16_t width;
int palette_entries;

View File

@ -0,0 +1,87 @@
/****************************************************************************
* apps/graphics/traveler/include/trv_pcx.h
* This is the header file associated with trv_pcx.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_PCX_H
#define __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_PCX_H
/****************************************************************************
* Included Files
****************************************************************************/
#include "trv_types.h"
#include <stdio.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define SIZEOF_PCX_HEADER 128
/****************************************************************************
* Public Type Definitions
****************************************************************************/
struct pcx_header_s
{
char manufacturer;
char version;
char encoding;
char bits_per_pixel;
int16_t x, y;
int16_t width, height;
int16_t horz_res;
int16_t vert_res;
char ega_palette[48];
char reserved;
char num_color_planes;
int16_t bytes_per_line;
int16_t palette_type;
char padding[58];
};
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
FAR struct trv_graphicfile_s *trv_load_pcx(FAR FILE *fp,
FAR const char *filename);
#endif /* __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_PCX_H */

View File

@ -0,0 +1,167 @@
/*******************************************************************************
* apps/graphics/traveler/src/trv_graphicfile.c
* Load image from a graphic file
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included files
****************************************************************************/
#include "trv_types.h"
#include "trv_mem.h"
#include "trv_pcx.h"
#include "trv_graphicfile.h"
#include <stdio.h>
#include <errno.h>
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: tvr_graphicfile_read
*
* Description:
* Read a bitmap texture from a graphic file
*
* NOTE: This function exists only as extension pointer where additional
* graphic file formats can be supported. Currently only the ancient
* PCX format is supported.
*
***************************************************************************/
FAR struct trv_graphicfile_s *tvr_graphicfile_read(char *filename)
{
FAR struct trv_graphicfile_s *gfile = NULL;
FAR FILE *fp;
/* Open the graphic file for reading */
fp = fopen(filename, "rb");
if (fp == NULL)
{
int errcode = errno;
fprintf(stderr, "ERROR: Failed to open graphic file %s: %d\n",
filename, errcode);
return NULL;
}
/* Load the graphic file into memory.
*
* REVISIT: Here would be the place where we would decide on the format of
* the graphic file. Here we just assume that the file is PCX.
*/
gfile = trv_load_pcx(fp, filename);
if (gfile == NULL)
{
fprintf(stderr, "ERROR: Failed to load graphic file %s\n", filename);
}
fclose(fp);
return gfile;
}
/*************************************************************************
* Name: trv_graphicfile_new
*
* Description:
* Allocate a new graphic file structure
*
************************************************************************/
FAR struct trv_graphicfile_s *trv_graphicfile_new(void)
{
FAR struct trv_graphicfile_s *gfile;
gfile = (FAR struct trv_graphicfile_s*)
trv_malloc(sizeof(struct trv_graphicfile_s));
if (gfile)
{
gfile->transparent_entry = -1;
}
return gfile;
}
/*************************************************************************
* Name: trv_graphicfile_free
*
* Description:
* Free the graphic file structure after also freeing in additional
* resources attached to the structure.
************************************************************************/
void trv_graphicfile_free(FAR struct trv_graphicfile_s *gfile)
{
if (gfile != NULL)
{
if (gfile->palette != NULL)
{
trv_free(gfile->palette);
}
if (gfile->bitmap != NULL)
{
trv_free(gfile->bitmap);
}
trv_free(gfile);
}
}
/*************************************************************************
* Name: trv_graphicfile_pixel
*
* Description:
* Return the RGB color value for a pixel at location (x,y) in the
* texture bitmap.
*
************************************************************************/
struct trv_color_rgb_s
trv_graphicfile_pixel(FAR struct trv_graphicfile_s *gfile, int x, int y)
{
/* REVISIT: This only works for paletted graphics files like PCX.
* For the paletted color, the color lookup values lies at the (x,y)
* position in the image. For a true color image, the RGB value would
* lie at the (x,y) position,
*/
int ndx = gfile->bitmap[y * gfile->width + x];
return gfile->palette[ndx];
}

View File

@ -0,0 +1,217 @@
/*******************************************************************************
* apps/graphics/traveler/src/trv_pcx.c
* PCX graphic file support
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included files
****************************************************************************/
#include "trv_types.h"
#include "trv_mem.h"
#include "trv_color.h"
#include "trv_bitmaps.h"
#include "trv_graphicfile.h"
#include "trv_pcx.h"
#include <stdio.h>
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: trv_load_pcxheader
*
* Description:
*
***************************************************************************/
static void trv_load_pcxheader(FAR FILE *fp, struct pcx_header_s *header)
{
FAR uint8_t *tmpbuffer;
int i;
/* Load the header */
tmpbuffer = (FAR uint8_t*)header;
for (i = 0; i < SIZEOF_PCX_HEADER; i++)
{
tmpbuffer[i] = getc(fp);
}
}
/****************************************************************************
* Name: trv_load_pcxdata
*
* Description:
*
***************************************************************************/
static void trv_load_pcxdata(FAR FILE *fp, int32_t imagesize,
FAR uint8_t *imagebuffer)
{
uint32_t count;
int16_t nbytes;
uint8_t data;
count = 0;
while(count <= imagesize)
{
/* Get the first piece of data */
data = getc(fp);
/* Is this a run length encoding? */
if ((data >= 192) /* && (data <= 255) */)
{
/* How many bytes in run? */
nbytes = data - 192;
/* Get the actual data for the run */
data = getc(fp);
/* Replicate data in buffer nbytes times */
while(nbytes-- > 0)
{
imagebuffer[count++] = data;
}
}
else
{
/* Actual data, just copy it into buffer at next location */
imagebuffer[count++] = data;
}
}
}
/****************************************************************************
* Name: trv_load_pcxpalette
*
* Description:
*
***************************************************************************/
static void trv_load_pcxpalette(FAR FILE *fp,
FAR struct trv_color_rgb_s *palette)
{
int i;
/* Move to end of file then back up 768 bytes i.e. to beginning of palette */
(void)fseek(fp, -768L, SEEK_END);
/* Load the PCX palette into the palette structure */
for (i = 0; i < 256; i++)
{
/* Get the RGB components */
palette[i].red = getc(fp);
palette[i].green = getc(fp);
palette[i].blue = getc(fp);
}
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: trv_load_pcx
*
* Description:
* This function loads a PCX file into a memory.
*
***************************************************************************/
FAR struct trv_graphicfile_s *trv_load_pcx(FAR FILE *fp,
FAR const char *filename)
{
struct pcx_header_s header;
FAR trv_pixel_t *buffer;
FAR struct trv_graphicfile_s *gfile;
FAR struct trv_color_rgb_s *palette;
uint16_t imagewidth;
uint16_t imageheight;
uint32_t imagesize;
/* Load the PCX Header */
trv_load_pcxheader(fp, &header);
/* Allocate Space to hold the image data */
imagewidth = header.width - header.x + 1;
imageheight = header.height - header.y + 1;
imagesize = imageheight * imagewidth * sizeof(trv_pixel_t);
buffer = (FAR trv_pixel_t*)trv_malloc(imagesize + 1);
/* Load the PCX data into the buffer */
trv_load_pcxdata(fp, imagesize, (FAR uint8_t*)buffer);
/* Allocate space to hold the PCX palette */
palette = (struct trv_color_rgb_s*)
trv_malloc(sizeof(struct trv_color_rgb_s) * 256);
gfile = NULL;
if (palette)
{
/* Load the PCX palette */
trv_load_pcxpalette(fp, palette);
/* Now save the resulting data in a struct trv_graphicfile_s structure */
gfile = trv_graphicfile_new();
if (gfile)
{
gfile->palette = palette;
gfile->width = imagewidth;
gfile->height = imageheight;
gfile->bitmap = buffer;
}
}
return gfile;
}