//############################################################################
//
// LaserBoy !!!
//
// by James Lehman
// Extra Stimulus Inc.
// james@akrobiz.com
//
// began: October 2003
//
// Copyright 2003 to 2024 James Lehman.
// This source is distributed under the terms of the GNU General Public License.
//
// LaserBoy_palette_set.hpp is part of LaserBoy.
//
// LaserBoy is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// LaserBoy is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with LaserBoy. If not, see .
//
//############################################################################
#ifndef __LASERBOY_PALETTE_SET_DEFINITIONS__
#define __LASERBOY_PALETTE_SET_DEFINITIONS__
//############################################################################
#include "LaserBoy_palette.hpp"
//############################################################################
class LaserBoy_palette_set : public vector
{
public:
LaserBoy_palette_set()
: vector(),
palette_set_error (LASERBOY_OK),
palette_index (LASERBOY_ILDA_DEFAULT),
target_palette_index (0),
selected_color_index (0)
{}
//------------------------------------------------------------------------
~LaserBoy_palette_set()
{}
//------------------------------------------------------------------------
LaserBoy_palette_set& replace_palette_set(const LaserBoy_palette_set& palette_set)
{
clear();
populate_palette_set();
insert(end(), palette_set.begin(), palette_set.end());
shrink_to_fit();
return *this;
}
//------------------------------------------------------------------------
LaserBoy_palette_set& extend_palette_set(const LaserBoy_palette_set& palette_set)
{
reserve(size() + palette_set.size());
insert(end(), palette_set.begin(), palette_set.end());
shrink_to_fit();
return *this;
}
//------------------------------------------------------------------------
LaserBoy_palette_set& operator = (const LaserBoy_palette_set& palette_set)
{
clear();
reserve(palette_set.size());
insert(begin(), palette_set.begin(), palette_set.end());
shrink_to_fit();
return *this;
}
//------------------------------------------------------------------------
LaserBoy_palette_set& operator += (const LaserBoy_palette_set& palette_set)
{
reserve(size() + palette_set.size());
insert(end(), palette_set.begin(), palette_set.end());
shrink_to_fit();
return *this;
}
//------------------------------------------------------------------------
LaserBoy_palette_set& operator += (const LaserBoy_palette& palette)
{
push_back(palette);
shrink_to_fit();
return *this;
}
//------------------------------------------------------------------------
LaserBoy_palette_set& push_back_palette(const LaserBoy_palette& palette)
{
push_back(palette);
shrink_to_fit();
return *this;
}
//------------------------------------------------------------------------
void set_palette_index(int index) //sets palette_index
{
if(number_of_palettes())
{
if(index >= number_of_palettes())
index = 0;
if(index < 0)
index = number_of_palettes() - 1;
palette_index = index;
}
else
palette_index = 0;
}
//------------------------------------------------------------------------
void set_target_palette_index(int index) //sets target_palette_index
{
if(number_of_palettes())
{
if(index >= number_of_palettes())
index = 0;
if(index < 0)
index = number_of_palettes() - 1;
target_palette_index = index;
}
else
target_palette_index = 0;
}
//------------------------------------------------------------------------
LaserBoy_palette& palette(int index) //sets palette_index
{
if(number_of_palettes())
{
if(index >= number_of_palettes())
index = 0;
if(index < 0)
index = number_of_palettes() - 1;
palette_index = index;
return at(palette_index);
}
return front();
}
//------------------------------------------------------------------------
LaserBoy_palette& set_target_palette_to(int index) //sets target_palette_index
{
if(number_of_palettes())
{
if(index >= number_of_palettes())
index = 0;
if(index < 0)
index = number_of_palettes() - 1;
target_palette_index = index;
return at(target_palette_index);
}
return front();
}
//------------------------------------------------------------------------
LaserBoy_palette& current_palette()
{
if(palette_index != LASERBOY_TRUE_COLOR)
return at(palette_index);
return at(target_palette_index);
}
//------------------------------------------------------------------------
LaserBoy_palette& target_palette()
{
return at(target_palette_index);
}
//------------------------------------------------------------------------
int name_to_palette_index(string name)
{
for(int i = 0; i < number_of_palettes(); i++)
if(at(i).name == name)
return i;
return LASERBOY_PALETTE_NOT_FOUND; // -2
}
//------------------------------------------------------------------------
bool is_palette_name(string name)
{
for(int i = 0; i < number_of_palettes(); i++)
if(at(i).name == name)
return true;
return false;
}
//------------------------------------------------------------------------
int add_unique_palette(const LaserBoy_palette& palette) // returns palette index of match or -1
{
for(int i = 0; i < (int)size(); i++)
if(at(i) == palette)
return i;
push_back(palette);
return -1;
}
//------------------------------------------------------------------------
u_int greater_number_of_colors() const
{
if(palette_index != LASERBOY_TRUE_COLOR)
{
(at(palette_index).size() >= at(target_palette_index).size())
? (at(palette_index).size())
: (at(target_palette_index).size());
}
return at(target_palette_index).size();
}
//------------------------------------------------------------------------
int number_of_palettes() const
{
return (int)size();
}
//------------------------------------------------------------------------
LaserBoy_palette& palette_picker (int index);
//------------------------------------------------------------------------
LaserBoy_Error_Code palette_from_ifstream_txt (std::ifstream& in,
const u_int& group_type,
int& line_number,
const string& name = ""
);
//------------------------------------------------------------------------
LaserBoy_Error_Code palettes_from_txt_file (const string& file);
LaserBoy_Error_Code save_new_palettes_as_txt (const string& file);
LaserBoy_Error_Code copy_palette_from_bmp (const string& file,
const string& name);
//------------------------------------------------------------------------
void populate_palette_set ();
void add_palette ();
void copy_palette (int index);
void copy_palette_reverse (int index);
void copy_palette_reorder (int index);
void copy_palette_negative (int index);
void copy_palette_expanded (int index);
//------------------------------------------------------------------------
LaserBoy_Error_Code palette_set_error ;
int palette_index ; // may be LASERBOY_TRUE_COLOR (-1)
u_int target_palette_index,
selected_color_index;
};
//############################################################################
#endif
//############################################################################
//////////////////////////////////////////////////////////////////////////////
//############################################################################