1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_BASEBMP_SCALEIMAGE_HXX
21 #define INCLUDED_BASEBMP_SCALEIMAGE_HXX
23 #include <osl/diagnose.h>
25 #include <vigra/tuple.hxx>
26 #include <vigra/copyimage.hxx>
27 #include <vigra/basicimage.hxx>
28 #include <vigra/iteratortraits.hxx>
33 template< class SourceIter
, class SourceAcc
,
34 class DestIter
, class DestAcc
>
35 void scaleLine( SourceIter s_begin
,
42 const int src_width
= s_end
- s_begin
;
43 const int dest_width
= d_end
- d_begin
;
45 OSL_ASSERT( src_width
> 0 && dest_width
> 0 );
47 if( src_width
>= dest_width
)
51 while( s_begin
!= s_end
)
55 d_acc
.set( s_acc(s_begin
), d_begin
);
68 int rem
= -dest_width
;
69 while( d_begin
!= d_end
)
77 d_acc
.set( s_acc(s_begin
), d_begin
);
85 /** Scale an image using zero order interpolation (pixel replication)
87 Source and destination range must be at least one pixel wide and
91 Start iterator for source image
94 End iterator for source image
100 Start iterator for destination image
103 End iterator for destination image
109 When true, scaleImage always copies source, even when doing 1:1
112 template< class SourceIter
, class SourceAcc
,
113 class DestIter
, class DestAcc
>
114 void scaleImage( SourceIter s_begin
,
120 bool bMustCopy
=false )
122 const int src_width ( s_end
.x
- s_begin
.x
);
123 const int src_height( s_end
.y
- s_begin
.y
);
125 const int dest_width ( d_end
.x
- d_begin
.x
);
126 const int dest_height( d_end
.y
- d_begin
.y
);
129 src_width
== dest_width
&&
130 src_height
== dest_height
)
132 // no scaling involved, can simply copy
133 vigra::copyImage( s_begin
, s_end
, s_acc
,
138 typedef vigra::BasicImage
<typename
SourceAcc::value_type
> TmpImage
;
139 typedef typename
TmpImage::traverser TmpImageIter
;
141 TmpImage
tmp_image(src_width
,
143 TmpImageIter t_begin
= tmp_image
.upperLeft();
145 // scale in y direction
146 for( int x
=0; x
<src_width
; ++x
, ++s_begin
.x
, ++t_begin
.x
)
148 typename
SourceIter::column_iterator s_cbegin
= s_begin
.columnIterator();
149 typename
TmpImageIter::column_iterator t_cbegin
= t_begin
.columnIterator();
151 scaleLine(s_cbegin
, s_cbegin
+src_height
, s_acc
,
152 t_cbegin
, t_cbegin
+dest_height
, tmp_image
.accessor());
155 t_begin
= tmp_image
.upperLeft();
157 // scale in x direction
158 for( int y
=0; y
<dest_height
; ++y
, ++d_begin
.y
, ++t_begin
.y
)
160 typename
DestIter::row_iterator d_rbegin
= d_begin
.rowIterator();
161 typename
TmpImageIter::row_iterator t_rbegin
= t_begin
.rowIterator();
163 scaleLine(t_rbegin
, t_rbegin
+src_width
, tmp_image
.accessor(),
164 d_rbegin
, d_rbegin
+dest_width
, d_acc
);
168 /** Scale an image, range tuple version
171 When true, scaleImage always copies source, even when doing 1:1
174 template< class SourceIter
, class SourceAcc
,
175 class DestIter
, class DestAcc
>
176 inline void scaleImage( vigra::triple
<SourceIter
,SourceIter
,SourceAcc
> const& src
,
177 vigra::triple
<DestIter
,DestIter
,DestAcc
> const& dst
,
178 bool bMustCopy
=false )
180 scaleImage(src
.first
,src
.second
,src
.third
,
181 dst
.first
,dst
.second
,dst
.third
,
187 #endif /* INCLUDED_BASEBMP_SCALEIMAGE_HXX */
189 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */