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