[aseprite] 33/51: Minor changes in FilterManagerImpl

Tobias Hansen thansen at moszumanska.debian.org
Mon Jul 11 21:35:18 UTC 2016


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit c1f8c98ca8554d50e968bf6c53b3770f8e2b0ee6
Author: David Capello <davidcapello at gmail.com>
Date:   Fri Jul 1 17:02:47 2016 -0300

    Minor changes in FilterManagerImpl
---
 src/app/commands/filters/filter_manager_impl.cpp | 134 ++++++++++-------------
 src/app/commands/filters/filter_manager_impl.h   |  39 +++----
 2 files changed, 78 insertions(+), 95 deletions(-)

diff --git a/src/app/commands/filters/filter_manager_impl.cpp b/src/app/commands/filters/filter_manager_impl.cpp
index afdede6..61a2fc5 100644
--- a/src/app/commands/filters/filter_manager_impl.cpp
+++ b/src/app/commands/filters/filter_manager_impl.cpp
@@ -1,5 +1,5 @@
 // Aseprite
-// Copyright (C) 2001-2015  David Capello
+// Copyright (C) 2001-2016  David Capello
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License version 2 as
@@ -12,6 +12,7 @@
 #include "app/commands/filters/filter_manager_impl.h"
 
 #include "app/cmd/copy_rect.h"
+#include "app/cmd/patch_cel.h"
 #include "app/cmd/unlink_cel.h"
 #include "app/context_access.h"
 #include "app/document.h"
@@ -44,25 +45,24 @@ FilterManagerImpl::FilterManagerImpl(Context* context, Filter* filter)
   : m_context(context)
   , m_site(context->activeSite())
   , m_filter(filter)
-  , m_dst(NULL)
-  , m_preview_mask(NULL)
+  , m_src(nullptr)
+  , m_dst(nullptr)
+  , m_previewMask(nullptr)
   , m_progressDelegate(NULL)
 {
-  int offset_x, offset_y;
-
-  m_src = NULL;
   m_row = 0;
-  m_offset_x = 0;
-  m_offset_y = 0;
+  m_celX = 0;
+  m_celY = 0;
   m_mask = NULL;
   m_targetOrig = TARGET_ALL_CHANNELS;
   m_target = TARGET_ALL_CHANNELS;
 
-  Image* image = m_site.image(&offset_x, &offset_y);
-  if (image == NULL)
+  int x, y;
+  Image* image = m_site.image(&x, &y);
+  if (!image)
     throw NoImageException();
 
-  init(m_site.layer(), image, offset_x, offset_y);
+  init(m_site.layer(), image, x, y);
 }
 
 FilterManagerImpl::~FilterManagerImpl()
@@ -102,7 +102,7 @@ void FilterManagerImpl::begin()
   m_row = 0;
   m_mask = (document->isMaskVisible() ? document->mask(): NULL);
 
-  updateMask(m_mask, m_src);
+  updateBounds(m_mask, m_src);
 }
 
 void FilterManagerImpl::beginForPreview()
@@ -110,17 +110,18 @@ void FilterManagerImpl::beginForPreview()
   Document* document = static_cast<app::Document*>(m_site.document());
 
   if (document->isMaskVisible())
-    m_preview_mask.reset(new Mask(*document->mask()));
+    m_previewMask.reset(new Mask(*document->mask()));
   else {
-    m_preview_mask.reset(new Mask());
-    m_preview_mask->replace(
-      gfx::Rect(m_offset_x, m_offset_y,
+    m_previewMask.reset(new Mask());
+    m_previewMask->replace(
+      gfx::Rect(
+        m_celX, m_celY,
         m_src->width(),
         m_src->height()));
   }
 
   m_row = 0;
-  m_mask = m_preview_mask;
+  m_mask = m_previewMask;
 
   {
     Editor* editor = current_editor;
@@ -130,16 +131,16 @@ void FilterManagerImpl::beginForPreview()
     vp = vp.createIntersection(sprite->bounds());
 
     if (vp.isEmpty()) {
-      m_preview_mask.reset(NULL);
+      m_previewMask.reset(nullptr);
       m_row = -1;
       return;
     }
 
-    m_preview_mask->intersect(vp);
+    m_previewMask->intersect(vp);
   }
 
-  if (!updateMask(m_mask, m_src)) {
-    m_preview_mask.reset(NULL);
+  if (!updateBounds(m_mask, m_src)) {
+    m_previewMask.reset(nullptr);
     m_row = -1;
     return;
   }
@@ -152,19 +153,20 @@ void FilterManagerImpl::end()
 
 bool FilterManagerImpl::applyStep()
 {
-  if (m_row < 0 || m_row >= m_h)
+  if (m_row < 0 || m_row >= m_bounds.h)
     return false;
 
   if ((m_mask) && (m_mask->bitmap())) {
-    int x = m_x - m_mask->bounds().x + m_offset_x;
-    int y = m_y - m_mask->bounds().y + m_offset_y + m_row;
+    int x = m_bounds.x - m_mask->bounds().x + m_celX;
+    int y = m_bounds.y - m_mask->bounds().y + m_celY + m_row;
 
-    if ((m_w - x < 1) || (m_h - y < 1))
+    if ((m_bounds.w - x < 1) ||
+        (m_bounds.h - y < 1))
       return false;
 
     m_maskBits = m_mask->bitmap()
       ->lockBits<BitmapTraits>(Image::ReadLock,
-        gfx::Rect(x, y, m_w - x, m_h - y));
+        gfx::Rect(x, y, m_bounds.w - x, m_bounds.h - y));
 
     m_maskIterator = m_maskBits.begin();
   }
@@ -187,7 +189,7 @@ void FilterManagerImpl::apply(Transaction& transaction)
   while (!cancelled && applyStep()) {
     if (m_progressDelegate) {
       // Report progress.
-      m_progressDelegate->reportProgress(m_progressBase + m_progressWidth * (m_row+1) / m_h);
+      m_progressDelegate->reportProgress(m_progressBase + m_progressWidth * (m_row+1) / m_bounds.h);
 
       // Does the user cancelled the whole process?
       cancelled = m_progressDelegate->isCancelled();
@@ -196,8 +198,12 @@ void FilterManagerImpl::apply(Transaction& transaction)
 
   if (!cancelled) {
     // Copy "dst" to "src"
-    transaction.execute(new cmd::CopyRect(
-        m_src, m_dst, gfx::Clip(m_x, m_y, m_x, m_y, m_w, m_h)));
+    transaction.execute(
+      new cmd::CopyRect(
+        m_src, m_dst.get(),
+        gfx::Clip(m_bounds.x, m_bounds.y,
+                  m_bounds.x, m_bounds.y,
+                  m_bounds.w, m_bounds.h)));
   }
 }
 
@@ -233,7 +239,8 @@ void FilterManagerImpl::applyToTarget()
     // Avoid applying the filter two times to the same image
     if (visited.find(image->id()) == visited.end()) {
       visited.insert(image->id());
-      applyToImage(transaction, it->layer(),
+      applyToImage(
+        transaction, it->layer(),
         image, it->cel()->x(), it->cel()->y());
     }
 
@@ -255,10 +262,10 @@ void FilterManagerImpl::flush()
     gfx::Rect rect(
       editor->editorToScreen(
         gfx::Point(
-          m_x+m_offset_x,
-          m_y+m_offset_y+m_row-1)),
+          m_bounds.x+m_celX,
+          m_bounds.y+m_celY+m_row-1)),
       gfx::Size(
-        editor->zoom().apply(m_w),
+        editor->zoom().apply(m_bounds.w),
         (editor->zoom().scale() >= 1 ? editor->zoom().apply(1):
                                        editor->zoom().remove(1))));
 
@@ -273,12 +280,12 @@ void FilterManagerImpl::flush()
 
 const void* FilterManagerImpl::getSourceAddress()
 {
-  return m_src->getPixelAddress(m_x, m_row+m_y);
+  return m_src->getPixelAddress(m_bounds.x, m_row+m_bounds.y);
 }
 
 void* FilterManagerImpl::getDestinationAddress()
 {
-  return m_dst->getPixelAddress(m_x, m_row+m_y);
+  return m_dst->getPixelAddress(m_bounds.x, m_row+m_bounds.y);
 }
 
 bool FilterManagerImpl::skipPixel()
@@ -305,19 +312,20 @@ RgbMap* FilterManagerImpl::getRgbMap()
   return m_site.sprite()->rgbMap(m_site.frame());
 }
 
-void FilterManagerImpl::init(const Layer* layer, Image* image, int offset_x, int offset_y)
+void FilterManagerImpl::init(const Layer* layer, Image* image, int x, int y)
 {
-  m_offset_x = offset_x;
-  m_offset_y = offset_y;
+  m_celX = x;
+  m_celY = y;
 
-  if (!updateMask(static_cast<app::Document*>(m_site.document())->mask(), image))
+  if (!updateBounds(static_cast<app::Document*>(m_site.document())->mask(), image))
     throw InvalidAreaException();
 
   m_src = image;
-  m_dst.reset(crop_image(image, 0, 0, image->width(), image->height(), 0));
+  m_dst.reset(Image::createCopy(m_src));
+
   m_row = -1;
   m_mask = NULL;
-  m_preview_mask.reset(NULL);
+  m_previewMask.reset(nullptr);
 
   m_target = m_targetOrig;
 
@@ -332,51 +340,25 @@ void FilterManagerImpl::applyToImage(Transaction& transaction, Layer* layer, Ima
   apply(transaction);
 }
 
-bool FilterManagerImpl::updateMask(Mask* mask, const Image* image)
+bool FilterManagerImpl::updateBounds(Mask* mask, const Image* image)
 {
-  int x, y, w, h;
+  gfx::Rect bounds;
 
   if (mask && mask->bitmap()) {
-    x = mask->bounds().x - m_offset_x;
-    y = mask->bounds().y - m_offset_y;
-    w = mask->bounds().w;
-    h = mask->bounds().h;
-
-    if (x < 0) {
-      w += x;
-      x = 0;
-    }
-
-    if (y < 0) {
-      h += y;
-      y = 0;
-    }
-
-    if (x+w-1 >= image->width()-1)
-      w = image->width()-x;
-
-    if (y+h-1 >= image->height()-1)
-      h = image->height()-y;
+    bounds = mask->bounds();
+    bounds.offset(-m_celX, -m_celY);
+    bounds &= image->bounds();
   }
   else {
-    x = 0;
-    y = 0;
-    w = image->width();
-    h = image->height();
+    bounds = image->bounds();
   }
 
-  if ((w < 1) || (h < 1)) {
-    m_x = 0;
-    m_y = 0;
-    m_w = 0;
-    m_h = 0;
+  if (bounds.isEmpty()) {
+    m_bounds = gfx::Rect(0, 0, 0, 0);
     return false;
   }
   else {
-    m_x = x;
-    m_y = y;
-    m_w = w;
-    m_h = h;
+    m_bounds = bounds;
     return true;
   }
 }
diff --git a/src/app/commands/filters/filter_manager_impl.h b/src/app/commands/filters/filter_manager_impl.h
index 32308cf..3bf3685 100644
--- a/src/app/commands/filters/filter_manager_impl.h
+++ b/src/app/commands/filters/filter_manager_impl.h
@@ -1,5 +1,5 @@
 // Aseprite
-// Copyright (C) 2001-2015  David Capello
+// Copyright (C) 2001-2016  David Capello
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License version 2 as
@@ -12,6 +12,7 @@
 #include "base/exception.h"
 #include "base/unique_ptr.h"
 #include "doc/image_impl.h"
+#include "doc/image_ref.h"
 #include "doc/pixel_format.h"
 #include "doc/site.h"
 #include "filters/filter_indexed_data.h"
@@ -85,42 +86,42 @@ namespace app {
     doc::Sprite* sprite() { return m_site.sprite(); }
     doc::Layer* layer() { return m_site.layer(); }
     doc::frame_t frame() { return m_site.frame(); }
-    doc::Image* destinationImage() const { return m_dst; }
+    doc::Image* destinationImage() const { return m_dst.get(); }
 
     // Updates the current editor to show the progress of the preview.
     void flush();
 
     // FilterManager implementation
-    const void* getSourceAddress();
-    void* getDestinationAddress();
-    int getWidth() { return m_w; }
-    Target getTarget() { return m_target; }
-    FilterIndexedData* getIndexedData() { return this; }
-    bool skipPixel();
-    const doc::Image* getSourceImage() { return m_src; }
-    int x() { return m_x; }
-    int y() { return m_y+m_row; }
+    const void* getSourceAddress() override;
+    void* getDestinationAddress() override;
+    int getWidth() override { return m_bounds.w; }
+    Target getTarget() override { return m_target; }
+    FilterIndexedData* getIndexedData() override { return this; }
+    bool skipPixel() override;
+    const doc::Image* getSourceImage() override { return m_src; }
+    int x() override { return m_bounds.x; }
+    int y() override { return m_bounds.y+m_row; }
 
     // FilterIndexedData implementation
-    doc::Palette* getPalette();
-    doc::RgbMap* getRgbMap();
+    doc::Palette* getPalette() override;
+    doc::RgbMap* getRgbMap() override;
 
   private:
-    void init(const doc::Layer* layer, doc::Image* image, int offset_x, int offset_y);
+    void init(const doc::Layer* layer, doc::Image* image, int x, int y);
     void apply(Transaction& transaction);
     void applyToImage(Transaction& transaction, doc::Layer* layer, doc::Image* image, int x, int y);
-    bool updateMask(doc::Mask* mask, const doc::Image* image);
+    bool updateBounds(doc::Mask* mask, const doc::Image* image);
 
     Context* m_context;
     doc::Site m_site;
     Filter* m_filter;
     doc::Image* m_src;
-    base::UniquePtr<doc::Image> m_dst;
+    doc::ImageRef m_dst;
     int m_row;
-    int m_x, m_y, m_w, m_h;
-    int m_offset_x, m_offset_y;
+    gfx::Rect m_bounds;
+    int m_celX, m_celY;
     doc::Mask* m_mask;
-    base::UniquePtr<doc::Mask> m_preview_mask;
+    base::UniquePtr<doc::Mask> m_previewMask;
     doc::ImageBits<doc::BitmapTraits> m_maskBits;
     doc::ImageBits<doc::BitmapTraits>::iterator m_maskIterator;
     Target m_targetOrig;          // Original targets

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list