void PixelsMovement::getDraggedImageCopy(base::UniquePtr<Image>& outputImage, base::UniquePtr<Mask>& outputMask) { gfx::Rect bounds = m_currentData.transformedBounds(); base::UniquePtr<Image> image(Image::create(m_sprite->pixelFormat(), bounds.w, bounds.h)); drawImage(image, bounds.origin(), false); // Draw mask without shrinking it, so the mask size is equal to the // "image" render. base::UniquePtr<Mask> mask(new Mask); drawMask(mask, false); // Now we can shrink and crop the image. gfx::Rect oldMaskBounds = mask->bounds(); mask->shrink(); gfx::Rect newMaskBounds = mask->bounds(); if (newMaskBounds != oldMaskBounds) { newMaskBounds.x -= oldMaskBounds.x; newMaskBounds.y -= oldMaskBounds.y; image.reset(crop_image(image, newMaskBounds.x, newMaskBounds.y, newMaskBounds.w, newMaskBounds.h, 0)); } outputImage.reset(image.release()); outputMask.reset(mask.release()); }
void ColorCurveCommand::onExecute(Context* context) { // Default curve if (!the_curve) { // TODO load the curve? the_curve.reset(new ColorCurve(ColorCurve::Linear)); the_curve->addPoint(gfx::Point(0, 0)); the_curve->addPoint(gfx::Point(255, 255)); } ColorCurveFilter filter; filter.setCurve(the_curve.get()); FilterManagerImpl filterMgr(context, &filter); filterMgr.setTarget(TARGET_RED_CHANNEL | TARGET_GREEN_CHANNEL | TARGET_BLUE_CHANNEL | TARGET_GRAY_CHANNEL | TARGET_ALPHA_CHANNEL); ColorCurveWindow window(filter, filterMgr); if (window.doModal()) { // TODO save the curve? } }
bool ResourcesLoader::next(base::UniquePtr<Resource>& resource) { Resource* rawResource; if (m_queue.try_pop(rawResource)) { resource.reset(rawResource); return true; } else return false; }
ColorPopup::ColorPopup(const ColorButtonOptions& options) : PopupWindowPin(" ", // Non-empty to create title-bar and close button ClickBehavior::CloseOnClickInOtherWindow, options.canPinSelector) , m_vbox(VERTICAL) , m_topBox(HORIZONTAL) , m_color(app::Color::fromMask()) , m_closeButton(nullptr) , m_colorPaletteContainer(options.showIndexTab ? new ui::View: nullptr) , m_colorPalette(options.showIndexTab ? new PaletteView(false, PaletteView::SelectOneColor, this, 7*guiscale()): nullptr) , m_simpleColors(nullptr) , m_oldAndNew(Shade(2), ColorShades::ClickEntries) , m_maskLabel("Transparent Color Selected") , m_canPin(options.canPinSelector) , m_insideChange(false) , m_disableHexUpdate(false) { if (options.showSimpleColors) { if (!g_simplePal) { ResourceFinder rf; rf.includeDataDir("palettes/tags.gpl"); if (rf.findFirst()) g_simplePal.reset(load_palette(rf.filename().c_str())); } if (g_simplePal) m_simpleColors = new SimpleColors(this, &m_tooltips); } ButtonSet::Item* item = m_colorType.addItem("Index"); item->setFocusStop(false); if (!options.showIndexTab) item->setVisible(false); m_colorType.addItem("RGB")->setFocusStop(false); m_colorType.addItem("HSV")->setFocusStop(false); m_colorType.addItem("HSL")->setFocusStop(false); m_colorType.addItem("Gray")->setFocusStop(false); m_colorType.addItem("Mask")->setFocusStop(false); m_topBox.setBorder(gfx::Border(0)); m_topBox.setChildSpacing(0); if (m_colorPalette) { m_colorPaletteContainer->attachToView(m_colorPalette); m_colorPaletteContainer->setExpansive(true); } m_sliders.setExpansive(true); m_topBox.addChild(&m_colorType); m_topBox.addChild(new Separator("", VERTICAL)); m_topBox.addChild(&m_hexColorEntry); m_topBox.addChild(&m_oldAndNew); // TODO fix this hack for close button in popup window // Move close button (decorative widget) inside the m_topBox { WidgetsList decorators; for (auto child : children()) { if (child->type() == kWindowCloseButtonWidget) { m_closeButton = child; removeChild(child); break; } } if (m_closeButton) { m_topBox.addChild(new BoxFiller); VBox* vbox = new VBox; vbox->addChild(m_closeButton); m_topBox.addChild(vbox); } } setText(""); // To remove title m_vbox.addChild(&m_tooltips); if (m_simpleColors) m_vbox.addChild(m_simpleColors); m_vbox.addChild(&m_topBox); if (m_colorPaletteContainer) m_vbox.addChild(m_colorPaletteContainer); m_vbox.addChild(&m_sliders); m_vbox.addChild(&m_maskLabel); addChild(&m_vbox); m_colorType.ItemChange.connect(base::Bind<void>(&ColorPopup::onColorTypeClick, this)); m_sliders.ColorChange.connect(&ColorPopup::onColorSlidersChange, this); m_hexColorEntry.ColorChange.connect(&ColorPopup::onColorHexEntryChange, this); m_oldAndNew.Click.connect(&ColorPopup::onSelectOldColor, this); // Set RGB just for the sizeHint(), and then deselect the color type // (the first setColor() call will setup it correctly.) selectColorType(app::Color::RgbType); m_colorType.deselectItems(); m_onPaletteChangeConn = App::instance()->PaletteChange.connect(&ColorPopup::onPaletteChange, this); InitTheme.connect( [this]{ setSizeHint(gfx::Size(300*guiscale(), sizeHint().h)); }); initTheme(); }
ToolLoopBase(Editor* editor, tools::Tool* tool, tools::Ink* ink, Document* document, tools::ToolLoop::Button button, const app::Color& fgColor, const app::Color& bgColor) : m_editor(editor) , m_tool(tool) , m_brush(App::instance()->contextBar()->activeBrush(m_tool)) , m_document(document) , m_sprite(editor->sprite()) , m_layer(editor->layer()) , m_frame(editor->frame()) , m_rgbMap(nullptr) , m_docPref(Preferences::instance().document(m_document)) , m_toolPref(Preferences::instance().tool(m_tool)) , m_opacity(m_toolPref.opacity()) , m_tolerance(m_toolPref.tolerance()) , m_contiguous(m_toolPref.contiguous()) , m_button(button) , m_ink(ink->clone()) , m_controller(m_tool->getController(m_button)) , m_pointShape(m_tool->getPointShape(m_button)) , m_intertwine(m_tool->getIntertwine(m_button)) , m_tracePolicy(m_tool->getTracePolicy(m_button)) , m_symmetry(nullptr) , m_fgColor(color_utils::color_for_target_mask(fgColor, ColorTarget(m_layer))) , m_bgColor(color_utils::color_for_target_mask(bgColor, ColorTarget(m_layer))) , m_primaryColor(button == tools::ToolLoop::Left ? m_fgColor: m_bgColor) , m_secondaryColor(button == tools::ToolLoop::Left ? m_bgColor: m_fgColor) { tools::FreehandAlgorithm algorithm = m_toolPref.freehandAlgorithm(); if (m_tracePolicy == tools::TracePolicy::Accumulate || m_tracePolicy == tools::TracePolicy::AccumulateUpdateLast) { tools::ToolBox* toolbox = App::instance()->toolBox(); switch (algorithm) { case tools::FreehandAlgorithm::DEFAULT: m_intertwine = toolbox->getIntertwinerById(tools::WellKnownIntertwiners::AsLines); m_tracePolicy = tools::TracePolicy::Accumulate; break; case tools::FreehandAlgorithm::PIXEL_PERFECT: m_intertwine = toolbox->getIntertwinerById(tools::WellKnownIntertwiners::AsPixelPerfect); m_tracePolicy = tools::TracePolicy::AccumulateUpdateLast; break; case tools::FreehandAlgorithm::DOTS: m_intertwine = toolbox->getIntertwinerById(tools::WellKnownIntertwiners::None); m_tracePolicy = tools::TracePolicy::Accumulate; break; } } // Symmetry mode if (Preferences::instance().symmetryMode.enabled()) { switch (m_docPref.symmetry.mode()) { case app::gen::SymmetryMode::NONE: ASSERT(m_symmetry == nullptr); break; case app::gen::SymmetryMode::HORIZONTAL: m_symmetry.reset(new app::tools::HorizontalSymmetry(m_docPref.symmetry.xAxis())); break; case app::gen::SymmetryMode::VERTICAL: m_symmetry.reset(new app::tools::VerticalSymmetry(m_docPref.symmetry.yAxis())); break; } } // Ignore opacity for these inks if (!tools::inkHasOpacity(m_toolPref.ink()) && m_brush->type() != kImageBrushType && !m_ink->isEffect()) { m_opacity = 255; } if (m_toolPref.ink() == tools::InkType::SHADING) { m_shadingRemap.reset( App::instance()->contextBar()->createShadeRemap( button == tools::ToolLoop::Left)); } }