[haiku-commits] r37164 - haiku/trunk/src/apps/showimage

  • From: superstippi@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 17 Jun 2010 10:52:48 +0200 (CEST)

Author: stippi
Date: 2010-06-17 10:52:47 +0200 (Thu, 17 Jun 2010)
New Revision: 37164
Changeset: http://dev.haiku-os.org/changeset/37164/haiku

Added:
   haiku/trunk/src/apps/showimage/SelectionBox.cpp
   haiku/trunk/src/apps/showimage/SelectionBox.h
Modified:
   haiku/trunk/src/apps/showimage/Jamfile
   haiku/trunk/src/apps/showimage/ShowImageView.cpp
   haiku/trunk/src/apps/showimage/ShowImageView.h
Log:
 * Moved selection box handling into a separate class SelectionBox. Mouse hooks
   of that class are not yet used. Invalidation of the view could also work
   via listener mechanism.
 * Made image <-> view conversion and constraint methods public.
 * Sorted .cpp files in Jamfile alphabetically.


Modified: haiku/trunk/src/apps/showimage/Jamfile
===================================================================
--- haiku/trunk/src/apps/showimage/Jamfile      2010-06-17 08:10:16 UTC (rev 
37163)
+++ haiku/trunk/src/apps/showimage/Jamfile      2010-06-17 08:52:47 UTC (rev 
37164)
@@ -5,17 +5,18 @@
 UsePublicHeaders [ FDirName be_apps Tracker ] ;
 
 Application ShowImage :
+       EntryMenuItem.cpp
+       Filter.cpp
+       PrintOptionsWindow.cpp
+       ProgressWindow.cpp
+       ResizerWindow.cpp
+       SelectionBox.cpp
        ShowImageApp.cpp
        ShowImageSettings.cpp
        ShowImageStatusView.cpp
        ShowImageUndo.cpp
        ShowImageView.cpp
        ShowImageWindow.cpp
-       PrintOptionsWindow.cpp
-       Filter.cpp
-       EntryMenuItem.cpp
-       ProgressWindow.cpp
-       ResizerWindow.cpp
        : libshared.a
        be tracker translation liblocale.so $(TARGET_LIBSUPC++)
        : ShowImage.rdef

Added: haiku/trunk/src/apps/showimage/SelectionBox.cpp
===================================================================
--- haiku/trunk/src/apps/showimage/SelectionBox.cpp                             
(rev 0)
+++ haiku/trunk/src/apps/showimage/SelectionBox.cpp     2010-06-17 08:52:47 UTC 
(rev 37164)
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2003-2010, Haiku, Inc. All Rights Reserved.
+ * Copyright 2004-2005 yellowTAB GmbH. All Rights Reserverd.
+ * Copyright 2006 Bernd Korz. All Rights Reserved
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Fernando Francisco de Oliveira
+ *             Michael Wilber
+ *             Michael Pfeiffer
+ *             Ryan Leavengood
+ *             yellowTAB GmbH
+ *             Bernd Korz
+ *             Stephan Aßmus <superstippi@xxxxxx>
+ */
+
+
+#include "SelectionBox.h"
+
+#include <math.h>
+#include <new>
+#include <stdio.h>
+
+#include "ShowImageView.h"
+
+
+SelectionBox::SelectionBox()
+       :
+       fBounds()
+{
+       _InitPatterns();
+}
+
+
+SelectionBox::~SelectionBox()
+{
+}
+
+
+void
+SelectionBox::SetBounds(ShowImageView* view, BRect bounds)
+{
+       view->ConstrainToImage(bounds);
+
+       if (fBounds == bounds)
+               return;
+
+       BRect dirtyOld = _RectInView(view);
+
+       fBounds = bounds;
+
+       BRect dirtyNew = _RectInView(view);
+
+       if (dirtyOld.IsValid() && dirtyNew.IsValid())
+               view->Invalidate(dirtyOld | dirtyNew);
+       else if (dirtyOld.IsValid())
+               view->Invalidate(dirtyOld);
+       else if (dirtyNew.IsValid())
+               view->Invalidate(dirtyNew);
+}
+
+
+BRect
+SelectionBox::Bounds() const
+{
+       return fBounds;
+}
+
+
+void
+SelectionBox::MouseDown(ShowImageView* view, BPoint where)
+{
+       // TODO: Allow to re-adjust corners.
+       where = view->ViewToImage(where);
+       SetBounds(view, BRect(where, where));
+}
+
+
+void
+SelectionBox::MouseMoved(ShowImageView* view, BPoint where)
+{
+       // TODO: Allow to re-adjust corners.
+       where = view->ViewToImage(where);
+
+       BRect bounds(fBounds);
+
+       if (where.x >= bounds.left)
+               bounds.right = where.x;
+       else
+               bounds.left = where.x;
+
+       if (where.y >= bounds.top)
+               bounds.bottom = where.y;
+       else
+               bounds.top = where.y;
+
+       SetBounds(view, bounds);
+}
+
+
+void
+SelectionBox::MouseUp(ShowImageView* view, BPoint where)
+{
+}
+
+
+void
+SelectionBox::Animate()
+{
+       // rotate up
+       uchar p = fPatternUp.data[0];
+       for (int i = 0; i <= 6; i ++)
+               fPatternUp.data[i] = fPatternUp.data[i + 1];
+       fPatternUp.data[7] = p;
+
+       // rotate down
+       p = fPatternDown.data[7];
+       for (int i = 7; i >= 1; i --)
+               fPatternDown.data[i] = fPatternDown.data[i - 1];
+       fPatternDown.data[0] = p;
+
+       // rotate to left
+       p = fPatternLeft.data[0];
+       bool set = (p & 0x80) != 0;
+       p <<= 1;
+       p &= 0xfe;
+       if (set)
+               p |= 1;
+       memset(fPatternLeft.data, p, 8);
+
+       // rotate to right
+       p = fPatternRight.data[0];
+       set = (p & 1) != 0;
+       p >>= 1;
+       if (set)
+               p |= 0x80;
+       memset(fPatternRight.data, p, 8);
+}
+
+
+void
+SelectionBox::Draw(ShowImageView* view, const BRect& updateRect) const
+{
+       BRect r = _RectInView(view);
+       if (!r.IsValid() || !updateRect.Intersects(r))
+               return;
+
+       view->PushState();
+
+       view->SetLowColor(255, 255, 255);
+       view->StrokeLine(BPoint(r.left, r.top), BPoint(r.right, r.top),
+               fPatternLeft);
+       view->StrokeLine(BPoint(r.right, r.top + 1), BPoint(r.right, r.bottom - 
1),
+               fPatternUp);
+       view->StrokeLine(BPoint(r.left, r.bottom), BPoint(r.right, r.bottom),
+               fPatternRight);
+       view->StrokeLine(BPoint(r.left, r.top + 1), BPoint(r.left, r.bottom - 
1),
+               fPatternDown);
+
+       view->PopState();
+}
+
+
+// #pragma mark -
+
+
+void
+SelectionBox::_InitPatterns()
+{
+       uchar p;
+       uchar p1 = 0x33;
+       uchar p2 = 0xCC;
+       for (int i = 0; i <= 7; i ++) {
+               fPatternLeft.data[i] = p1;
+               fPatternRight.data[i] = p2;
+               if ((i / 2) % 2 == 0)
+                       p = 255;
+               else
+                       p = 0;
+               fPatternUp.data[i] = p;
+               fPatternDown.data[i] = ~p;
+       }
+}
+
+
+BRect
+SelectionBox::_RectInView(ShowImageView* view) const
+{
+       BRect r;
+       if (fBounds.Height() <= 0.0 || fBounds.Width() <= 0.0)
+               return r;
+
+       r = fBounds;
+       // Layout selection rect in view coordinate space
+       view->ConstrainToImage(r);
+       r = view->ImageToView(r);
+       // draw selection box *around* selection
+       r.InsetBy(-1, -1);
+
+       return r;
+}

Added: haiku/trunk/src/apps/showimage/SelectionBox.h
===================================================================
--- haiku/trunk/src/apps/showimage/SelectionBox.h                               
(rev 0)
+++ haiku/trunk/src/apps/showimage/SelectionBox.h       2010-06-17 08:52:47 UTC 
(rev 37164)
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2003-2010, Haiku, Inc. All Rights Reserved.
+ * Copyright 2004-2005 yellowTAB GmbH. All Rights Reserverd.
+ * Copyright 2006 Bernd Korz. All Rights Reserved
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Fernando Francisco de Oliveira
+ *             Michael Wilber
+ *             Michael Pfeiffer
+ *             yellowTAB GmbH
+ *             Bernd Korz
+ *             Stephan Aßmus <superstippi@xxxxxx>
+ */
+#ifndef SELECTION_BOX_H
+#define SELECTION_BOX_H
+
+
+#include <View.h>
+
+class ShowImageView;
+
+
+class SelectionBox {
+public:
+                                                               SelectionBox();
+                                                               ~SelectionBox();
+
+                       void                            
SetBounds(ShowImageView* view, BRect bounds);
+                       BRect                           Bounds() const;
+
+                       void                            
MouseDown(ShowImageView* view, BPoint where);
+                       void                            
MouseMoved(ShowImageView* view, BPoint where);
+                       void                            MouseUp(ShowImageView* 
view, BPoint where);
+
+                       void                            Animate();
+                       void                            Draw(ShowImageView* 
view,
+                                                                       const 
BRect& updateRect) const;
+
+private:
+                       void                            _InitPatterns();
+
+                       BRect                           
_RectInView(ShowImageView* view) const;
+
+private:
+                       BRect                           fBounds;
+
+                       // Use patterns to simulate marching ants for selection.
+                       pattern                         fPatternUp;
+                       pattern                         fPatternDown;
+                       pattern                         fPatternLeft;
+                       pattern                         fPatternRight;
+};
+
+#endif // SELECTION_BOX_H

Modified: haiku/trunk/src/apps/showimage/ShowImageView.cpp
===================================================================
--- haiku/trunk/src/apps/showimage/ShowImageView.cpp    2010-06-17 08:10:16 UTC 
(rev 37163)
+++ haiku/trunk/src/apps/showimage/ShowImageView.cpp    2010-06-17 08:52:47 UTC 
(rev 37164)
@@ -220,8 +220,6 @@
        fIsActiveWin(true),
        fProgressWindow(NULL)
 {
-       _InitPatterns();
-
        ShowImageSettings* settings;
        settings = my_app->Settings();
        if (settings->Lock()) {
@@ -246,61 +244,7 @@
 }
 
 
-//! Use patterns to simulate marching ants for selection
 void
-ShowImageView::_InitPatterns()
-{
-       uchar p;
-       uchar p1 = 0x33;
-       uchar p2 = 0xCC;
-       for (int i = 0; i <= 7; i ++) {
-               fPatternLeft.data[i] = p1;
-               fPatternRight.data[i] = p2;
-               if ((i / 2) % 2 == 0)
-                       p = 255;
-               else
-                       p = 0;
-               fPatternUp.data[i] = p;
-               fPatternDown.data[i] = ~p;
-       }
-}
-
-
-void
-ShowImageView::_RotatePatterns()
-{
-       // rotate up
-       uchar p = fPatternUp.data[0];
-       for (int i = 0; i <= 6; i ++)
-               fPatternUp.data[i] = fPatternUp.data[i + 1];
-       fPatternUp.data[7] = p;
-
-       // rotate down
-       p = fPatternDown.data[7];
-       for (int i = 7; i >= 1; i --)
-               fPatternDown.data[i] = fPatternDown.data[i - 1];
-       fPatternDown.data[0] = p;
-
-       // rotate to left
-       p = fPatternLeft.data[0];
-       bool set = (p & 0x80) != 0;
-       p <<= 1;
-       p &= 0xfe;
-       if (set)
-               p |= 1;
-       memset(fPatternLeft.data, p, 8);
-
-       // rotate to right
-       p = fPatternRight.data[0];
-       set = (p & 1) != 0;
-       p >>= 1;
-       if (set)
-               p |= 0x80;
-       memset(fPatternRight.data, p, 8);
-}
-
-
-void
 ShowImageView::_AnimateSelection(bool enabled)
 {
        fAnimateSelection = enabled;
@@ -312,8 +256,8 @@
 {
        // animate marching ants
        if (fHasSelection && fAnimateSelection && fIsActiveWin) {
-               _RotatePatterns();
-               _DrawSelectionBox();
+               fSelectionBox.Animate();
+               fSelectionBox.Draw(this, Bounds());
        }
        if (fSlideShow) {
                fSlideShowCountDown --;
@@ -424,8 +368,8 @@
        if (fHasSelection) {
                char size[50];
                sprintf(size, " (%.0fx%.0f)",
-                       fSelectionRect.Width()+1.0,
-                       fSelectionRect.Height()+1.0);
+                       fSelectionBox.Bounds().Width() + 1.0,
+                       fSelectionBox.Bounds().Height() + 1.0);
                status_to_send << size;
        }
 
@@ -612,6 +556,50 @@
 }
 
 
+BPoint
+ShowImageView::ImageToView(BPoint p) const
+{
+       p.x = floorf(fZoom * p.x + fBitmapLocationInView.x);
+       p.y = floorf(fZoom * p.y + fBitmapLocationInView.y);
+       return p;
+}
+
+
+BPoint
+ShowImageView::ViewToImage(BPoint p) const
+{
+       p.x = floorf((p.x - fBitmapLocationInView.x) / fZoom);
+       p.y = floorf((p.y - fBitmapLocationInView.y) / fZoom);
+       return p;
+}
+
+
+BRect
+ShowImageView::ImageToView(BRect r) const
+{
+       BPoint leftTop(ImageToView(BPoint(r.left, r.top)));
+       BPoint rightBottom(r.right, r.bottom);
+       rightBottom += BPoint(1, 1);
+       rightBottom = ImageToView(rightBottom);
+       rightBottom -= BPoint(1, 1);
+       return BRect(leftTop.x, leftTop.y, rightBottom.x, rightBottom.y);
+}
+
+
+void
+ShowImageView::ConstrainToImage(BPoint& point) const
+{
+       point.ConstrainTo(fBitmap->Bounds());
+}
+
+
+void
+ShowImageView::ConstrainToImage(BRect& rect) const
+{
+       rect = rect & fBitmap->Bounds();
+}
+
+
 status_t
 ShowImageView::_SetSelection(const entry_ref *ref, BPoint point)
 {
@@ -822,36 +810,6 @@
 }
 
 
-BPoint
-ShowImageView::_ImageToView(BPoint p) const
-{
-       p.x = floorf(fZoom * p.x + fBitmapLocationInView.x);
-       p.y = floorf(fZoom * p.y + fBitmapLocationInView.y);
-       return p;
-}
-
-
-BPoint
-ShowImageView::_ViewToImage(BPoint p) const
-{
-       p.x = floorf((p.x - fBitmapLocationInView.x) / fZoom);
-       p.y = floorf((p.y - fBitmapLocationInView.y) / fZoom);
-       return p;
-}
-
-
-BRect
-ShowImageView::_ImageToView(BRect r) const
-{
-       BPoint leftTop(_ImageToView(BPoint(r.left, r.top)));
-       BPoint rightBottom(r.right, r.bottom);
-       rightBottom += BPoint(1, 1);
-       rightBottom = _ImageToView(rightBottom);
-       rightBottom -= BPoint(1, 1);
-       return BRect(leftTop.x, leftTop.y, rightBottom.x, rightBottom.y);
-}
-
-
 void
 ShowImageView::_DrawBorder(BRect border)
 {
@@ -1009,60 +967,21 @@
                        BRect srcRect;
                        BRect dstRect;
                        _GetSelectionMergeRects(srcRect, dstRect);
-                       dstRect = _ImageToView(dstRect);
+                       dstRect = ImageToView(dstRect);
                        DrawBitmap(fSelectionBitmap, srcRect, dstRect);
                }
-               _DrawSelectionBox();
+               fSelectionBox.Draw(this, updateRect);
        }
 }
 
 
 void
-ShowImageView::_DrawSelectionBox()
-{
-       if (fSelectionRect.Height() <= 0.0 || fSelectionRect.Width() <= 0.0)
-               return;
-
-       BRect r(fSelectionRect);
-       _ConstrainToImage(r);
-       r = _ImageToView(r);
-       // draw selection box *around* selection
-       r.InsetBy(-1, -1);
-       PushState();
-       SetLowColor(255, 255, 255);
-       StrokeLine(BPoint(r.left, r.top), BPoint(r.right, r.top),
-               fPatternLeft);
-       StrokeLine(BPoint(r.right, r.top + 1), BPoint(r.right, r.bottom - 1),
-               fPatternUp);
-       StrokeLine(BPoint(r.left, r.bottom), BPoint(r.right, r.bottom),
-               fPatternRight);
-       StrokeLine(BPoint(r.left, r.top + 1), BPoint(r.left, r.bottom - 1),
-               fPatternDown);
-       PopState();
-}
-
-
-void
 ShowImageView::FrameResized(float /* width */, float /* height */)
 {
        FixupScrollBars();
 }
 
 
-void
-ShowImageView::_ConstrainToImage(BPoint &point)
-{
-       point.ConstrainTo(fBitmap->Bounds());
-}
-
-
-void
-ShowImageView::_ConstrainToImage(BRect &rect)
-{
-       rect = rect & fBitmap->Bounds();
-}
-
-
 BBitmap*
 ShowImageView::_CopyFromRect(BRect srcRect)
 {
@@ -1094,7 +1013,7 @@
        if (!fHasSelection)
                return NULL;
 
-       BRect rect(0, 0, fSelectionRect.Width(), fSelectionRect.Height());
+       BRect rect = fSelectionBox.Bounds().OffsetToCopy(B_ORIGIN);
        if (!imageSize) {
                // scale image to view size
                rect.right = floorf((rect.right + 1.0) * fZoom - 1.0);
@@ -1211,7 +1130,7 @@
        drag.AddString("be:clip_name", "Bitmap Clip");
        // ShowImage specific fields
        drag.AddPoint("be:_source_point", sourcePoint);
-       drag.AddRect("be:_frame", fSelectionRect);
+       drag.AddRect("be:_frame", fSelectionBox.Bounds());
        if (_AddSupportedTypes(&drag, bitmap)) {
                // we also support "Passing Data via File" protocol
                drag.AddString("be:types", B_FILE_MIME_TYPE);
@@ -1219,9 +1138,10 @@
                _AnimateSelection(false);
                // only use a transparent bitmap on selections less than 400x400
                // (taking into account zooming)
-               if ((fSelectionRect.Width() * fZoom) < 400.0
-                       && (fSelectionRect.Height() * fZoom) < 400.0) {
-                       sourcePoint -= fSelectionRect.LeftTop();
+               BRect selectionRect = fSelectionBox.Bounds();
+               if ((selectionRect.Width() * fZoom) < 400.0
+                       && (selectionRect.Height() * fZoom) < 400.0) {
+                       sourcePoint -= selectionRect.LeftTop();
                        sourcePoint.x *= fZoom;
                        sourcePoint.y *= fZoom;
                        // DragMessage takes ownership of bitmap
@@ -1230,8 +1150,8 @@
                } else {
                        delete bitmap;
                        // Offset and scale the rect
-                       BRect rect(fSelectionRect);
-                       rect = _ImageToView(rect);
+                       BRect rect(selectionRect);
+                       rect = ImageToView(rect);
                        rect.InsetBy(-1, -1);
                        DragMessage(&drag, rect);
                }
@@ -1414,7 +1334,7 @@
        dstRect = selection;
 
        BRect clippedDstRect(dstRect);
-       _ConstrainToImage(clippedDstRect);
+       ConstrainToImage(clippedDstRect);
 
        srcRect = merge->Bounds().OffsetToCopy(B_ORIGIN);
 
@@ -1430,7 +1350,7 @@
 void
 ShowImageView::_GetSelectionMergeRects(BRect& srcRect, BRect& dstRect)
 {
-       _GetMergeRects(fSelectionBitmap, fSelectionRect, srcRect, dstRect);
+       _GetMergeRects(fSelectionBitmap, fSelectionBox.Bounds(), srcRect, 
dstRect);
 }
 
 
@@ -1475,14 +1395,14 @@
        if (fSelectionBitmap == NULL) {
                // Even though the merge will not change the background image,
                // undo information still needs to be saved here.
-               fUndo.SetTo(fSelectionRect, NULL, _CopySelection());
+               fUndo.SetTo(fSelectionBox.Bounds(), NULL, _CopySelection());
                return;
        }
 
        // Merge selection with background
-       fUndo.SetTo(fSelectionRect, _CopyFromRect(fSelectionRect),
+       fUndo.SetTo(fSelectionBox.Bounds(), 
_CopyFromRect(fSelectionBox.Bounds()),
                _CopySelection());
-       _MergeWithBitmap(fSelectionBitmap, fSelectionRect);
+       _MergeWithBitmap(fSelectionBitmap, fSelectionBox.Bounds());
 }
 
 
@@ -1493,10 +1413,10 @@
        uint32 buttons;
        MakeFocus(true);
 
-       point = _ViewToImage(position);
+       point = ViewToImage(position);
        buttons = _GetMouseButtons();
 
-       if (fHasSelection && fSelectionRect.Contains(point)
+       if (fHasSelection && fSelectionBox.Bounds().Contains(point)
                && (buttons & (B_PRIMARY_MOUSE_BUTTON | 
B_SECONDARY_MOUSE_BUTTON))) {
                if (!fSelectionBitmap)
                        fSelectionBitmap = _CopySelection();
@@ -1515,19 +1435,11 @@
                if (Bounds().Contains(point)) {
                        // If selection stayed inside this view
                        // (Some of the selection may be in the border area, 
which can be OK)
-                       BPoint last, diff;
-                       last = _ViewToImage(point);
-                       diff = last - sourcePoint;
+                       BPoint last = ViewToImage(point);
+                       BPoint diff = last - sourcePoint;
 
-                       BRect newSelection = fSelectionRect;
-                       newSelection.OffsetBy(diff);
-
-                       if (fBitmap->Bounds().Intersects(newSelection)) {
-                               // Do not accept the new selection box location
-                               // if it does not intersect with the bitmap 
rectangle
-                               fSelectionRect = newSelection;
-                               Invalidate();
-                       }
+                       fSelectionBox.SetBounds(this,
+                               fSelectionBox.Bounds().OffsetByCopy(diff));
                }
 
                _AnimateSelection(true);
@@ -1540,10 +1452,10 @@
                _SetHasSelection(true);
                fCreatingSelection = true;
                SetMouseEventMask(B_POINTER_EVENTS);
-               _ConstrainToImage(point);
+               ConstrainToImage(point);
                fFirstPoint = point;
                fCopyFromRect.Set(point.x, point.y, point.x, point.y);
-               fSelectionRect = fCopyFromRect;
+               fSelectionBox.SetBounds(this, fCopyFromRect);
                Invalidate();
        } else if (buttons == B_SECONDARY_MOUSE_BUTTON) {
                _ShowPopUpMenu(ConvertToScreen(position));
@@ -1560,13 +1472,13 @@
 ShowImageView::_UpdateSelectionRect(BPoint point, bool final)
 {
        BRect oldSelection = fCopyFromRect;
-       point = _ViewToImage(point);
-       _ConstrainToImage(point);
+       point = ViewToImage(point);
+       ConstrainToImage(point);
        fCopyFromRect.left = min_c(fFirstPoint.x, point.x);
        fCopyFromRect.right = max_c(fFirstPoint.x, point.x);
        fCopyFromRect.top = min_c(fFirstPoint.y, point.y);
        fCopyFromRect.bottom = max_c(fFirstPoint.y, point.y);
-       fSelectionRect = fCopyFromRect;
+       fSelectionBox.SetBounds(this, fCopyFromRect);
 
        if (final) {
                // selection must be at least 2 pixels wide or 2 pixels tall
@@ -1578,7 +1490,7 @@
        if (oldSelection != fCopyFromRect || !fHasSelection) {
                BRect updateRect;
                updateRect = oldSelection | fCopyFromRect;
-               updateRect = _ImageToView(updateRect);
+               updateRect = ImageToView(updateRect);
                updateRect.InsetBy(-PEN_SIZE, -PEN_SIZE);
                Invalidate(updateRect);
        }
@@ -1853,7 +1765,7 @@
                                        if (message->FindRef("refs", 0, &ref) 
== B_OK) {
                                                BPoint point = 
message->DropPoint();
                                                point = 
ConvertFromScreen(point);
-                                               point = _ViewToImage(point);
+                                               point = ViewToImage(point);
                                                _SetSelection(&ref, point);
                                        }
                                } else {
@@ -1878,7 +1790,7 @@
                                                                point.y - 
(sourcePoint.y - sourceRect.top));
                                                                // adjust drop 
point before scaling is factored in
                                                        point = 
ConvertFromScreen(point);
-                                                       point = 
_ViewToImage(point);
+                                                       point = 
ViewToImage(point);
 
                                                        _PasteBitmap(bitmap, 
point);
                                                }
@@ -1969,7 +1881,7 @@
        // backup current selection
        BRect undoneSelRect;
        BBitmap *undoneSelection;
-       undoneSelRect = fSelectionRect;
+       undoneSelRect = fSelectionBox.Bounds();
        undoneSelection = _CopySelection();
 
        if (undoType == UNDO_UNDO) {
@@ -1988,7 +1900,7 @@
                _SetHasSelection(false);
        else {
                fCopyFromRect = BRect();
-               fSelectionRect = fUndo.GetRect();
+               fSelectionBox.SetBounds(this, fUndo.GetRect());
                _SetHasSelection(true);
                fSelectionBitmap = undoSelection;
        }
@@ -2036,7 +1948,7 @@
        if (!fHasSelection)
                return;
 
-       BRect rect = fSelectionRect;
+       BRect rect = fSelectionBox.Bounds();
        bool cutBackground = (fSelectionBitmap) ? false : true;
        BBitmap* selection = _CopySelection();
        BBitmap* restore = NULL;
@@ -2076,21 +1988,19 @@
        _MergeSelection();
 
        fCopyFromRect = BRect();
-       fSelectionRect = bitmap->Bounds().OffsetToCopy(B_ORIGIN);
+       BRect selectionRect = bitmap->Bounds().OffsetToCopy(B_ORIGIN);
        _SetHasSelection(true);
        delete fSelectionBitmap;
        fSelectionBitmap = bitmap;
 
-       BRect offsetRect(fSelectionRect.OffsetToCopy(point));
+       BRect offsetRect(selectionRect.OffsetToCopy(point));
        if (fBitmap->Bounds().Intersects(offsetRect)) {
                // Move the selection rectangle to desired origin,
                // but only if the resulting selection rectangle
                // intersects with the background bitmap rectangle
-               fSelectionRect = offsetRect;
+               selectionRect = offsetRect;
        }
-printf("bitmap: "); bitmap->Bounds().PrintToStream();
-printf("selection: "); fSelectionRect.PrintToStream();
-printf("point: "); point.PrintToStream();
+       fSelectionBox.SetBounds(this, selectionRect);
 
        Invalidate();
 
@@ -2131,7 +2041,7 @@
        _SetHasSelection(true);
        fCopyFromRect.Set(0, 0, fBitmap->Bounds().Width(),
                fBitmap->Bounds().Height());
-       fSelectionRect = fCopyFromRect;
+       fSelectionBox.SetBounds(this, fCopyFromRect);
        Invalidate();
 }
 
@@ -2178,7 +2088,7 @@
                        // This works with WonderBrush, though, which in turn 
had been
                        // tested with other apps.
                        data->AddMessage("image/bitmap", &bitmapArchive);
-                       data->AddPoint("be:location", fSelectionRect.LeftTop());
+                       data->AddPoint("be:location", 
fSelectionBox.Bounds().LeftTop());
 
                        delete bitmap;
 

Modified: haiku/trunk/src/apps/showimage/ShowImageView.h
===================================================================
--- haiku/trunk/src/apps/showimage/ShowImageView.h      2010-06-17 08:10:16 UTC 
(rev 37163)
+++ haiku/trunk/src/apps/showimage/ShowImageView.h      2010-06-17 08:52:47 UTC 
(rev 37164)
@@ -16,6 +16,7 @@
 
 
 #include "Filter.h"
+#include "SelectionBox.h"
 #include "ShowImageUndo.h"
 
 #include <Bitmap.h>
@@ -64,6 +65,12 @@
                        status_t                        SetImage(const 
entry_ref* ref);
                        const entry_ref*        Image() const { return 
&fCurrentRef; }
 
+                       BPoint                          ImageToView(BPoint p) 
const;
+                       BPoint                          ViewToImage(BPoint p) 
const;
+                       BRect                           ImageToView(BRect r) 
const;
+                       void                            
ConstrainToImage(BPoint& point) const;
+                       void                            ConstrainToImage(BRect& 
rect) const;
+
                        void                            SaveToFile(BDirectory* 
dir, const char* name,
                                                                        
BBitmap* bitmap,
                                                                        const 
translation_format* format);
@@ -141,8 +148,6 @@
                                kNumberOfOrientations,
                        };
 
-                       void                            _InitPatterns();
-                       void                            _RotatePatterns();
                        void                            _RemoveSelection(bool 
bToClipboard,
                                                                        bool 
neverCutBackground = false);
                        void                            _SetHasSelection(bool 
bHasSelection);
@@ -183,9 +188,6 @@
                                                                        bool 
quiet = false);
                        BRect                           _AlignBitmap();
                        void                            _Setup(BRect r);
-                       BPoint                          _ImageToView(BPoint p) 
const;
-                       BPoint                          _ViewToImage(BPoint p) 
const;
-                       BRect                           _ImageToView(BRect r) 
const;
                        bool                            _IsImage(const 
entry_ref* pref);
        static  int                                     _CompareEntries(const 
void* a, const void* b);
                        void                            _FreeEntries(BList* 
entries);
@@ -195,8 +197,6 @@
                                                                        bool 
rewind);
                        bool                            _ShowNextImage(bool 
next, bool rewind);
                        bool                            _FirstFile();
-                       void                            
_ConstrainToImage(BPoint& point);
-                       void                            
_ConstrainToImage(BRect& rect);
                        BBitmap*                        _CopyFromRect(BRect 
srcRect);
                        BBitmap*                        _CopySelection(uchar 
alpha = 255,
                                                                        bool 
imageSize = true);
@@ -218,7 +218,6 @@
                                                                        BRect& 
background);
                        void                            _DrawCaption();
                        void                            _UpdateCaption();
-                       void                            _DrawSelectionBox();
 
                        Scaler*                         _GetScaler(BRect rect);
                        void                            _DrawImage(BRect rect);
@@ -272,16 +271,11 @@
                                // first point in image space of selection
                        bool                            fAnimateSelection;
                        bool                            fHasSelection;
-                       BRect                           fSelectionRect;
+                       SelectionBox            fSelectionBox;
                        BRect                           fCopyFromRect;
                                // the portion of the background bitmap the 
selection is made
                                // from
 
-                       pattern                         fPatternUp;
-                       pattern                         fPatternDown;
-                       pattern                         fPatternLeft;
-                       pattern                         fPatternRight;
-       
                        bool                            fSlideShow;
                        int                                     fSlideShowDelay;
                                // in pulse rate units


Other related posts:

  • » [haiku-commits] r37164 - haiku/trunk/src/apps/showimage - superstippi