Add logic to load texture images from a graphic file
This commit is contained in:
parent
7d86b9ce7a
commit
76e03225e0
@ -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)
|
||||
|
@ -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;
|
||||
|
87
graphics/traveler/include/trv_pcx.h
Executable file
87
graphics/traveler/include/trv_pcx.h
Executable 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 */
|
167
graphics/traveler/src/trv_graphicfile.c
Normal file
167
graphics/traveler/src/trv_graphicfile.c
Normal 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];
|
||||
}
|
217
graphics/traveler/src/trv_pcx.c
Normal file
217
graphics/traveler/src/trv_pcx.c
Normal 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user