diff options
| author | Matthias Melcher <git@matthiasm.com> | 2020-01-14 19:22:03 +0100 |
|---|---|---|
| committer | Matthias Melcher <git@matthiasm.com> | 2020-01-14 19:22:03 +0100 |
| commit | afcc79c3f7d5ffd9f9bd2185494688a5d5927aab (patch) | |
| tree | 667156480c4b8c5eef936b47ed5103e3c137565f /src/Fl_Image_Reader.cxx | |
| parent | ed80d9cef0c321012c65c31104be66dc64bf2fad (diff) | |
| parent | d598f9ea06f610053cd16b51cbe1aa477c8501ef (diff) | |
Merge remote-tracking branch 'refs/remotes/origin/master'
Diffstat (limited to 'src/Fl_Image_Reader.cxx')
| -rw-r--r-- | src/Fl_Image_Reader.cxx | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/src/Fl_Image_Reader.cxx b/src/Fl_Image_Reader.cxx new file mode 100644 index 000000000..083efb471 --- /dev/null +++ b/src/Fl_Image_Reader.cxx @@ -0,0 +1,131 @@ +// +// Internal (Image) Reader class for the Fast Light Tool Kit (FLTK). +// +// Copyright 2020 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// https://www.fltk.org/COPYING.php +// +// Please report all bugs and problems on the following page: +// +// https://www.fltk.org/str.php +// + + +// +// Include necessary header files... +// + +#include "Fl_Image_Reader.h" + +#include <FL/fl_utf8.h> +#include <stdlib.h> +#include <string.h> + +/* + This internal (undocumented) class reads data chunks from a file or from + memory in LSB-first byte order. + + This class is used in Fl_GIF_Image and Fl_BMP_Image to avoid code + duplication and may be extended to be used in similar cases. Future + options might be to read data in MSB-first byte order or to add more + methods. +*/ + +// Initialize the reader to access the file system, filename is copied +// and stored. +int Fl_Image_Reader::open(const char *filename) { + if (!filename) + return -1; + pName = strdup(filename); + if ( (pFile = fl_fopen(filename, "rb")) == NULL ) { + return -1; + } + pIsFile = 1; + return 0; +} + +// Initialize the reader for memory access, name is copied and stored +int Fl_Image_Reader::open(const char *imagename, const unsigned char *data) { + if (imagename) + pName = strdup(imagename); + if (data) { + pStart = pData = data; + pIsData = 1; + return 0; + } else { + return -1; + } +} + +// Close and destroy the reader +Fl_Image_Reader::~Fl_Image_Reader() { + if (pIsFile && pFile) { + fclose(pFile); + } + if (pName) + ::free(pName); +} + +// Read a single byte from memory or a file +uchar Fl_Image_Reader::read_byte() { + if (pIsFile) { + return getc(pFile); + } else if (pIsData) { + return *pData++; + } else { + return 0; + } +} + +// Read a 16-bit unsigned integer, LSB-first +unsigned short Fl_Image_Reader::read_word() { + unsigned char b0, b1; // Bytes from file + if (pIsFile) { + b0 = (uchar)getc(pFile); + b1 = (uchar)getc(pFile); + return ((b1 << 8) | b0); + } else if (pIsData) { + b0 = *pData++; + b1 = *pData++; + return ((b1 << 8) | b0); + } else { + return 0; + } +} + +// Read a 32-bit unsigned integer, LSB-first +unsigned int Fl_Image_Reader::read_dword() { + unsigned char b0, b1, b2, b3; // Bytes from file + if (pIsFile) { + b0 = (uchar)getc(pFile); + b1 = (uchar)getc(pFile); + b2 = (uchar)getc(pFile); + b3 = (uchar)getc(pFile); + return ((((((b3 << 8) | b2) << 8) | b1) << 8) | b0); + } else if (pIsData) { + b0 = *pData++; + b1 = *pData++; + b2 = *pData++; + b3 = *pData++; + return ((((((b3 << 8) | b2) << 8) | b1) << 8) | b0); + } else { + return 0; + } +} + +// Read a 32-bit signed integer, LSB-first +// int Fl_Image_Reader::read_long() -- implementation in header file + +// Move the current read position to a byte offset from the beginning +// of the file or the original start address in memory +void Fl_Image_Reader::seek(unsigned int n) { + if (pIsFile) { + fseek(pFile, n , SEEK_SET); + } else if (pIsData) { + pData = pStart + n; + } +} |
