Added getRgbMap() methods to Sprite class.

Added Palette* parameter to image_to_allegro() function and Image::to_allegro().
Removed orig_rgb_map.
Removed rgb_map usage (the Allegro global variable).
This commit is contained in:
David Capello 2010-04-20 23:44:31 -03:00
parent a9ab9cc30d
commit ed792eba1e
26 changed files with 187 additions and 230 deletions

View File

@ -102,7 +102,6 @@ void ChangeImageTypeCommand::execute(Context* context)
{
CurrentSpriteWriter sprite(context);
{
CurrentSpriteRgbMap rgbmap;
Undoable undoable(sprite, "Color Mode Change");
undoable.set_imgtype(m_imgtype, m_dithering);

View File

@ -301,7 +301,7 @@ static bool brush_preview_msg_proc(JWidget widget, JMessage msg)
clear_to_color(bmp, makecol(0, 0, 0));
image_to_allegro(pen->get_image(), bmp,
bmp->w/2 - pen->get_size()/2,
bmp->h/2 - pen->get_size()/2);
bmp->h/2 - pen->get_size()/2, NULL);
blit(bmp, ji_screen, 0, 0, widget->rc->x1, widget->rc->y1,
bmp->w, bmp->h);
destroy_bitmap(bmp);

View File

@ -120,7 +120,7 @@ void PreviewCommand::preview_sprite(Context* context, int flags)
image = RenderEngine::renderSprite(sprite, 0, 0, sprite->getWidth(), sprite->getHeight(),
sprite->getCurrentFrame(), 0);
if (image) {
image_to_allegro(image, bmp, 0, 0);
image_to_allegro(image, bmp, 0, 0, sprite->getCurrentPalette());
image_free(image);
}
@ -262,7 +262,7 @@ void PreviewCommand::preview_sprite(Context* context, int flags)
image = RenderEngine::renderSprite(sprite, 0, 0, sprite->getWidth(), sprite->getHeight(),
sprite->getCurrentFrame(), 0);
if (image) {
image_to_allegro(image, bmp, 0, 0);
image_to_allegro(image, bmp, 0, 0, sprite->getCurrentPalette());
image_free(image);
}
}

View File

@ -68,25 +68,24 @@ protected:
{
Undoable undoable(m_sprite, "Sprite Size");
// get all sprite cels
// Get all sprite cels
CelList cels;
m_sprite->getCels(cels);
// for each cel...
for (CelIterator it = cels.begin(); it != cels.end(); ++it) {
// For each cel...
int progress = 0;
for (CelIterator it = cels.begin(); it != cels.end(); ++it, ++progress) {
Cel* cel = *it;
// change it location
// Change its location
undoable.set_cel_position(cel, scale_x(cel->x), scale_y(cel->y));
}
// for each stock's image
for (int i=0; i<m_sprite->getStock()->nimage; ++i) {
Image* image = stock_get_image(m_sprite->getStock(), i);
// Get cel's image
Image* image = stock_get_image(m_sprite->getStock(), cel->image);
if (!image)
continue;
// resize the image
// Resize the image
int w = scale_x(image->w);
int h = scale_y(image->h);
Image* new_image = image_new(image->imgtype, MAX(1, w), MAX(1, h));
@ -94,12 +93,12 @@ protected:
image_fixup_transparent_colors(image);
image_resize(image, new_image,
m_resize_method,
get_current_palette(),
orig_rgb_map);
m_sprite->getPalette(cel->frame),
m_sprite->getRgbMap(cel->frame));
undoable.replace_stock_image(i, new_image);
undoable.replace_stock_image(cel->image, new_image);
job_progress((float)i / m_sprite->getStock()->nimage);
job_progress((float)progress / cels.size());
// cancel all the operation?
if (is_canceled())
@ -120,8 +119,8 @@ protected:
scale_y(m_sprite->getMask()->y-1), MAX(1, w), MAX(1, h));
image_resize(old_bitmap, new_mask->bitmap,
m_resize_method,
get_current_palette(),
orig_rgb_map);
m_sprite->getCurrentPalette(), // Ignored
m_sprite->getRgbMap()); // Ignored
image_free(old_bitmap);
// reshrink

View File

@ -546,7 +546,7 @@ int get_color_for_image(int imgtype, color_t color)
break;
}
case IMAGE_INDEXED:
c = orig_rgb_map->data[r >> 3][g >> 3][b >> 3];
c = get_current_palette()->findBestfit(r, g, b);
break;
}
break;
@ -571,7 +571,7 @@ int get_color_for_image(int imgtype, color_t color)
}
case IMAGE_INDEXED:
hsv_to_rgb_int(&h, &s, &v);
c = orig_rgb_map->data[h >> 3][s >> 3][v >> 3];
c = get_current_palette()->findBestfit(h, s, v);
break;
}
break;
@ -589,7 +589,7 @@ int get_color_for_image(int imgtype, color_t color)
break;
case IMAGE_INDEXED:
c = data;
c = orig_rgb_map->data[c >> 3][c >> 3][c >> 3];
c = get_current_palette()->findBestfit(c, c, c);
break;
}
break;

View File

@ -165,7 +165,7 @@ Image *RenderText(Sprite* sprite, const char *fontname, int size, int color, con
return render;
}
static Image *render_text(Sprite* sprite, FONT *f, const char *text, int color)
static Image* render_text(Sprite* sprite, FONT *f, const char *text, int color)
{
/* TODO warning this uses Image->dat and not Image->line */
#define DO(type, colfunc) \
@ -222,11 +222,9 @@ static Image *render_text(Sprite* sprite, FONT *f, const char *text, int color)
DO(ase_uint16, _graya(_graya_getv(color), getg32(c)));
break;
case IMAGE_INDEXED: {
CurrentSpriteRgbMap rgbmap;
case IMAGE_INDEXED:
DO(ase_uint8, c == makecol32(255, 0, 255) ? 0: color);
break;
}
}
release_bitmap(bmp);

View File

@ -25,6 +25,7 @@
#include "modules/palettes.h"
#include "raster/image.h"
#include "raster/palette.h"
#include "raster/rgbmap.h"
static struct {
Curve *curve;
@ -332,12 +333,13 @@ void apply_color_curve2 (Effect *effect)
void apply_color_curve1(Effect *effect)
{
Palette *pal = get_current_palette();
ase_uint8 *src_address;
ase_uint8 *dst_address;
RgbMap* rgbmap = effect->sprite->getRgbMap();
ase_uint8* src_address;
ase_uint8* dst_address;
int x, c, r, g, b;
src_address = ((ase_uint8 **)effect->src->line)[effect->row+effect->y]+effect->x;
dst_address = ((ase_uint8 **)effect->dst->line)[effect->row+effect->y]+effect->x;
src_address = ((ase_uint8**)effect->src->line)[effect->row+effect->y]+effect->x;
dst_address = ((ase_uint8**)effect->dst->line)[effect->row+effect->y]+effect->x;
for (x=0; x<effect->w; x++) {
if (effect->mask_address) {
@ -364,7 +366,7 @@ void apply_color_curve1(Effect *effect)
if (effect->target & TARGET_GREEN_CHANNEL) g = data.cmap[g];
if (effect->target & TARGET_BLUE_CHANNEL) b = data.cmap[b];
c = orig_rgb_map->data[r>>3][g>>3][b>>3];
c = rgbmap->mapColor(r, g, b);
}
*(dst_address++) = MID(0, c, 255);

View File

@ -31,6 +31,7 @@
#include "modules/palettes.h"
#include "raster/image.h"
#include "raster/palette.h"
#include "raster/rgbmap.h"
#include "util/filetoks.h"
/* TODO warning: this number could be dangerous for big filters */
@ -470,8 +471,9 @@ void apply_convolution_matrix2(Effect *effect)
void apply_convolution_matrix1(Effect *effect)
{
Palette* pal = get_current_palette();
ConvMatr* matrix = data.convmatr;
const Palette* pal = get_current_palette();
const RgbMap* rgbmap = effect->sprite->getRgbMap();
const ConvMatr* matrix = data.convmatr;
const Image* src = effect->src;
Image* dst = effect->dst;
ase_uint8* src_address;
@ -537,7 +539,7 @@ void apply_convolution_matrix1(Effect *effect)
else
b = _rgba_getb(pal->getEntry(color));
*(dst_address++) = orig_rgb_map->data[r>>3][g>>3][b>>3];
*(dst_address++) = rgbmap->mapColor(r, g, b);
}
}
}

View File

@ -22,6 +22,7 @@
#include "modules/palettes.h"
#include "raster/image.h"
#include "raster/palette.h"
#include "raster/rgbmap.h"
void apply_invert_color4(Effect *effect)
{
@ -96,6 +97,7 @@ void apply_invert_color2(Effect *effect)
void apply_invert_color1(Effect *effect)
{
Palette *pal = get_current_palette();
RgbMap* rgbmap = effect->sprite->getRgbMap();
ase_uint8 *src_address;
ase_uint8 *dst_address;
int x, c, r, g, b;
@ -120,15 +122,15 @@ void apply_invert_color1(Effect *effect)
if (effect->target & TARGET_INDEX_CHANNEL)
c ^= 0xff;
else {
r = _rgba_getr(pal->getEntry(c))>>3;
g = _rgba_getg(pal->getEntry(c))>>3;
b = _rgba_getb(pal->getEntry(c))>>3;
r = _rgba_getr(pal->getEntry(c));
g = _rgba_getg(pal->getEntry(c));
b = _rgba_getb(pal->getEntry(c));
if (effect->target & TARGET_RED_CHANNEL) r ^= 0x1f;
if (effect->target & TARGET_GREEN_CHANNEL) g ^= 0x1f;
if (effect->target & TARGET_BLUE_CHANNEL) b ^= 0x1f;
if (effect->target & TARGET_RED_CHANNEL ) r ^= 0xff;
if (effect->target & TARGET_GREEN_CHANNEL) g ^= 0xff;
if (effect->target & TARGET_BLUE_CHANNEL ) b ^= 0xff;
c = orig_rgb_map->data[r][g][b];
c = rgbmap->mapColor(r, g, b);
}
*(dst_address++) = c;

View File

@ -24,6 +24,7 @@
#include "modules/palettes.h"
#include "raster/image.h"
#include "raster/palette.h"
#include "raster/rgbmap.h"
#include "tiled_mode.h"
static struct {
@ -57,9 +58,9 @@ static int cmp_channel(const void *p1, const void *p2)
void apply_median4(Effect *effect)
{
Image *src = effect->src;
const Image *src = effect->src;
Image *dst = effect->dst;
ase_uint32 *src_address;
const ase_uint32 *src_address;
ase_uint32 *dst_address;
int x, y, dx, dy, color;
int c, w, r, g, b, a;
@ -125,9 +126,9 @@ void apply_median4(Effect *effect)
void apply_median2(Effect *effect)
{
Image *src = effect->src;
const Image *src = effect->src;
Image *dst = effect->dst;
ase_uint16 *src_address;
const ase_uint16 *src_address;
ase_uint16 *dst_address;
int x, y, dx, dy, color;
int c, w, k, a;
@ -181,11 +182,12 @@ void apply_median2(Effect *effect)
void apply_median1(Effect *effect)
{
Palette *pal = get_current_palette();
Image *src = effect->src;
Image *dst = effect->dst;
ase_uint8 *src_address;
ase_uint8 *dst_address;
const Palette* pal = get_current_palette();
const RgbMap* rgbmap = effect->sprite->getRgbMap();
const Image* src = effect->src;
Image* dst = effect->dst;
const ase_uint8* src_address;
ase_uint8* dst_address;
int x, y, dx, dy, color;
int c, w, r, g, b;
int getx, gety, addx, addy;
@ -251,7 +253,7 @@ void apply_median1(Effect *effect)
else
b = _rgba_getb(pal->getEntry(color));
*(dst_address++) = orig_rgb_map->data[r>>3][g>>3][b>>3];
*(dst_address++) = rgbmap->mapColor(r, g, b);
}
}
}

View File

@ -433,7 +433,6 @@ void draw_color(BITMAP* bmp, const Rect& rc, int imgtype, color_t color)
data = color_get_index(color);
rectfill(bmp, rc.x, rc.y, rc.x+rc.w-1, rc.y+rc.h-1,
get_color_for_allegro(bitmap_color_depth(bmp), color));
// palette_color[data]);
return;
}
@ -442,8 +441,6 @@ void draw_color(BITMAP* bmp, const Rect& rc, int imgtype, color_t color)
case IMAGE_INDEXED:
rectfill(bmp, rc.x, rc.y, rc.x+rc.w-1, rc.y+rc.h-1,
get_color_for_allegro(imgtype, color_index(get_color_for_image(imgtype, color))));
// get_color_for_allegro(bitmap_color_depth(bmp), color));
// palette_color[get_color_for_image(imgtype, color)]);
break;
case IMAGE_RGB:
@ -459,10 +456,7 @@ void draw_color(BITMAP* bmp, const Rect& rc, int imgtype, color_t color)
rectfill(graph, 0, 0, rc.w-1, rc.h-1, get_color_for_allegro(32, color2));
}
{
CurrentSpriteRgbMap rgbmap;
blit(graph, bmp, 0, 0, rc.x, rc.y, rc.w, rc.h);
}
blit(graph, bmp, 0, 0, rc.x, rc.y, rc.w, rc.h);
destroy_bitmap(graph);
break;
@ -478,10 +472,7 @@ void draw_color(BITMAP* bmp, const Rect& rc, int imgtype, color_t color)
rectfill(graph, 0, 0, rc.w-1, rc.h-1, get_color_for_allegro(32, color2));
}
{
CurrentSpriteRgbMap rgbmap;
blit(graph, bmp, 0, 0, rc.x, rc.y, rc.w, rc.h);
}
blit(graph, bmp, 0, 0, rc.x, rc.y, rc.w, rc.h);
destroy_bitmap(graph);
break;

View File

@ -31,34 +31,19 @@
#include "raster/palette.h"
#include "raster/sprite.h"
RGB_MAP *orig_rgb_map = NULL; /* color map for the original palette
(not for the mapped-palette) */
COLOR_MAP *orig_trans_map = NULL;
/**
* The default color palette.
*/
static Palette *ase_default_palette = NULL;
static Palette* ase_default_palette = NULL;
/**
* Current original palette (you can use _current_palette from Allegro
* to refer to the current system "mapped-palette").
*/
static Palette *ase_current_palette = NULL;
/* current rgb map */
static RGB_MAP *my_rgb_map = NULL;
static int regen_my_rgb_map = false;
static Palette* ase_current_palette = NULL;
int init_module_palette()
{
orig_rgb_map = jnew(RGB_MAP, 1);
orig_trans_map = jnew(COLOR_MAP, 1);
my_rgb_map = jnew(RGB_MAP, 1);
rgb_map = my_rgb_map;
color_map = NULL;
ase_default_palette = new Palette(0, 256);
ase_default_palette->fromAllegro(default_palette);
@ -70,25 +55,16 @@ int init_module_palette()
void exit_module_palette()
{
rgb_map = NULL;
if (ase_default_palette != NULL)
delete ase_default_palette;
if (ase_current_palette != NULL)
delete ase_current_palette;
jfree(my_rgb_map);
jfree(orig_trans_map);
jfree(orig_rgb_map);
delete ase_default_palette;
delete ase_current_palette;
}
Palette *get_current_palette()
Palette* get_current_palette()
{
return ase_current_palette;
}
Palette *get_default_palette()
Palette* get_default_palette()
{
return ase_default_palette;
}
@ -106,29 +82,19 @@ void set_default_palette(Palette* palette)
*/
bool set_current_palette(const Palette *_palette, bool forced)
{
const Palette *palette = _palette ? _palette: ase_default_palette;
const Palette* palette = _palette ? _palette: ase_default_palette;
bool ret = false;
/* have changes */
// Have changes
if (forced ||
palette->countDiff(ase_current_palette, NULL, NULL) > 0) {
PALETTE rgbpal;
/* copy current palette */
// Copy current palette
palette->copyColorsTo(ase_current_palette);
/* create a RGB map for the original palette */
palette->toAllegro(rgbpal);
create_rgb_table(orig_rgb_map, rgbpal, NULL);
/* create a transparency-map with the original palette */
rgb_map = orig_rgb_map;
create_trans_table(orig_trans_map, rgbpal, 128, 128, 128, NULL);
rgb_map = my_rgb_map;
// Create a map for the mapped-palette
create_rgb_table(my_rgb_map, rgbpal, NULL);
set_palette(rgbpal); // Change system color palette
// Change system color palette
PALETTE allegPal;
palette->toAllegro(allegPal);
set_palette(allegPal);
// Call slots in signals
App::instance()->PaletteChange();
@ -146,7 +112,7 @@ void set_black_palette()
delete p;
}
/* changes a color of the current system palette */
// Changes a color of the current system palette
void set_current_color(int index, int r, int g, int b)
{
register int c;
@ -172,20 +138,3 @@ void set_current_color(int index, int r, int g, int b)
set_color(index, &rgb);
}
}
//////////////////////////////////////////////////////////////////////
CurrentSpriteRgbMap::CurrentSpriteRgbMap()
{
rgb_map = orig_rgb_map;
}
CurrentSpriteRgbMap::~CurrentSpriteRgbMap()
{
rgb_map = my_rgb_map;
if (regen_my_rgb_map) {
regen_my_rgb_map = false;
create_rgb_table(my_rgb_map, _current_palette, NULL);
}
}

View File

@ -19,14 +19,7 @@
#ifndef MODULES_PALETTES_H_INCLUDED
#define MODULES_PALETTES_H_INCLUDED
#include "jinete/jbase.h"
#include <allegro/color.h>
class Palette;
class Sprite;
extern RGB_MAP* orig_rgb_map;
extern COLOR_MAP* orig_trans_map;
int init_module_palette();
void exit_module_palette();
@ -39,12 +32,5 @@ bool set_current_palette(const Palette* palette, bool forced);
void set_black_palette();
void set_current_color(int index, int r, int g, int b);
class CurrentSpriteRgbMap
{
public:
CurrentSpriteRgbMap();
~CurrentSpriteRgbMap();
};
#endif

View File

@ -29,6 +29,7 @@
#include "raster/image.h"
#include "raster/image_impl.h"
#include "raster/palette.h"
#include "raster/rgbmap.h"
//////////////////////////////////////////////////////////////////////
@ -317,9 +318,9 @@ void image_ellipsefill(Image* image, int x1, int y1, int x2, int y2, int color)
algo_ellipsefill(x1, y1, x2, y2, &data, (AlgoHLine)hline_for_image);
}
void image_to_allegro(const Image* image, BITMAP *bmp, int x, int y)
void image_to_allegro(const Image* image, BITMAP *bmp, int x, int y, const Palette* palette)
{
image->to_allegro(bmp, x, y);
image->to_allegro(bmp, x, y, palette);
}
/**
@ -417,7 +418,7 @@ void image_fixup_transparent_colors(Image* image)
* recommended to use @ref image_fixup_transparent_colors function
* over the source image @a src before using this routine.
*/
void image_resize(const Image* src, Image* dst, ResizeMethod method, Palette* pal, RGB_MAP* rgb_map)
void image_resize(const Image* src, Image* dst, ResizeMethod method, const Palette* pal, const RgbMap* rgbmap)
{
switch (method) {
@ -519,7 +520,7 @@ void image_resize(const Image* src, Image* dst, ResizeMethod method, Palette* pa
(_rgba_getb(pal->getEntry(color[2]))*u2 + _rgba_getb(pal->getEntry(color[3]))*u1)*v1);
int a = (((color[0] == 0 ? 0: 255)*u2 + (color[1] == 0 ? 0: 255)*u1)*v2 +
((color[2] == 0 ? 0: 255)*u2 + (color[3] == 0 ? 0: 255)*u1)*v1);
dst_color = a > 127 ? rgb_map->data[r>>3][g>>3][b>>3]: 0;
dst_color = a > 127 ? rgbmap->mapColor(r, g, b): 0;
break;
}
case IMAGE_BITMAP: {

View File

@ -25,6 +25,7 @@
class Palette;
class Pen;
class RgbMap;
// Image Types
enum {
@ -60,7 +61,7 @@ public:
virtual void merge(const Image* src, int x, int y, int opacity, int blend_mode) = 0;
virtual void hline(int x1, int y, int x2, int color) = 0;
virtual void rectfill(int x1, int y1, int x2, int y2, int color) = 0;
virtual void to_allegro(BITMAP* bmp, int x, int y) const = 0;
virtual void to_allegro(BITMAP* bmp, int x, int y, const Palette* palette) const = 0;
};
Image* image_new(int imgtype, int w, int h);
@ -90,10 +91,10 @@ void image_line(Image* image, int x1, int y1, int x2, int y2, int color);
void image_ellipse(Image* image, int x1, int y1, int x2, int y2, int color);
void image_ellipsefill(Image* image, int x1, int y1, int x2, int y2, int color);
void image_to_allegro(const Image* image, BITMAP* bmp, int x, int y);
void image_to_allegro(const Image* image, BITMAP* bmp, int x, int y, const Palette* palette);
void image_fixup_transparent_colors(Image* image);
void image_resize(const Image* src, Image* dst, ResizeMethod method, Palette* palette, RGB_MAP* rgb_map);
void image_resize(const Image* src, Image* dst, ResizeMethod method, const Palette* palette, const RgbMap* rgbmap);
int image_count_diff(const Image* i1, const Image* i2);
bool image_shrink_rect(Image *image, int *x1, int *y1, int *x2, int *y2, int refpixel);

View File

@ -22,6 +22,7 @@
#include <cassert>
#include "raster/image.h"
#include "raster/palette.h"
template<class Traits>
class ImageImpl : public Image
@ -220,7 +221,7 @@ public:
}
}
virtual void to_allegro(BITMAP* bmp, int x, int y) const;
virtual void to_allegro(BITMAP* bmp, int x, int y, const Palette* palette) const;
};
@ -492,7 +493,7 @@ void ImageImpl<BitmapTraits>::merge(const Image* src, int x, int y, int opacity,
}
template<>
void ImageImpl<RgbTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
void ImageImpl<RgbTraits>::to_allegro(BITMAP *bmp, int _x, int _y, const Palette* palette) const
{
const_address_t addr = raw_pixels();
unsigned long bmp_address;
@ -624,7 +625,7 @@ void ImageImpl<RgbTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
}
template<>
void ImageImpl<GrayscaleTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
void ImageImpl<GrayscaleTraits>::to_allegro(BITMAP *bmp, int _x, int _y, const Palette* palette) const
{
const_address_t addr = raw_pixels();
unsigned long bmp_address;
@ -749,17 +750,13 @@ void ImageImpl<GrayscaleTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
}
template<>
void ImageImpl<IndexedTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
void ImageImpl<IndexedTraits>::to_allegro(BITMAP *bmp, int _x, int _y, const Palette* palette) const
{
#define RGB_TRIPLET \
_rgb_scale_6[_current_palette[(*addr)].r], \
_rgb_scale_6[_current_palette[(*addr)].g], \
_rgb_scale_6[_current_palette[(*addr)].b]
const_address_t addr = raw_pixels();
unsigned long bmp_address;
int depth = bitmap_color_depth(bmp);
int x, y;
ase_uint32 c;
bmp_select(bmp);
@ -805,7 +802,8 @@ void ImageImpl<IndexedTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
bmp_address = bmp_write_line(bmp, _y)+_x;
for (x=0; x<w; x++) {
bmp_write15(bmp_address, makecol15(RGB_TRIPLET));
c = palette->getEntry(*addr);
bmp_write15(bmp_address, makecol15(_rgba_getr(c), _rgba_getg(c), _rgba_getb(c)));
addr++;
bmp_address += 2;
}
@ -821,7 +819,8 @@ void ImageImpl<IndexedTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
bmp_address = bmp_write_line(bmp, _y)+_x;
for (x=0; x<w; x++) {
bmp_write16(bmp_address, makecol16(RGB_TRIPLET));
c = palette->getEntry(*addr);
bmp_write16(bmp_address, makecol16(_rgba_getr(c), _rgba_getg(c), _rgba_getb(c)));
addr++;
bmp_address += 2;
}
@ -837,7 +836,8 @@ void ImageImpl<IndexedTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
bmp_address = bmp_write_line(bmp, _y)+_x;
for (x=0; x<w; x++) {
bmp_write24(bmp_address, makecol24(RGB_TRIPLET));
c = palette->getEntry(*addr);
bmp_write24(bmp_address, makecol24(_rgba_getr(c), _rgba_getg(c), _rgba_getb(c)));
addr++;
bmp_address += 3;
}
@ -853,7 +853,8 @@ void ImageImpl<IndexedTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
bmp_address = bmp_write_line(bmp, _y)+_x;
for (x=0; x<w; x++) {
bmp_write32(bmp_address, makeacol32(RGB_TRIPLET, 255));
c = palette->getEntry(*addr);
bmp_write32(bmp_address, makeacol32(_rgba_getr(c), _rgba_getg(c), _rgba_getb(c), 255));
addr++;
bmp_address += 4;
}
@ -867,7 +868,7 @@ void ImageImpl<IndexedTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
}
template<>
void ImageImpl<BitmapTraits>::to_allegro(BITMAP *bmp, int _x, int _y) const
void ImageImpl<BitmapTraits>::to_allegro(BITMAP *bmp, int _x, int _y, const Palette* palette) const
{
const_address_t addr;
unsigned long bmp_address;

View File

@ -22,11 +22,12 @@
#include "raster/image.h"
#include "raster/quant.h"
#include "raster/palette.h"
#include "raster/rgbmap.h"
Image *image_set_imgtype(Image *image, int imgtype,
Image *image_set_imgtype(const Image* image, int imgtype,
int dithering_method,
RGB_MAP *rgb_map,
Palette *palette)
const RgbMap* rgbmap,
const Palette* palette)
{
ase_uint32* rgb_address;
ase_uint16* gray_address;
@ -42,7 +43,7 @@ Image *image_set_imgtype(Image *image, int imgtype,
else if (image->imgtype == IMAGE_RGB &&
imgtype == IMAGE_INDEXED &&
dithering_method == DITHERING_ORDERED) {
return image_rgb_to_indexed(image, 0, 0, rgb_map, palette);
return image_rgb_to_indexed(image, 0, 0, rgbmap, palette);
}
new_image = image_new(imgtype, image->w, image->h);
@ -82,7 +83,7 @@ Image *image_set_imgtype(Image *image, int imgtype,
if (_rgba_geta(c) == 0)
*idx_address = 0;
else
*idx_address = rgb_map->data[r>>3][g>>3][b>>3];
*idx_address = rgbmap->mapColor(r, g, b);
rgb_address++;
idx_address++;
}
@ -196,10 +197,10 @@ static int pattern[8][8] = {
4 * ((g1)-(g2)) * ((g1)-(g2)) + \
2 * ((b1)-(b2)) * ((b1)-(b2)))
Image *image_rgb_to_indexed(Image *src_image,
Image* image_rgb_to_indexed(const Image* src_image,
int offsetx, int offsety,
RGB_MAP *rgb_map,
Palette *palette)
const RgbMap* rgbmap,
const Palette* palette)
{
int oppr, oppg, oppb, oppnrcm;
Image *dst_image;
@ -223,7 +224,7 @@ Image *image_rgb_to_indexed(Image *src_image,
a = _rgba_geta(c);
if (a != 0) {
nearestcm = rgb_map->data[r>>3][g>>3][b>>3];
nearestcm = rgbmap->mapColor(r, g, b);
/* rgb values for nearest color */
nr = _rgba_getr(palette->getEntry(nearestcm));
ng = _rgba_getg(palette->getEntry(nearestcm));
@ -233,7 +234,7 @@ Image *image_rgb_to_indexed(Image *src_image,
oppg = MID(0, 2*g - ng, 255);
oppb = MID(0, 2*b - nb, 255);
/* Nearest match for opposite color: */
oppnrcm = rgb_map->data[oppr>>3][oppg>>3][oppb>>3];
oppnrcm = rgbmap->mapColor(oppr, oppg, oppb);
/* If they're not the same, dither between them. */
/* Dither constant is measured by where the true
color lies between the two nearest approximations.

View File

@ -21,7 +21,7 @@
#include <allegro/color.h>
/* dithering methods */
// Dithering methods
enum {
DITHERING_NONE,
DITHERING_ORDERED,
@ -29,15 +29,16 @@ enum {
class Image;
class Palette;
class RgbMap;
Image* image_set_imgtype(Image* image, int imgtype,
Image* image_set_imgtype(const Image* image, int imgtype,
int dithering_method,
RGB_MAP* rgb_map,
Palette* palette);
const RgbMap* rgbmap,
const Palette* palette);
Image* image_rgb_to_indexed(Image* src_image,
Image* image_rgb_to_indexed(const Image* src_image,
int offsetx, int offsety,
RGB_MAP* rgb_map,
Palette* palette);
const RgbMap* rgbmap,
const Palette* palette);
#endif

View File

@ -177,6 +177,17 @@ public:
return getPalette(getCurrentFrame());
}
RgbMap* getRgbMap(int frame) {
if (m_rgbMap == NULL) {
m_rgbMap = new RgbMap();
m_rgbMap->regenerate(getPalette(frame));
}
else if (!m_rgbMap->match(getPalette(frame))) {
m_rgbMap->regenerate(getPalette(frame));
}
return m_rgbMap;
}
int getTotalFrames() const {
return m_frames;
}
@ -406,6 +417,9 @@ private:
// Data to save the file in the same format that it was loaded
FormatOptions* m_format_options;
// Current rgb map
RgbMap* m_rgbMap;
};
SpriteImpl::SpriteImpl(Sprite* sprite, int imgtype, int width, int height, int ncolors)
@ -471,6 +485,9 @@ SpriteImpl::SpriteImpl(Sprite* sprite, int imgtype, int width, int height, int n
// File format options
m_format_options = NULL;
// Initial RGB map
m_rgbMap = NULL;
setPalette(&pal, true);
}
@ -618,6 +635,8 @@ SpriteImpl::~SpriteImpl()
// Destroy file format options
if (m_format_options)
format_options_free(m_format_options);
delete m_rgbMap;
}
/**
@ -1228,6 +1247,16 @@ Palette* Sprite::getCurrentPalette()
return m_impl->getCurrentPalette();
}
RgbMap* Sprite::getRgbMap()
{
return m_impl->getRgbMap(getCurrentFrame());
}
RgbMap* Sprite::getRgbMap(int frame)
{
return m_impl->getRgbMap(frame);
}
//////////////////////////////////////////////////////////////////////
// Frames

View File

@ -33,6 +33,7 @@ class Path;
class Stock;
class Undo;
class Sprite;
class RgbMap;
struct _BoundSeg;
struct PreferredEditorSettings
@ -124,6 +125,9 @@ public:
const Palette* getCurrentPalette() const;
Palette* getCurrentPalette();
RgbMap* getRgbMap();
RgbMap* getRgbMap(int frame);
////////////////////////////////////////
// Frames

View File

@ -19,6 +19,8 @@
#include "effect/effect.h"
#include "modules/palettes.h"
#include "raster/palette.h"
#include "raster/rgbmap.h"
#include "raster/sprite.h"
//////////////////////////////////////////////////////////////////////
// Ink Processing
@ -137,6 +139,7 @@ static void ink_hline16_transparent(int x1, int y, int x2, IToolLoop* loop)
static void ink_hline8_transparent(int x1, int y, int x2, IToolLoop* loop)
{
Palette* pal = get_current_palette();
RgbMap* rgbmap = loop->getSprite()->getRgbMap();
ase_uint32 c;
ase_uint32 tc = pal->getEntry(loop->getPrimaryColor());
int opacity = loop->getOpacity();
@ -145,10 +148,9 @@ static void ink_hline8_transparent(int x1, int y, int x2, IToolLoop* loop)
(IndexedTraits,
{
c = _rgba_blend_normal(pal->getEntry(*src_address), tc, opacity);
*dst_address = orig_rgb_map->data
[_rgba_getr(c)>>3]
[_rgba_getg(c)>>3]
[_rgba_getb(c)>>3];
*dst_address = rgbmap->mapColor(_rgba_getr(c),
_rgba_getg(c),
_rgba_getb(c));
});
}
@ -253,6 +255,7 @@ static void ink_hline16_blur(int x1, int y, int x2, IToolLoop* loop)
static void ink_hline8_blur(int x1, int y, int x2, IToolLoop* loop)
{
Palette *pal = get_current_palette();
RgbMap* rgbmap = loop->getSprite()->getRgbMap();
int c, r, g, b, a;
int opacity = loop->getOpacity();
TiledMode tiled = loop->getTiledMode();
@ -292,7 +295,7 @@ static void ink_hline8_blur(int x1, int y, int x2, IToolLoop* loop)
g = _rgba_getg(c) + (g-_rgba_getg(c)) * opacity / 255;
b = _rgba_getb(c) + (b-_rgba_getb(c)) * opacity / 255;
*dst_address = orig_rgb_map->data[r>>3][g>>3][b>>3];
*dst_address = rgbmap->mapColor(r, g, b);
}
else {
*dst_address = *src_address;
@ -334,6 +337,7 @@ static void ink_hline8_replace(int x1, int y, int x2, IToolLoop* loop)
{
int color1 = loop->getPrimaryColor();
Palette *pal = get_current_palette();
RgbMap* rgbmap = loop->getSprite()->getRgbMap();
ase_uint32 c;
ase_uint32 tc = pal->getEntry(loop->getSecondaryColor());
int opacity = loop->getOpacity();
@ -342,10 +346,9 @@ static void ink_hline8_replace(int x1, int y, int x2, IToolLoop* loop)
(IndexedTraits,
if (*src_address == color1) {
c = _rgba_blend_normal(pal->getEntry(*src_address), tc, opacity);
*dst_address = orig_rgb_map->data
[_rgba_getr(c)>>3]
[_rgba_getg(c)>>3]
[_rgba_getb(c)>>3];
*dst_address = rgbmap->mapColor(_rgba_getr(c),
_rgba_getg(c),
_rgba_getb(c));
});
}
@ -412,7 +415,8 @@ static void ink_hline16_jumble(int x1, int y, int x2, IToolLoop* loop)
static void ink_hline8_jumble(int x1, int y, int x2, IToolLoop* loop)
{
Palette *pal = get_current_palette();
const Palette *pal = get_current_palette();
const RgbMap* rgbmap = loop->getSprite()->getRgbMap();
ase_uint32 c, tc;
int opacity = loop->getOpacity();
Point speed(loop->getSpeed() / 4);
@ -429,10 +433,9 @@ static void ink_hline8_jumble(int x1, int y, int x2, IToolLoop* loop)
tc, opacity);
if (_rgba_geta(c) >= 128)
*dst_address = orig_rgb_map->data
[_rgba_getr(c)>>3]
[_rgba_getg(c)>>3]
[_rgba_getb(c)>>3];
*dst_address = rgbmap->mapColor(_rgba_getr(c),
_rgba_getg(c),
_rgba_getb(c));
else
*dst_address = 0;
}

View File

@ -188,9 +188,6 @@ void Undoable::autocrop_sprite(int bgcolor)
crop_sprite(x1, y1, x2-x1+1, y2-y1+1, bgcolor);
}
/**
* @warning: it uses the current Allegro "rgb_map"
*/
void Undoable::set_imgtype(int new_imgtype, int dithering_method)
{
Image *old_image;
@ -206,13 +203,15 @@ void Undoable::set_imgtype(int new_imgtype, int dithering_method)
m_sprite->getStock()->imgtype = new_imgtype;
// Use the rgbmap for the specified sprite
const RgbMap* rgbmap = m_sprite->getRgbMap();
for (c=0; c<m_sprite->getStock()->nimage; c++) {
old_image = stock_get_image(m_sprite->getStock(), c);
if (!old_image)
continue;
new_image = image_set_imgtype(old_image, new_imgtype, dithering_method,
rgb_map,
new_image = image_set_imgtype(old_image, new_imgtype, dithering_method, rgbmap,
// TODO check this out
m_sprite->getCurrentPalette());
if (!new_image)

View File

@ -233,9 +233,9 @@ void clipboard::paste(SpriteWriter& sprite)
if (clipboard_image->imgtype == sprite->getImgType())
src_image = clipboard_image;
else {
CurrentSpriteRgbMap rgbmap;
RgbMap* rgbmap = sprite->getRgbMap();
src_image = image_set_imgtype(clipboard_image, sprite->getImgType(), DITHERING_NONE,
rgb_map, sprite->getPalette(sprite->getCurrentFrame()));
rgbmap, sprite->getPalette(sprite->getCurrentFrame()));
}
// do the interactive-transform loop (where the user can move the floating image)
@ -350,7 +350,7 @@ static bool interactive_transform(Editor* editor,
/* generate the preview bitmap (for fast-blitting) */
preview = create_bitmap(image->w, image->h);
mask_color = bitmap_mask_color(preview);
image_to_allegro(image, preview, 0, 0);
image_to_allegro(image, preview, 0, 0, get_current_palette());
switch (image->imgtype) {

View File

@ -375,14 +375,14 @@ Image* RenderEngine::renderSprite(Sprite* sprite,
frame, zoom, zoomed_func, true, false);
// Draw transparent layers of the previous frame with opacity=128
color_map = orig_trans_map;
//color_map = orig_trans_map;
global_opacity = 128;
renderLayer(sprite, sprite->getFolder(), image, source_x, source_y,
frame-1, zoom, zoomed_func, false, true);
// Draw transparent layers of the current frame with opacity=255
color_map = NULL;
//color_map = NULL;
global_opacity = 255;
renderLayer(sprite, sprite->getFolder(), image, source_x, source_y,

View File

@ -313,7 +313,7 @@ void Editor::editor_draw_sprite(int x1, int y1, int x2, int y2)
BITMAP *bmp = create_bitmap(width, height);
use_current_sprite_rgb_map();
image_to_allegro(rendered, bmp, 0, 0);
image_to_allegro(rendered, bmp, 0, 0, m_sprite->getCurrentPalette());
blit(bmp, ji_screen, 0, 0, dest_x, dest_y, width, height);
restore_rgb_map();
@ -321,21 +321,7 @@ void Editor::editor_draw_sprite(int x1, int y1, int x2, int y2)
destroy_bitmap(bmp);
#else
acquire_bitmap(ji_screen);
CurrentSpriteRgbMap rgbmap;
if (bitmap_color_depth(screen) == 8) {
image_to_allegro(rendered, ji_screen, dest_x, dest_y);
}
else {
PALETTE rgbpal;
Palette *pal = m_sprite->getPalette(m_sprite->getCurrentFrame());
pal->toAllegro(rgbpal);
select_palette(rgbpal);
image_to_allegro(rendered, ji_screen, dest_x, dest_y);
unselect_palette();
}
image_to_allegro(rendered, ji_screen, dest_x, dest_y, m_sprite->getCurrentPalette());
release_bitmap(ji_screen);
image_free(rendered);

View File

@ -70,7 +70,7 @@ typedef struct ThumbnailData
JWidget fileview;
Image* thumbnail;
JThread thread;
PALETTE rgbpal;
Palette* palette;
} ThumbnailData;
static FileView* fileview_data(JWidget widget);
@ -781,16 +781,16 @@ static void openfile_bg(void *_data)
if (fop_is_stop(fop))
delete fop->sprite;
else {
/* the palette to convert the Image to a BITMAP */
sprite->getPalette(0)->toAllegro(data->rgbpal);
// The palette to convert the Image to a BITMAP
data->palette = new Palette(*sprite->getPalette(0));
/* render the 'sprite' in one plain 'image' */
// Render the 'sprite' in one plain 'image'
image = image_new(sprite->getImgType(), sprite->getWidth(), sprite->getHeight());
image_clear(image, 0);
sprite->render(image, 0, 0);
delete sprite;
/* calculate the thumbnail size */
// Calculate the thumbnail size
thumb_w = MAX_THUMBNAIL_SIZE * image->w / MAX(image->w, image->h);
thumb_h = MAX_THUMBNAIL_SIZE * image->h / MAX(image->w, image->h);
if (MAX(thumb_w, thumb_h) > MAX(image->w, image->h)) {
@ -800,7 +800,7 @@ static void openfile_bg(void *_data)
thumb_w = MID(1, thumb_w, MAX_THUMBNAIL_SIZE);
thumb_h = MID(1, thumb_h, MAX_THUMBNAIL_SIZE);
/* stretch the 'image' */
// Stretch the 'image'
data->thumbnail = image_new(image->imgtype, thumb_w, thumb_h);
image_clear(data->thumbnail, 0);
image_scale(data->thumbnail, image, 0, 0, thumb_w, thumb_h);
@ -830,12 +830,12 @@ static void monitor_thumbnail_generation(void *_data)
data->thumbnail->w,
data->thumbnail->h);
select_palette(data->rgbpal);
image_to_allegro(data->thumbnail, bmp, 0, 0);
unselect_palette();
image_to_allegro(data->thumbnail, bmp, 0, 0, data->palette);
image_free(data->thumbnail);
delete data->thumbnail; // image
delete data->palette;
data->thumbnail = NULL;
data->palette = NULL;
fileitem_set_thumbnail(data->fileitem, bmp);
@ -848,8 +848,9 @@ static void monitor_thumbnail_generation(void *_data)
remove_gui_monitor(data->monitor);
}
else
else {
jwidget_dirty(data->fileview);
}
}
/**