예제 #1
0
  // ContextObserver
  void onActiveSiteChange(const doc::Site& site) override {
    if (m_document == site.document())
      return;

    attachDocument(
      static_cast<app::Document*>(
        const_cast<doc::Document*>(site.document())));
  }
예제 #2
0
void StatusBar::onActiveSiteChange(const doc::Site& site)
{
  if (site.document() && site.sprite()) {
    m_hasDoc = true;
    m_commandsBox->setVisible(true);

    // Current frame
    m_currentFrame->setTextf("%d", site.frame()+1);

    // Cel opacity
    const Cel* cel;
    if (site.sprite()->supportAlpha() &&
        site.layer() &&
        site.layer()->isImage() &&
        !site.layer()->isBackground() &&
        (cel = site.layer()->cel(site.frame()))) {
      m_slider->setValue(MID(0, cel->opacity(), 255));
      m_slider->setEnabled(true);
    }
    else {
      m_slider->setValue(255);
      m_slider->setEnabled(false);
    }
  }
  else {
    m_hasDoc = false;
    m_commandsBox->setVisible(false);
  }
}
예제 #3
0
void StatusBar::onActiveSiteChange(const doc::Site& site)
{
  if (m_doc && site.document() != m_doc) {
    m_doc->removeObserver(this);
    m_doc = nullptr;
  }

  if (site.document() && site.sprite()) {
    if (!m_doc) {
      m_doc = const_cast<doc::Document*>(site.document());
      m_doc->addObserver(this);
    }
    else {
      ASSERT(m_doc == site.document());
    }

    m_docControls->setVisible(true);
    showSnapToGridWarning(
      Preferences::instance().document(
        static_cast<app::Document*>(m_doc)).grid.snap());

    // Current frame
    m_currentFrame->setTextf("%d", site.frame()+1);
  }
  else {
    ASSERT(m_doc == nullptr);
    m_docControls->setVisible(false);
    showSnapToGridWarning(false);
  }
  layout();
}
예제 #4
0
void ColorPicker::pickColor(const doc::Site& site,
                            const gfx::PointF& _pos,
                            const render::Projection& proj,
                            const Mode mode)
{
  const doc::Sprite* sprite = site.sprite();
  gfx::PointF pos = _pos;

  m_alpha = 255;
  m_color = app::Color::fromMask();

  // Check tiled mode
  if (sprite && site.document()) {
    const app::Document* doc = static_cast<const app::Document*>(site.document());
    DocumentPreferences& docPref = Preferences::instance().document(doc);

    pos = wrap_pointF(docPref.tiled.mode(),
                      site.sprite()->size(), pos);
  }

  // Get the color from the image
  switch (mode) {

    // Pick from the composed image
    case FromComposition: {
      m_color = app::Color::fromImage(
        sprite->pixelFormat(),
        render::get_sprite_pixel(sprite, pos.x, pos.y,
                                 site.frame(), proj));

      doc::CelList cels;
      sprite->pickCels(pos.x, pos.y, site.frame(), 128,
                       sprite->allVisibleLayers(), cels);
      if (!cels.empty())
        m_layer = cels.front()->layer();
      break;
    }

    // Pick from the current layer
    case FromActiveLayer: {
      const Cel* cel = site.cel();
      if (cel) {
        doc::color_t imageColor;
        if (!get_cel_pixel(cel, pos.x, pos.y,
                           site.frame(), imageColor))
          return;

        const doc::Image* image = cel->image();
        switch (image->pixelFormat()) {
          case IMAGE_RGB:
            m_alpha = doc::rgba_geta(imageColor);
            break;
          case IMAGE_GRAYSCALE:
            m_alpha = doc::graya_geta(imageColor);
            break;
        }

        m_color = app::Color::fromImage(image->pixelFormat(), imageColor);
        m_layer = const_cast<Layer*>(site.layer());
      }
      break;
    }

    case FromFirstReferenceLayer: {
      doc::CelList cels;
      sprite->pickCels(pos.x, pos.y, site.frame(), 128,
                       sprite->allVisibleReferenceLayers(), cels);

      for (const Cel* cel : cels) {
        doc::color_t imageColor;
        if (get_cel_pixel(cel, pos.x, pos.y,
                          site.frame(), imageColor)) {
          m_color = app::Color::fromImage(
            cel->image()->pixelFormat(), imageColor);
          m_layer = cel->layer();
          break;
        }
      }
      break;
    }
  }
}