void PaletteEntryEditor::getPicks(PalettePicks& picks) { PaletteView* palView = ColorBar::instance()->getPaletteView(); palView->getSelectedEntries(picks); if (picks.picks() == 0) { int i = palView->getSelectedEntry(); if (i >= 0 && i < picks.size()) picks[i] = true; } }
void PaletteEntryEditor::setColor(const app::Color& color) { m_rgbSliders.setColor(color); m_hsvSliders.setColor(color); if (!m_disableHexUpdate) m_hexColorEntry.setColor(color); PalettePicks entries; getPicks(entries); int i, j, i2; // Find the first selected entry for (i=0; i<(int)entries.size(); ++i) if (entries[i]) break; // Find the first unselected entry after i for (i2=i+1; i2<(int)entries.size(); ++i2) if (!entries[i2]) break; // Find the last selected entry for (j=entries.size()-1; j>=0; --j) if (entries[j]) break; if (i == j) { m_entryLabel.setTextf(" Entry: %d", i); } else if (j-i+1 == i2-i) { m_entryLabel.setTextf(" Range: %d-%d", i, j); } else if (i == int(entries.size())) { m_entryLabel.setText(" No Entry"); } else { m_entryLabel.setText(" Multiple Entries"); } m_topBox.layout(); }
void ColorQuantizationCommand::onExecute(Context* context) { try { ContextWriter writer(UIContext::instance(), 500); Sprite* sprite = writer.sprite(); frame_t frame = writer.frame(); if (sprite) { PalettePicks entries; ColorBar::instance()->getPaletteView()->getSelectedEntries(entries); entries.pickAllIfNeeded(); int n = entries.picks(); Palette palette(frame, n); render::create_palette_from_rgb(sprite, frame, &palette); Palette newPalette(*get_current_palette()); int i = 0, j = 0; for (bool state : entries) { if (state) newPalette.setEntry(i, palette.getEntry(j++)); ++i; } Transaction transaction(writer.context(), "Color Quantization", ModifyDocument); transaction.execute(new cmd::SetPalette(sprite, frame, &newPalette)); transaction.commit(); set_current_palette(&newPalette, false); ui::Manager::getDefault()->invalidate(); } } catch (base::Exception& e) { Console::showException(e); } }
void ColorQuantizationCommand::onExecute(Context* context) { try { app::gen::PaletteFromSprite window; PalettePicks entries; Sprite* sprite; frame_t frame; Palette* curPalette; { ContextReader reader(context); Site site = context->activeSite(); sprite = site.sprite(); frame = site.frame(); curPalette = sprite->palette(frame); window.newPalette()->setSelected(true); window.alphaChannel()->setSelected( App::instance()->preferences().quantization.withAlpha()); window.ncolors()->setText("256"); ColorBar::instance()->getPaletteView()->getSelectedEntries(entries); if (entries.picks() > 1) { window.currentRange()->setTextf( "%s, %d color(s)", window.currentRange()->text().c_str(), entries.picks()); } else window.currentRange()->setEnabled(false); window.currentPalette()->setTextf( "%s, %d color(s)", window.currentPalette()->text().c_str(), curPalette->size()); } window.openWindowInForeground(); if (window.closer() != window.ok()) return; bool withAlpha = window.alphaChannel()->isSelected(); App::instance()->preferences().quantization.withAlpha(withAlpha); bool createPal = false; if (window.newPalette()->isSelected()) { int n = window.ncolors()->textInt(); n = MAX(1, n); entries = PalettePicks(n); entries.all(); createPal = true; } else if (window.currentPalette()->isSelected()) { entries.all(); } if (entries.picks() == 0) return; Palette tmpPalette(frame, entries.picks()); ColorQuantizationJob job(sprite, withAlpha, &tmpPalette); job.startJob(); job.waitJob(); if (job.isCanceled()) return; base::UniquePtr<Palette> newPalette( new Palette(createPal ? tmpPalette: *get_current_palette())); if (createPal) { entries = PalettePicks(newPalette->size()); entries.all(); } int i = 0, j = 0; for (bool state : entries) { if (state) newPalette->setEntry(i, tmpPalette.getEntry(j++)); ++i; } if (*curPalette != *newPalette) { ContextWriter writer(UIContext::instance(), 500); Transaction transaction(writer.context(), "Color Quantization", ModifyDocument); transaction.execute(new cmd::SetPalette(sprite, frame, newPalette.get())); transaction.commit(); set_current_palette(newPalette.get(), false); ui::Manager::getDefault()->invalidate(); } } catch (base::Exception& e) { Console::showException(e); } }
void ColorQuantizationCommand::onExecute(Context* context) { try { app::gen::PaletteFromSprite window; PalettePicks entries; Sprite* sprite; frame_t frame; Palette* curPalette; { ContextReader reader(context); Site site = context->activeSite(); sprite = site.sprite(); frame = site.frame(); curPalette = sprite->palette(frame); window.newPalette()->setSelected(true); window.alphaChannel()->setSelected( App::instance()->preferences().quantization.withAlpha()); window.ncolors()->setText("256"); ColorBar::instance()->getPaletteView()->getSelectedEntries(entries); if (entries.picks() > 1) { window.currentRange()->setTextf( "%s, %d color(s)", window.currentRange()->text().c_str(), entries.picks()); } else window.currentRange()->setEnabled(false); window.currentPalette()->setTextf( "%s, %d color(s)", window.currentPalette()->text().c_str(), curPalette->size()); } window.openWindowInForeground(); if (window.closer() != window.ok()) return; bool withAlpha = window.alphaChannel()->isSelected(); App::instance()->preferences().quantization.withAlpha(withAlpha); bool createPal = false; if (window.newPalette()->isSelected()) { int n = window.ncolors()->textInt(); n = MAX(1, n); entries = PalettePicks(n); entries.all(); createPal = true; } else if (window.currentPalette()->isSelected()) { entries.all(); } if (entries.picks() == 0) return; Palette tmpPalette(frame, entries.picks()); ContextReader reader(context); SpriteJob job(reader, "Color Quantization"); const bool newBlend = Preferences::instance().experimental.newBlend(); job.startJobWithCallback( [sprite, withAlpha, &tmpPalette, &job, newBlend]{ render::create_palette_from_sprite( sprite, 0, sprite->lastFrame(), withAlpha, &tmpPalette, &job, newBlend); // SpriteJob is a render::TaskDelegate }); job.waitJob(); if (job.isCanceled()) return; std::unique_ptr<Palette> newPalette( new Palette(createPal ? tmpPalette: *get_current_palette())); if (createPal) { entries = PalettePicks(newPalette->size()); entries.all(); } int i = 0, j = 0; for (bool state : entries) { if (state) newPalette->setEntry(i, tmpPalette.getEntry(j++)); ++i; } if (*curPalette != *newPalette) job.tx()(new cmd::SetPalette(sprite, frame, newPalette.get())); set_current_palette(newPalette.get(), false); ui::Manager::getDefault()->invalidate(); } catch (const base::Exception& e) { Console::showException(e); } }
void PaletteEntryEditor::setAbsolutePaletteEntryChannel(ColorSliders::Channel channel, const app::Color& color) { PalettePicks entries; getPicks(entries); int picksCount = entries.picks(); uint32_t src_color; int r, g, b; Palette* palette = get_current_palette(); for (int c=0; c<palette->size(); c++) { if (!entries[c]) continue; // Get the current RGB values of the palette entry src_color = palette->getEntry(c); r = rgba_getr(src_color); g = rgba_getg(src_color); b = rgba_getb(src_color); switch (m_type) { case app::Color::RgbType: // Modify one entry if (picksCount == 1) { r = color.getRed(); g = color.getGreen(); b = color.getBlue(); } // Modify one channel a set of entries else { // Setup the new RGB values depending of the modified channel. switch (channel) { case ColorSliders::Red: r = color.getRed(); case ColorSliders::Green: g = color.getGreen(); break; case ColorSliders::Blue: b = color.getBlue(); break; } } break; case app::Color::HsvType: { Hsv hsv; // Modify one entry if (picksCount == 1) { hsv.hue(color.getHue()); hsv.saturation(double(color.getSaturation()) / 100.0); hsv.value(double(color.getValue()) / 100.0); } // Modify one channel a set of entries else { // Convert RGB to HSV hsv = Hsv(Rgb(r, g, b)); // Only modify the desired HSV channel switch (channel) { case ColorSliders::Hue: hsv.hue(color.getHue()); break; case ColorSliders::Saturation: hsv.saturation(double(color.getSaturation()) / 100.0); break; case ColorSliders::Value: hsv.value(double(color.getValue()) / 100.0); break; } } // Convert HSV back to RGB Rgb rgb(hsv); r = rgb.red(); g = rgb.green(); b = rgb.blue(); } break; } palette->setEntry(c, doc::rgba(r, g, b, 255)); } }