Merge remote-tracking branch 'refs/remotes/origin/master'

This commit is contained in:
Matthias Melcher 2020-01-14 19:22:03 +01:00
commit afcc79c3f7
16 changed files with 379 additions and 306 deletions

View File

@ -3,17 +3,17 @@
//
// BMP image header file for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2010 by Bill Spitzak and others.
// Copyright 1998-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:
//
// http://www.fltk.org/COPYING.php
// https://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
// https://www.fltk.org/str.php
//
/* \file
@ -25,7 +25,7 @@
/**
The Fl_BMP_Image class supports loading, caching,
and drawing of Windows Bitmap (BMP) image files.
and drawing of Windows Bitmap (BMP) image files.
*/
class FL_EXPORT Fl_BMP_Image : public Fl_RGB_Image {
@ -36,7 +36,7 @@ class FL_EXPORT Fl_BMP_Image : public Fl_RGB_Image {
protected:
void load_bmp_(class BMPReader &rdr);
void load_bmp_(class Fl_Image_Reader &rdr);
};

View File

@ -3,7 +3,7 @@
//
// GIF image header file for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2010 by Bill Spitzak and others.
// Copyright 1998-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
@ -37,7 +37,7 @@ public:
protected:
void load_gif_(class GIFReader &rdr);
void load_gif_(class Fl_Image_Reader &rdr);
};

View File

@ -46,6 +46,7 @@ set (CPPFILES
Fl_Group.cxx
Fl_Help_View.cxx
Fl_Image.cxx
Fl_Image_Reader.cxx
Fl_Image_Surface.cxx
Fl_Input.cxx
Fl_Input_.cxx

View File

@ -1,8 +1,9 @@
//
// "$Id$"
//
// Fl_BMP_Image routines.
// Fl_BMP_Image class for the Fast Light Tool Kit (FLTK).
//
// Copyright 2011-2020 by Bill Spitzak and others.
// Copyright 1997-2010 by Easy Software Products.
// Image support by Matthias Melcher, Copyright 2000-2009.
//
@ -10,15 +11,11 @@
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
//
// http://www.fltk.org/COPYING.php
// https://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
//
// Contents:
//
// Fl_BMP_Image::Fl_BMP_Image() - Load a BMP image file.
// https://www.fltk.org/str.php
//
//
@ -26,12 +23,12 @@
//
#include <FL/Fl_BMP_Image.H>
#include "Fl_Image_Reader.h"
#include <FL/fl_utf8.h>
#include <FL/Fl.H>
#include <stdio.h>
#include <stdlib.h>
//
// BMP definitions...
//
@ -44,135 +41,8 @@
#endif // !BI_RGB
//
// Local reader class...
//
/*
This class reads data chunks from a file or from memory in LSB-first
byte order.
TODO: GIFReader and BMPReader are very similar and should be combined to avoid
code duplication.
*/
class BMPReader
{
public:
// Create the reader.
BMPReader() :
pIsFile(0), pIsData(0),
pFile(0L), pData(0L), pStart(0L),
pName(0L)
{ }
// Initialize the reader to access the file system, filename is copied
// and stored.
int 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 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
~BMPReader() {
if (pIsFile && pFile) {
fclose(pFile);
}
if (pName)
::free(pName);
}
// Read a single byte form memory or a file
uchar 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 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 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 read_long() {
return (int)read_dword();
};
// Move the current read position to a byte offset fro the beginning of the
// file or the original start address in memory
void seek(unsigned int n) {
if (pIsFile) {
fseek(pFile, n , SEEK_SET);
} else if (pIsData) {
pData = pStart + n;
}
}
// return the name or filename for this reader
const char *name() { return pName; }
private:
// open() sets this if we read form a file
char pIsFile;
// open() sets this if we read form memory
char pIsData;
// a pointer to the opened file
FILE *pFile;
// a pointer to the current byte in memory
const unsigned char *pData;
// a pointer to the start of the image data
const unsigned char *pStart;
// a copy of the name associated with this reader
char *pName;
};
/**
\brief The constructor loads the named BMP image from the given bmp filename.
\brief This constructor loads the named BMP image from the given BMP filename.
The destructor frees all memory and server resources that are used by
the image.
@ -189,11 +59,11 @@ private:
Fl_BMP_Image::Fl_BMP_Image(const char *filename) // I - File to read
: Fl_RGB_Image(0,0,0)
{
BMPReader f;
if (f.open(filename)==-1) {
Fl_Image_Reader rdr;
if (rdr.open(filename) == -1) {
ld(ERR_FILE_ACCESS);
} else {
load_bmp_(f);
load_bmp_(rdr);
}
}
@ -201,12 +71,12 @@ Fl_BMP_Image::Fl_BMP_Image(const char *filename) // I - File to read
\brief Read a BMP image from memory.
Construct an image from a block of memory inside the application. Fluid offers
"binary Data" chunks as a great way to add image data into the C++ source code.
"binary data" chunks as a great way to add image data into the C++ source code.
imagename can be NULL. If a name is given, the image is added to the list of
shared images and will be available by that name.
Use Fl_Image::fail() to check if Fl_BMP_Image failed to load. fail() returns
ERR_FILE_ACCESS if the file could not be opened or read, ERR_FORMAT if the
ERR_FILE_ACCESS if the image could not be read from memory, ERR_FORMAT if the
BMP format could not be decoded, and ERR_NO_IMAGE if the image could not
be loaded for another reason.
@ -219,20 +89,20 @@ Fl_BMP_Image::Fl_BMP_Image(const char *filename) // I - File to read
Fl_BMP_Image::Fl_BMP_Image(const char *imagename, const unsigned char *data)
: Fl_RGB_Image(0,0,0)
{
BMPReader d;
if (d.open(imagename, data)==-1) {
Fl_Image_Reader rdr;
if (rdr.open(imagename, data) == -1) {
ld(ERR_FILE_ACCESS);
} else {
load_bmp_(d);
load_bmp_(rdr);
}
}
/*
This method reads BMP image data and creates an RGB or RGBA image. The BMP
format supports only 1 bit for alpha. To avoid code duplication, we use
a BMPReader that reads data from either a file or from memory.
an Fl_Image_Reader that reads data from either a file or from memory.
*/
void Fl_BMP_Image::load_bmp_(class BMPReader &rdr)
void Fl_BMP_Image::load_bmp_(Fl_Image_Reader &rdr)
{
int info_size, // Size of info header
depth, // Depth of image (bits)
@ -584,7 +454,7 @@ void Fl_BMP_Image::load_bmp_(class BMPReader &rdr)
break;
}
}
if (havemask) {
for (y = h() - 1; y >= 0; y --) {
ptr = (uchar *)array + y * w() * d() + 3;

View File

@ -3,7 +3,7 @@
//
// Fl_GIF_Image routines.
//
// Copyright 1997-2019 by Bill Spitzak and others.
// Copyright 1997-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
@ -15,9 +15,6 @@
//
// http://www.fltk.org/str.php
//
// Contents:
//
//
//
// Reference: GIF89a Specification (links valid as of Jan 05, 2019):
@ -35,11 +32,13 @@
#include <FL/Fl.H>
#include <FL/Fl_GIF_Image.H>
#include <stdio.h>
#include <stdlib.h>
#include "Fl_Image_Reader.h"
#include <FL/fl_utf8.h>
#include "flstring.h"
#include <stdio.h>
#include <stdlib.h>
// Read a .gif file and convert it to a "xpm" format (actually my
// modified one with compressed colormaps).
@ -75,100 +74,6 @@
* (415) 336-1080
*/
typedef unsigned char uchar;
//
// Local reader class...
//
/*
This class reads data chunks from a file or from memory in LSB-first
byte order.
TODO: GIFReader and BMPReader are very similar and should be combined to avoid
code duplication.
*/
class GIFReader
{
public:
// Create the reader.
GIFReader() :
pIsFile(0), pIsData(0),
pFile(0L), pData(0L),
pName(0L)
{ }
// Initialize the reader to access the file system, filename is copied
// and stored.
int 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 open(const char *imagename, const unsigned char *data) {
if (imagename)
pName = strdup(imagename);
if (data) {
pData = data;
pIsData = 1;
return 0;
} else {
return -1;
}
}
// Close and destroy the reader
~GIFReader() {
if (pIsFile && pFile) {
fclose(pFile);
}
if (pName)
::free(pName);
}
// Read a single byte form memory or a file
uchar 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 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;
}
}
// return the name or filename for this reader
const char *name() { return pName; }
private:
// open() sets this if we read form a file
char pIsFile;
// open() sets this if we read form memory
char pIsData;
// a pointer to the opened file
FILE *pFile;
// a pointer to the current byte in memory
const unsigned char *pData;
// a copy of the name associated with this reader
char *pName;
};
/**
\brief The constructor loads the named GIF image.
@ -191,12 +96,12 @@ private:
Fl_GIF_Image::Fl_GIF_Image(const char *filename) :
Fl_Pixmap((char *const*)0)
{
GIFReader f;
if (f.open(filename)==-1) {
Fl_Image_Reader rdr;
if (rdr.open(filename) == -1) {
Fl::error("Fl_GIF_Image: Unable to open %s!", filename);
ld(ERR_FILE_ACCESS);
} else {
load_gif_(f);
load_gif_(rdr);
}
}
@ -222,24 +127,24 @@ Fl_GIF_Image::Fl_GIF_Image(const char *filename) :
\see Fl_GIF_Image::Fl_GIF_Image(const char *filename)
\see Fl_Shared_Image
*/
*/
Fl_GIF_Image::Fl_GIF_Image(const char *imagename, const unsigned char *data) :
Fl_Pixmap((char *const*)0)
{
GIFReader d;
if (d.open(imagename, data)==-1) {
Fl_Image_Reader rdr;
if (rdr.open(imagename, data)==-1) {
ld(ERR_FILE_ACCESS);
} else {
load_gif_(d);
load_gif_(rdr);
}
}
/*
This method reads GIF image data and creates an RGB or RGBA image. The GIF
format supports only 1 bit for alpha. To avoid code duplication, we use
a GIFReader that reads data from either a file or from memory.
*/
void Fl_GIF_Image::load_gif_(GIFReader &rdr)
an Fl_Image_Reader that reads data from either a file or from memory.
*/
void Fl_GIF_Image::load_gif_(Fl_Image_Reader &rdr)
{
char **new_data; // Data array
@ -343,7 +248,7 @@ void Fl_GIF_Image::load_gif_(GIFReader &rdr)
}
// skip the data:
while (blocklen>0) {while (blocklen--) {ch = rdr.read_byte();} blocklen=rdr.read_byte();}
while (blocklen>0) {while (blocklen--) {ch = rdr.read_byte();} blocklen = rdr.read_byte();}
}
if (BitsPerPixel >= CodeSize)
@ -402,7 +307,7 @@ void Fl_GIF_Image::load_gif_(GIFReader &rdr)
/* Fetch the next code from the raster data stream. The codes can be
* any length from 3 to 12 bits, packed into 8-bit bytes, so we have to
* maintain our location as a pointer and a bit offset.
* In addition, gif adds totally useless and annoying block counts
* In addition, GIF adds totally useless and annoying block counts
* that must be correctly skipped over. */
int CurCode = thisbyte;
if (frombit+CodeSize > 7) {

131
src/Fl_Image_Reader.cxx Normal file
View File

@ -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;
}
}

90
src/Fl_Image_Reader.h Normal file
View File

@ -0,0 +1,90 @@
//
// 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
//
/*
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.
*/
#ifndef FL_IMAGE_READER_H
#define FL_IMAGE_READER_H
#include <stdio.h>
class Fl_Image_Reader
{
public:
// Create the reader.
Fl_Image_Reader() :
pIsFile(0), pIsData(0),
pFile(0L), pData(0L),
pStart(0L),
pName(0L)
{}
// Initialize the reader to access the file system, filename is copied
// and stored.
int open(const char *filename);
// Initialize the reader for memory access, name is copied and stored
int open(const char *imagename, const unsigned char *data);
// Close and destroy the reader
~Fl_Image_Reader();
// Read a single byte from memory or a file
unsigned char read_byte();
// Read a 16-bit unsigned integer, LSB-first
unsigned short read_word();
// Read a 32-bit unsigned integer, LSB-first
unsigned int read_dword();
// Read a 32-bit signed integer, LSB-first
int read_long() {
return (int)read_dword();
};
// Move the current read position to a byte offset from the beginning
// of the file or the original start address in memory
void seek(unsigned int n);
// return the name or filename for this reader
const char *name() { return pName; }
private:
// open() sets this if we read from a file
char pIsFile;
// open() sets this if we read from memory
char pIsData;
// a pointer to the opened file
FILE *pFile;
// a pointer to the current byte in memory
const unsigned char *pData;
// a pointer to the start of the image data
const unsigned char *pStart;
// a copy of the name associated with this reader
char *pName;
};
#endif // FL_IMAGE_READER_H

View File

@ -3,17 +3,18 @@
//
// Preferences methods for the Fast Light Tool Kit (FLTK).
//
// Copyright 2011-2020 by Bill Spitzak and others.
// Copyright 2002-2010 by Matthias Melcher.
//
// 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:
//
// http://www.fltk.org/COPYING.php
// https://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
// https://www.fltk.org/str.php
//
#include <FL/Fl.H>
@ -118,48 +119,48 @@ unsigned int Fl_Preferences::file_access()
only as long as the application runs. It can be used as a database for
volatile information. FLTK uses it to register plugins at run-time.
\note On \b MSWindows, the directory is constructed by querying the <i>Common AppData</i>
or <i>AppData</i> key of the <tt>Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders</tt>
registry entry. The filename and path is then constructed as <tt>$(query)/$(vendor)/$(application).prefs</tt> .
\note On \b Windows, the directory is constructed by querying the <i>Common AppData</i>
or <i>AppData</i> key of the <tt>Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders</tt>
registry entry. The filename and path is then constructed as <tt>\$(query)/\$(vendor)/\$(application).prefs</tt> .
If the query call fails, data will be stored in RAM only and be lost when the app exits.
\par In FLTK versions before 1.4.0, if querying the registry failed, preferences would be written to
<tt>C:\FLTK\$(vendor)\$(application).prefs</tt> .
<tt>C:\\FLTK\\\$(vendor)\\\$(application).prefs</tt> .
\note On \b Linux, the \c USER directory is constructed by reading \c $HOME . If \c $HOME is not set
or not pointing to an existing directory, we are checking the path member of the passwd struct returned by
\c getpwuid(getuid()) . If all attempts fail, data will be stored in RAM only and be lost when the app exits.
The filename and path is then constructed as <tt>$(directory)/.fltk/$(vendor)/$(application).prefs</tt> .
The \c SYSTEM directory is hardcoded as <tt>/etc/fltk/$(vendor)/$(application).prefs</tt> .
The filename and path is then constructed as <tt>\$(directory)/.fltk/\$(vendor)/\$(application).prefs</tt> .
The \c SYSTEM directory is hardcoded as <tt>/etc/fltk/\$(vendor)/\$(application).prefs</tt> .
\par In FLTK versions before 1.4.0, if \c $HOME was not set, the \c USER path would be empty,
generating <tt>$(vendor)/$(application).prefs</tt>, which was used relative the the current working directory.
generating <tt>\$(vendor)/\$(application).prefs</tt>, which was used relative to the current working directory.
\note On \b MacOS, the \c USER directory is constructed by reading \c $HOME . If \c $HOME is not set
\note On \b macOS, the \c USER directory is constructed by reading \c $HOME . If \c $HOME is not set
or not pointing to an existing directory, we check the path returned by \c NSHomeDirectory() , and
finally checking the path member of the passwd struct returned by \c getpwuid(getuid()) .
If all attempts fail, data will be stored in RAM only and be lost when the app exits.
The filename and path is then constructed as <tt>$(directory)/Library/Preferences/$(vendor)/$(application).prefs</tt> .
The \c SYSTEM directory is hardcoded as <tt>/Library/Preferences/$(vendor)/$(application).prefs</tt> .
The filename and path is then constructed as <tt>\$(directory)/Library/Preferences/\$(vendor)/\$(application).prefs</tt> .
The \c SYSTEM directory is hardcoded as <tt>/Library/Preferences/\$(vendor)/\$(application).prefs</tt> .
\par In FLTK versions before 1.4.0, if \c $HOME was not set, the \c USER path would be \c NULL ,
generating <tt>\<null\>/Library/Preferences/$(vendor)/$(application).prefs</tt>, which would silently fail to
create a prefrences file.
generating <tt>\<null\>/Library/Preferences/\$(vendor)/\$(application).prefs</tt>, which would silently fail to
create a preferences file.
\param[in] root can be \c USER or \c SYSTEM for user specific or system wide preferences
\param[in] vendor unique text describing the company or author of this file, must be a valid filepath segment
\param[in] application unique text describing the application, must be a valid filepath segment
\todo Before the release of 1.4.0, I want to make a failed attempt to write a preferences file smarter. I
plan to use a subgroup of the "runtime" preferences to store data and stay accessable until the application
exits. Data would be stored under <tt>./$(vendor)/$(application).prefs</tt> in RAM, but not on disk.
\todo (Matt) Before the release of 1.4.0, I want to make a further attempt to write a preferences file smarter. I
plan to use a subgroup of the "runtime" preferences to store data and stay accessible until the application
exits. Data would be stored under <tt>./\$(vendor)/\$(application).prefs</tt> in RAM, but not on disk.
\todo I want a way to access the type of the root preferences (SYSTEM, USER, MEMORY), and the state of
\todo (Matt) I want a way to access the type of the root preferences (SYSTEM, USER, MEMORY), and the state of
the file access (OK, FILE_SYSTEM_FAIL, PERMISSION_FAIL, etc.), and probably the dirty() flag as well.
\todo Also, I need to explain runtime preferences.
\todo (Matt) Also, I need to explain runtime preferences.
\todo Lastly, I think I have to put short sample code in the Doxygen docs. The test app ist just not enough.
\todo (Matt) Lastly, I think I have to put short sample code in the Doxygen docs. The test app ist just not enough.
*/
Fl_Preferences::Fl_Preferences( Root root, const char *vendor, const char *application ) {
node = new Node( "." );
@ -564,8 +565,8 @@ static char *decodeText( const char *src ) {
for ( ; *s; s++, len++ ) {
if ( *s == '\\' ) {
if ( isdigit( s[1] ) ) {
s+=3;
} else {
s+=3;
} else {
s+=1;
}
}
@ -911,7 +912,7 @@ Fl_Preferences::RootNode::RootNode( Fl_Preferences *prefs, Root root, const char
char *filename = Fl::system_driver()->preference_rootnode(prefs, root, vendor, application);
filename_ = filename ? strdup(filename) : 0L;
vendor_ = strdup(vendor);
application_ = strdup(application);
application_ = strdup(application);
read();
}
@ -936,7 +937,7 @@ Fl_Preferences::RootNode::RootNode( Fl_Preferences *prefs, const char *path, con
filename_ = strdup(filename);
}
vendor_ = strdup(vendor);
application_ = strdup(application);
application_ = strdup(application);
read();
}
@ -990,7 +991,7 @@ int Fl_Preferences::RootNode::read() {
char buf[1024];
FILE *f = fl_fopen( filename_, "rb" );
if ( !f )
return -1;
return -1;
if (fgets( buf, 1024, f )==0) { /* ignore */ }
if (fgets( buf, 1024, f )==0) { /* ignore */ }
if (fgets( buf, 1024, f )==0) { /* ignore */ }
@ -1067,7 +1068,7 @@ char Fl_Preferences::RootNode::getPath( char *path, int pathlen ) {
return 1;
// copy the root filepath into the provided buffer
strlcpy( path, filename_, pathlen);
strlcpy( path, filename_, pathlen);
char *name = 0L, *ext = 0L;
@ -1366,7 +1367,7 @@ Fl_Preferences::Node *Fl_Preferences::Node::find( const char *path ) {
// - if the pathname is "." (current node) return this node
// - if the pathname is "./" (root node) return the topmost node
// - if the pathname starts with "./", start the search at the root node instead
Fl_Preferences::Node *Fl_Preferences::Node::search( const char *path, int offset ) {
Fl_Preferences::Node *Fl_Preferences::Node::search( const char *path, int offset ) {
if ( offset == 0 ) {
if ( path[0] == '.' ) {
if ( path[1] == 0 ) {

View File

@ -582,6 +582,7 @@ void Fl_Cocoa_Screen_Driver::breakMacEventLoop()
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
if (views_use_CA) [(FLView*)[self contentView] reset_aux_bitmap];
#endif
[[self standardWindowButton:NSWindowDocumentIconButton] setImage:nil];
[super close];
// when a fullscreen window is closed, windowDidResize may be sent after the close message was sent
// and before the FLWindow receives the final dealloc message
@ -1133,6 +1134,7 @@ static FLTextView *fltextview_instance = nil;
- (BOOL)windowShouldClose:(id)fl;
- (void)anyWindowWillClose:(NSNotification *)notif;
- (void)doNothing:(id)unused;
- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu;
@end
@ -1304,6 +1306,7 @@ static FLWindowDelegate *flwindowdelegate_instance = nil;
FLWindow *nsw = (FLWindow*)[notif object];
Fl_Window *window = [nsw getFl_Window];
Fl::first_window(window);
if (!window->parent()) [nsw orderFront:nil];
update_e_xy_and_e_xy_root(nsw);
if (fl_sys_menu_bar && Fl_MacOS_Sys_Menu_Bar_Driver::window_menu_style()) {
// select the corresponding Window menu item
@ -1390,6 +1393,9 @@ static FLWindowDelegate *flwindowdelegate_instance = nil;
{
return;
}
- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu {
return NO;
}
@end
@interface FLAppDelegate : NSObject
@ -3075,6 +3081,16 @@ Fl_X* Fl_Cocoa_Window_Driver::makeWindow()
[cw setLevel:winlevel];
q_set_window_title(cw, w->label(), w->iconlabel());
NSImage *icon = icon_image; // is a window or default icon present?
if (!icon) icon = ((Fl_Cocoa_Screen_Driver*)Fl::screen_driver())->default_icon;
if (icon && (winstyle & NSTitledWindowMask) && w->label() && strlen(w->label())>0) {
[cw setRepresentedFilename:[NSString stringWithFormat:@"/%@", [cw title]]];
NSButton *icon_button = [cw standardWindowButton:NSWindowDocumentIconButton];
if (icon_button) {
[icon setSize:[icon_button frame].size];
[icon_button setImage:icon];
}
}
if (!force_position()) {
if (w->modal()) {
[cw center];
@ -4428,13 +4444,59 @@ char *Fl_Darwin_System_Driver::preference_rootnode(Fl_Preferences *prefs, Fl_Pre
// Our C path names for preferences will be:
// SYSTEM: "/Library/Preferences/$vendor/$application.prefs"
// SYSTEM: "/Users/$user/Preferences/$vendor/$application.prefs"
// USER: "/Users/$user/Library/Preferences/$vendor/$application.prefs"
snprintf(filename + strlen(filename), FL_PATH_MAX - strlen(filename),
"/%s/%s.prefs", vendor, application);
return filename;
}
Fl_Cocoa_Window_Driver::~Fl_Cocoa_Window_Driver()
{
if (shape_data_) {
if (shape_data_->mask) {
CGImageRelease(shape_data_->mask);
}
delete shape_data_;
}
[icon_image release];
}
static NSImage* rgb_to_nsimage(const Fl_RGB_Image *rgb) {
if (!rgb) return nil;
int ld = rgb->ld();
if (!ld) ld = rgb->w() * rgb->d();
NSImage *win_icon = nil;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
if (fl_mac_os_version >= 101000) {
NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:rgb->w() pixelsHigh:rgb->h()
bitsPerSample:8 samplesPerPixel:rgb->d() hasAlpha:!(rgb->d() & 1) isPlanar:NO
colorSpaceName:(rgb->d()<=2) ? NSDeviceWhiteColorSpace : NSDeviceRGBColorSpace
bitmapFormat:NSAlphaNonpremultipliedBitmapFormat bytesPerRow:ld bitsPerPixel:rgb->d()*8]; // 10.4
memcpy([bitmap bitmapData], rgb->array, rgb->h() * ld);
win_icon = [[NSImage alloc] initWithSize:NSMakeSize(0, 0)];
[win_icon addRepresentation:bitmap];
[bitmap release];
}
#endif
return win_icon;
}
void Fl_Cocoa_Window_Driver::icons(const Fl_RGB_Image *icons[], int count) {
[icon_image release];
icon_image = nil;
if (count >= 1 && pWindow->border() && pWindow->label() && strlen(pWindow->label())) {
icon_image = rgb_to_nsimage(icons[0]);
}
}
void Fl_Cocoa_Screen_Driver::default_icons(const Fl_RGB_Image *icons[], int count) {
[default_icon release];
default_icon = nil;
if (count >= 1) {
default_icon = rgb_to_nsimage(icons[0]);
}
}
//
// End of "$Id$".

View File

@ -3,7 +3,7 @@
#
# Library Makefile for the Fast Light Tool Kit (FLTK).
#
# Copyright 1998-2018 by Bill Spitzak and others.
# Copyright 1998-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
@ -48,6 +48,7 @@ CPPFILES = \
Fl_Group.cxx \
Fl_Help_View.cxx \
Fl_Image.cxx \
Fl_Image_Reader.cxx \
Fl_Image_Surface.cxx \
Fl_Input.cxx \
Fl_Input_.cxx \

View File

@ -41,6 +41,11 @@
class Fl_Window;
class Fl_Input;
class Fl_RGB_Image;
#ifdef __OBJC__
@class NSImage;
#else
class NSImage;
#endif
class FL_EXPORT Fl_Cocoa_Screen_Driver : public Fl_Screen_Driver
{
@ -54,6 +59,7 @@ protected:
static int insertion_point_height;
static bool insertion_point_location_is_valid;
public:
NSImage *default_icon;
Fl_Cocoa_Screen_Driver();
static int next_marked_length; // next length of marked text after current marked text will have been replaced
static void breakMacEventLoop();
@ -100,6 +106,7 @@ public:
virtual float scale(int n) {return scale_;}
virtual void scale(int n, float f) { scale_ = f;}
virtual Fl_RGB_Image *read_win_rectangle(int X, int Y, int w, int h, Fl_Window *win, bool may_capture_subwins, bool *did_capture_subwins);
virtual void default_icons(const Fl_RGB_Image *icons[], int count);
private:
float scale_;
};

View File

@ -79,6 +79,7 @@ static Fl_Text_Editor::Key_Binding extra_bindings[] = {
Fl_Cocoa_Screen_Driver::Fl_Cocoa_Screen_Driver() {
text_editor_extra_key_bindings = extra_bindings;
scale_ = 1.;
default_icon = nil;
}

View File

@ -33,12 +33,14 @@ class Fl_Window;
#ifdef __OBJC__
@class CALayer;
@class NSCursor;
@class NSImage;
@class FLWindow;
@class NSOpenGLContext;
@class NSOpenGLPixelFormat;
#else
class CALayer;
class NSCursor;
class NSImage;
class FLWindow;
class NSOpenGLContext;
class NSOpenGLPixelFormat;
@ -153,6 +155,10 @@ public:
static void GLcontext_makecurrent(NSOpenGLContext*); // uses Objective-c
static void GL_cleardrawable(void); // uses Objective-c
static void gl_start(NSOpenGLContext*); // uses Objective-c
//icons
virtual void icons(const Fl_RGB_Image *icons[], int count);
NSImage *icon_image;
};
#endif // FL_COCOA_WINDOW_DRIVER_H

View File

@ -52,17 +52,7 @@ Fl_Cocoa_Window_Driver::Fl_Cocoa_Window_Driver(Fl_Window *win)
{
cursor = nil;
window_flags_ = 0;
}
Fl_Cocoa_Window_Driver::~Fl_Cocoa_Window_Driver()
{
if (shape_data_) {
if (shape_data_->mask) {
CGImageRelease(shape_data_->mask);
}
delete shape_data_;
}
icon_image = NULL;
}

View File

@ -61,6 +61,7 @@ Fl_BMP_Image.o: ../FL/abi-version.h
Fl_BMP_Image.o: ../FL/fl_types.h
Fl_BMP_Image.o: ../FL/fl_utf8.h
Fl_BMP_Image.o: ../FL/platform_types.h
Fl_BMP_Image.o: Fl_Image_Reader.h
Fl_Bitmap.o: ../FL/Enumerations.H
Fl_Bitmap.o: ../FL/Fl.H
Fl_Bitmap.o: ../FL/Fl_Bitmap.H
@ -466,6 +467,7 @@ Fl_GIF_Image.o: ../FL/fl_types.h
Fl_GIF_Image.o: ../FL/fl_utf8.h
Fl_GIF_Image.o: ../FL/platform_types.h
Fl_GIF_Image.o: ../config.h
Fl_GIF_Image.o: Fl_Image_Reader.h
Fl_GIF_Image.o: flstring.h
Fl_Gl_Choice.o: ../FL/Enumerations.H
Fl_Gl_Choice.o: ../FL/Fl.H
@ -672,6 +674,8 @@ Fl_Image.o: ../FL/platform_types.h
Fl_Image.o: ../config.h
Fl_Image.o: config_lib.h
Fl_Image.o: flstring.h
Fl_Image_Reader.o: ../FL/fl_utf8.h
Fl_Image_Reader.o: Fl_Image_Reader.h
Fl_Image_Surface.o: ../FL/Enumerations.H
Fl_Image_Surface.o: ../FL/Fl.H
Fl_Image_Surface.o: ../FL/Fl_Bitmap.H

View File

@ -754,6 +754,10 @@ int main(int argc, char ** argv) {
w3->end();
w2->end();
Fl_RGB_Image *rgba_icon = new Fl_RGB_Image(pixmap);
Fl_Window::default_icon(rgba_icon);
//w2->icon(rgba_icon);
delete rgba_icon;
w2->show(argc, argv);
Fl::run();