static inline bool color_equal_32(color_t c1, color_t c2, int tolerance) { if (tolerance == 0) return (c1 == c2) || (rgba_geta(c1) == 0 && rgba_geta(c2) == 0); else { int r1 = rgba_getr(c1); int g1 = rgba_getg(c1); int b1 = rgba_getb(c1); int a1 = rgba_geta(c1); int r2 = rgba_getr(c2); int g2 = rgba_getg(c2); int b2 = rgba_getb(c2); int a2 = rgba_geta(c2); if (a1 == 0 && a2 == 0) return true; return ((ABS(r1-r2) <= tolerance) && (ABS(g1-g2) <= tolerance) && (ABS(b1-b2) <= tolerance) && (ABS(a1-a2) <= tolerance)); } }
// Creates a linear ramp in the palette. void Palette::makeGradient(int from, int to) { int r, g, b, a; int r1, g1, b1, a1; int r2, g2, b2, a2; int i, n; ASSERT(from >= 0 && from <= 255); ASSERT(to >= 0 && to <= 255); if (from > to) std::swap(from, to); n = to - from; if (n < 2) return; r1 = rgba_getr(getEntry(from)); g1 = rgba_getg(getEntry(from)); b1 = rgba_getb(getEntry(from)); a1 = rgba_geta(getEntry(from)); r2 = rgba_getr(getEntry(to)); g2 = rgba_getg(getEntry(to)); b2 = rgba_getb(getEntry(to)); a2 = rgba_geta(getEntry(to)); for (i=from+1; i<to; ++i) { r = r1 + (r2-r1) * (i-from) / n; g = g1 + (g2-g1) * (i-from) / n; b = b1 + (b2-b1) * (i-from) / n; a = a1 + (a2-a1) * (i-from) / n; setEntry(i, rgba(r, g, b, a)); } }
raster::color_t color_utils::fixup_color_for_background(PixelFormat format, raster::color_t color) { switch (format) { case IMAGE_RGB: if (rgba_geta(color) < 255) { return rgba(rgba_getr(color), rgba_getg(color), rgba_getb(color), 255); } break; case IMAGE_GRAYSCALE: if (graya_geta(color) < 255) { return graya(graya_getv(color), 255); } break; } return color; }
int color_utils::color_for_allegro(const app::Color& color, int depth) { int c = -1; switch (color.getType()) { case app::Color::MaskType: c = get_mask_for_bitmap(depth); break; case app::Color::RgbType: case app::Color::HsvType: c = makeacol_depth(depth, color.getRed(), color.getGreen(), color.getBlue(), 255); break; case app::Color::GrayType: c = color.getGray(); if (depth != 8) c = makeacol_depth(depth, c, c, c, 255); break; case app::Color::IndexType: c = color.getIndex(); if (depth != 8) { ASSERT(c >= 0 && c < (int)get_current_palette()->size()); uint32_t _c = get_current_palette()->getEntry(c); c = makeacol_depth(depth, rgba_getr(_c), rgba_getg(_c), rgba_getb(_c), 255); } break; } return c; }
ui::Color color_utils::color_for_ui(const app::Color& color) { ui::Color c = ui::ColorNone; switch (color.getType()) { case app::Color::MaskType: c = ui::ColorNone; break; case app::Color::RgbType: case app::Color::HsvType: c = ui::rgba(color.getRed(), color.getGreen(), color.getBlue(), 255); break; case app::Color::GrayType: c = ui::rgba(color.getGray(), color.getGray(), color.getGray(), 255); break; case app::Color::IndexType: { int i = color.getIndex(); ASSERT(i >= 0 && i < (int)get_current_palette()->size()); uint32_t _c = get_current_palette()->getEntry(i); c = ui::rgba(rgba_getr(_c), rgba_getg(_c), rgba_getb(_c), 255); break; } } return c; }
// Changes a color of the current system palette void set_current_color(int index, int r, int g, int b) { int c; ASSERT(index >= 0 && index <= 255); ASSERT(r >= 0 && r <= 255); ASSERT(g >= 0 && g <= 255); ASSERT(b >= 0 && b <= 255); c = ase_current_palette->getEntry(index); if (rgba_getr(c) != r || rgba_getg(c) != g || rgba_getb(c) != b) { RGB rgb; ase_current_palette->setEntry(index, rgba(r, g, b, 255)); rgb.r = r>>2; rgb.g = g>>2; rgb.b = b>>2; set_color(index, &rgb); }
int convert_color_to_allegro<IndexedTraits, 16>(color_t color, const Palette* palette) { color_t c = palette->getEntry(color); return makecol16(rgba_getr(c), rgba_getg(c), rgba_getb(c)); }
int convert_color_to_allegro<RgbTraits, 32>(color_t c, const Palette* palette) { return makeacol32(rgba_getr(c), rgba_getg(c), rgba_getb(c), rgba_geta(c)); }
int convert_color_to_allegro<RgbTraits, 24>(color_t c, const Palette* palette) { return makecol24(rgba_getr(c), rgba_getg(c), rgba_getb(c)); }
int convert_color_to_allegro<BitmapTraits, 32>(color_t color, const Palette* palette) { color_t c = palette->getEntry(color); return makeacol32(rgba_getr(c), rgba_getg(c), rgba_getb(c), rgba_geta(c)); }
bool FliFormat::onSave(FileOp* fop) { Sprite* sprite = fop->document->getSprite(); unsigned char cmap[768]; unsigned char omap[768]; s_fli_header fli_header; int c, times; Palette *pal; /* prepare fli header */ fli_header.filesize = 0; fli_header.frames = 0; fli_header.width = sprite->getWidth(); fli_header.height = sprite->getHeight(); if ((fli_header.width == 320) && (fli_header.height == 200)) fli_header.magic = HEADER_FLI; else fli_header.magic = HEADER_FLC; fli_header.depth = 8; fli_header.flags = 3; fli_header.speed = get_time_precision(sprite); fli_header.created = 0; fli_header.updated = 0; fli_header.aspect_x = 1; fli_header.aspect_y = 1; fli_header.oframe1 = fli_header.oframe2 = 0; /* open the file to write in binary mode */ FileHandle f(open_file_with_exception(fop->filename, "wb")); fseek(f, 128, SEEK_SET); // Create the bitmaps base::UniquePtr<Image> bmp(Image::create(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight())); base::UniquePtr<Image> old(Image::create(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight())); // Write frame by frame for (FrameNumber frpos(0); frpos < sprite->getTotalFrames(); ++frpos) { /* get color map */ pal = sprite->getPalette(frpos); for (c=0; c<256; c++) { cmap[3*c ] = rgba_getr(pal->getEntry(c)); cmap[3*c+1] = rgba_getg(pal->getEntry(c)); cmap[3*c+2] = rgba_getb(pal->getEntry(c)); } /* render the frame in the bitmap */ clear_image(bmp, 0); layer_render(sprite->getFolder(), bmp, 0, 0, frpos); /* how many times this frame should be written to get the same time that it has in the sprite */ times = sprite->getFrameDuration(frpos) / fli_header.speed; for (c=0; c<times; c++) { /* write this frame */ if (frpos == 0 && c == 0) fli_write_frame(f, &fli_header, NULL, NULL, (unsigned char *)bmp->getPixelAddress(0, 0), cmap, W_ALL); else fli_write_frame(f, &fli_header, (unsigned char *)old->getPixelAddress(0, 0), omap, (unsigned char *)bmp->getPixelAddress(0, 0), cmap, W_ALL); /* update the old image and color-map to the new ones to compare later */ copy_image(old, bmp, 0, 0); memcpy(omap, cmap, 768); } /* update progress */ fop_progress(fop, (float)(frpos.next()) / (float)(sprite->getTotalFrames())); } // Write the header and close the file fli_write_header(f, &fli_header); return true; }