32#include "kis_canvas_controller.h"
33#include "kis_birdeye_box.h"
34#include "kis_double_widget.h"
35#include "kis_canvas.h"
38#include "kis_iterators_pixel.h"
40#include "kobirdeyepanel.h"
44 class CanvasAdapter :
public KoCanvasAdapter {
47 CanvasAdapter(KisCanvasSubject * canvasSubject) : KoCanvasAdapter(), m_canvasSubject(canvasSubject) {}
48 virtual ~CanvasAdapter() {}
52 virtual KoRect visibleArea()
54 if (!m_canvasSubject->currentImg())
return KoRect(0,0,0,0);
56 KisCanvasController * c = m_canvasSubject->canvasController();
61 return KoRect(0,0,0,0);
64 virtual double zoomFactor()
66 return m_canvasSubject->zoomFactor();
71 if (!m_canvasSubject->currentImg())
return TQRect(0,0,0,0);
73 return TQRect(0, 0, m_canvasSubject->currentImg()->width(), m_canvasSubject->currentImg()->height());
76 virtual void setViewCenterPoint(
double x,
double y)
78 m_canvasSubject->canvasController()->zoomAroundPoint(x, y, m_canvasSubject->zoomFactor());
83 KisCanvasSubject * m_canvasSubject;
91 ZoomListener(KisCanvasController * canvasController)
93 , m_canvasController(canvasController) {}
94 virtual ~ZoomListener() {}
98 void zoomTo(
double x,
double y,
double factor ) { m_canvasController->zoomAroundPoint(x, y, factor); }
99 void zoomIn() { m_canvasController->zoomIn(); }
100 void zoomOut() { m_canvasController->zoomOut(); }
101 double getMinZoom() {
return (1.0 / 500); }
102 double getMaxZoom() {
return 16.0; }
106 KisCanvasController * m_canvasController;
110 class ThumbnailProvider :
public KoThumbnailAdapter {
113 ThumbnailProvider(KisImageSP image, KisCanvasSubject* canvasSubject)
114 : KoThumbnailAdapter()
116 , m_canvasSubject(canvasSubject) {}
118 virtual ~ThumbnailProvider() {}
122 virtual TQSize pixelSize()
124 if (!m_image)
return TQSize(0, 0);
125 return TQSize(m_image->width(), m_image->height());
128 virtual TQImage image(TQRect r, TQSize thumbnailSize)
130 if (!m_image || r.isEmpty() || thumbnailSize.width() == 0 || thumbnailSize.height() == 0) {
134 KisPaintDevice thumbnailRect(m_image->colorSpace(),
"thumbnailRect");
135 KisPaintDeviceSP mergedImage = m_image->projection();
137 TQ_INT32 imageWidth = m_image->width();
138 TQ_INT32 imageHeight = m_image->height();
139 TQ_UINT32 pixelSize = m_image->colorSpace()->pixelSize();
141 for (TQ_INT32 y = 0; y < r.height(); ++y) {
143 KisHLineIteratorPixel it = thumbnailRect.createHLineIterator(0, y, r.width(),
true);
144 TQ_INT32 thumbnailY = r.y() + y;
145 TQ_INT32 thumbnailX = r.x();
146 TQ_INT32 imageY = (thumbnailY * imageHeight) / thumbnailSize.height();
147 KisHLineIteratorPixel srcIt = mergedImage -> createHLineIterator(0, imageY, imageWidth,
false);
149 while (!it.isDone()) {
151 TQ_INT32 imageX = (thumbnailX * imageWidth) / thumbnailSize.width();
152 TQ_INT32 dx = imageX - srcIt.x();
156 memcpy(it.rawData(), srcIt.rawData(), pixelSize);
163 return thumbnailRect.convertToTQImage(m_canvasSubject->monitorProfile(), 0, 0, r.width(), r.height(),
164 m_canvasSubject->HDRExposure());
167 void setImage(KisImageSP image)
174 KisCanvasSubject * m_canvasSubject;
180KisBirdEyeBox::KisBirdEyeBox(KisView * view, TQWidget* parent,
const char* name)
181 : TQWidget(parent, name)
183 , m_subject(view->canvasSubject())
185 TQVBoxLayout * l =
new TQVBoxLayout(
this);
187 m_image = m_subject->currentImg();
189 m_zoomAdapter =
new ZoomListener(m_subject->canvasController());
190 KoThumbnailAdapter * ktp =
new ThumbnailProvider(m_image, m_subject);
191 KoCanvasAdapter * kpc =
new CanvasAdapter(m_subject);
193 m_birdEyePanel =
new KoBirdEyePanel(m_zoomAdapter, ktp, kpc,
this);
195 connect(view, TQ_SIGNAL(cursorPosition( TQ_INT32, TQ_INT32 )), m_birdEyePanel, TQ_SLOT(cursorPosChanged( TQ_INT32, TQ_INT32 )));
196 connect(view, TQ_SIGNAL(viewTransformationsChanged()), m_birdEyePanel, TQ_SLOT(slotViewTransformationChanged()));
198 l->addWidget(m_birdEyePanel);
200 TQHBoxLayout * hl =
new TQHBoxLayout(l);
202 m_exposureLabel =
new TQLabel(i18n(
"Exposure:"),
this);
203 hl->addWidget(m_exposureLabel);
205 m_exposureDoubleWidget =
new KisDoubleWidget(-10, 10,
this);
206 m_exposureDoubleWidget->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Fixed);
207 hl->addWidget(m_exposureDoubleWidget);
208 TQToolTip::add(m_exposureDoubleWidget, i18n(
"Select the exposure (stops) for HDR images"));
209 l->addItem(
new TQSpacerItem(0, 1, TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding));
211 m_exposureDoubleWidget->setPrecision(1);
212 m_exposureDoubleWidget->setValue(0);
213 m_exposureDoubleWidget->setLineStep(0.1);
214 m_exposureDoubleWidget->setPageStep(1);
216 connect(m_exposureDoubleWidget, TQ_SIGNAL(valueChanged(
double)), TQ_SLOT(exposureValueChanged(
double)));
217 connect(m_exposureDoubleWidget, TQ_SIGNAL(sliderPressed()), TQ_SLOT(exposureSliderPressed()));
218 connect(m_exposureDoubleWidget, TQ_SIGNAL(sliderReleased()), TQ_SLOT(exposureSliderReleased()));
220 m_draggingExposureSlider =
false;
222 Q_ASSERT(m_subject->document() != 0);
223 connect(m_subject->document(), TQ_SIGNAL(sigCommandExecuted()), TQ_SLOT(slotDocCommandExecuted()));
226 connect(m_image, TQ_SIGNAL(sigImageUpdated(TQRect)), TQ_SLOT(slotImageUpdated(TQRect)));
230KisBirdEyeBox::~KisBirdEyeBox()
236void KisBirdEyeBox::setImage(KisImageSP image)
239 m_image->disconnect(
this);
244 KoThumbnailAdapter * ktp =
new ThumbnailProvider(m_image, m_subject);
245 m_birdEyePanel->setThumbnailProvider(ktp);
248 connect(m_image, TQ_SIGNAL(sigImageUpdated(TQRect)), TQ_SLOT(slotImageUpdated(TQRect)));
249 connect(m_image, TQ_SIGNAL(sigSizeChanged(TQ_INT32, TQ_INT32)), TQ_SLOT(slotImageSizeChanged(TQ_INT32, TQ_INT32)));
250 connect(m_image, TQ_SIGNAL(sigColorSpaceChanged(KisColorSpace *)), TQ_SLOT(slotImageColorSpaceChanged(KisColorSpace *)));
251 m_birdEyePanel->slotUpdate(m_image->bounds());
252 slotImageColorSpaceChanged(m_image->colorSpace());
256void KisBirdEyeBox::slotDocCommandExecuted()
259 if (!m_dirtyRect.isEmpty()) {
260 m_birdEyePanel->slotUpdate(m_dirtyRect);
262 m_dirtyRect = TQRect();
266void KisBirdEyeBox::slotImageUpdated(TQRect r)
271void KisBirdEyeBox::slotImageSizeChanged(TQ_INT32 , TQ_INT32 )
274 m_birdEyePanel->slotUpdate(m_image->bounds());
278void KisBirdEyeBox::slotImageColorSpaceChanged(
KisColorSpace *cs)
281 m_exposureDoubleWidget->show();
282 m_exposureLabel->show();
284 m_exposureDoubleWidget->hide();
285 m_exposureLabel->hide();
289void KisBirdEyeBox::exposureValueChanged(
double exposure)
291 if (!m_draggingExposureSlider) {
292 m_subject->setHDRExposure(exposure);
294 if (m_image && m_image->colorSpace()->hasHighDynamicRange()) {
295 m_birdEyePanel->slotUpdate(m_image->bounds());
300void KisBirdEyeBox::exposureSliderPressed()
302 m_draggingExposureSlider =
true;
305void KisBirdEyeBox::exposureSliderReleased()
307 m_draggingExposureSlider =
false;
308 exposureValueChanged(m_exposureDoubleWidget->value());
311#include "kis_birdeye_box.moc"
virtual TQPoint viewToWindow(const TQPoint &pt)=0
Conversion functions from view coordinates to image coordinates.
virtual KisCanvas * kiscanvas() const =0
A colorspace is the definition of a certain color model in Chalk.
virtual bool hasHighDynamicRange() const =0
Returns true if the colorspace supports channel values outside the (normalised) range 0 to 1.
A complex widget that provides an overview of a document with a red panning rectangle to and a zoom s...
The zoom listener interface defines methods that the bird eye panel will call whenever the zoomlevel ...