1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/epoc32/include/imageprocessor/imageprocessor.h Wed Mar 31 12:27:01 2010 +0100
1.3 @@ -0,0 +1,526 @@
1.4 +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#ifndef ___IMAGEPROCESSOR_H__
1.20 +#define ___IMAGEPROCESSOR_H__
1.21 +
1.22 +#include <gdi.h>
1.23 +#include <fbs.h>
1.24 +
1.25 +/**
1.26 +@internalTechnology
1.27 +*/
1.28 +enum TImageBitmapUtilPanic
1.29 + {
1.30 + ECorrupt
1.31 + };
1.32 +
1.33 +/**
1.34 +@publishedAll
1.35 +@released
1.36 +
1.37 +Interface to colour conversion classes for various display modes.
1.38 +Manages the mapping between RGB/Greyscale values and the index
1.39 +into the color palette for the given display mode.
1.40 +*/
1.41 +class TColorConvertor
1.42 + {
1.43 +public:
1.44 + IMPORT_C static TColorConvertor* NewL(TDisplayMode aDisplayMode);
1.45 +
1.46 + /**
1.47 + Returns the colour index corresponding to the supplied RGB value.
1.48 + Operates in the context of the current display mode.
1.49 +
1.50 + This is a virtual function that each derived class must implement.
1.51 +
1.52 + @param aColor
1.53 + The colour in RGB format.
1.54 +
1.55 + @return The colour index.
1.56 + */
1.57 + virtual TInt ColorIndex(TRgb aColor) const = 0;
1.58 +
1.59 + /**
1.60 + Returns the RGB value corresponding to the supplied colour index.
1.61 + Operates in the context of the current display mode.
1.62 +
1.63 + This is a virtual function that each derived class must implement.
1.64 +
1.65 + @param aColorIndex
1.66 + The colour in RGB format.
1.67 +
1.68 + @return The RGB value.
1.69 + */
1.70 + virtual TRgb Color(TInt aColorIndex) const = 0;
1.71 +
1.72 + /**
1.73 + Gets an array of colour indices from a corresponding array of RGB values.
1.74 + Operates in the context of the current display mode.
1.75 +
1.76 + This is a virtual function that each derived class must implement.
1.77 +
1.78 + @param aIndexBuffer
1.79 + A pointer to the first element in destination array.
1.80 + @param aColorBuffer
1.81 + A pointer to the first element in the source array.
1.82 + @param aCount
1.83 + The number of elements to get.
1.84 + */
1.85 + virtual void ColorToIndex(TInt* aIndexBuffer,TRgb* aColorBuffer,TInt aCount) const = 0;
1.86 +
1.87 + inline static TInt RgbToMonochrome(TRgb aRgb);
1.88 + };
1.89 +
1.90 +
1.91 +/**
1.92 +@publishedAll
1.93 +@released
1.94 +
1.95 +Bitmap utility class.
1.96 +*/
1.97 +class TImageBitmapUtil
1.98 + {
1.99 +public:
1.100 + IMPORT_C TImageBitmapUtil();
1.101 + IMPORT_C void Begin();
1.102 + IMPORT_C TBool Begin(const TPoint& aPosition);
1.103 + IMPORT_C void End();
1.104 + IMPORT_C void SetBitmapL(CFbsBitmap* aBitmap);
1.105 + IMPORT_C void SetPixel(TUint32 aPixelIndex);
1.106 + IMPORT_C void SetPixels(TUint32* aPixelIndex,TInt aNumberOfPixels);
1.107 + IMPORT_C TBool SetPos(const TPoint& aPosition);
1.108 +
1.109 +private:
1.110 + union TDataPointer
1.111 + {
1.112 + TUint32* iWordPos;
1.113 + TUint8* iBytePos;
1.114 + };
1.115 +private:
1.116 + CFbsBitmap* iBitmap;
1.117 + TSize iSize;
1.118 + TPoint iPosition;
1.119 + TDataPointer iData;
1.120 + TDataPointer iBase;
1.121 + TInt iBpp;
1.122 + TInt iBppShift;
1.123 + TInt iPixelShift;
1.124 + TInt iPixelsPerWord;
1.125 + TInt iBitShift;
1.126 + TInt iScanlineWordLength;
1.127 + TUint32 iMask;
1.128 + TBool iWordAccess;
1.129 + };
1.130 +
1.131 +
1.132 +class CImageProcessor;
1.133 +class CImageProcessorExtension;
1.134 +
1.135 +/**
1.136 +@publishedAll
1.137 +@released
1.138 +
1.139 +Utility class providing static factory functions for creating instances of
1.140 +CImageProcessor derived classes.
1.141 +*/
1.142 +class ImageProcessorUtility
1.143 + {
1.144 +public:
1.145 + IMPORT_C static TInt ReductionFactor(const TSize& aOriginalSize,const TSize& aReducedSize);
1.146 + IMPORT_C static CImageProcessor* NewImageProcessorL(const CFbsBitmap& aBitmap,const TSize& aImageSize,TDisplayMode aImageDisplayMode, TBool aDisableErrorDiffusion);
1.147 + IMPORT_C static CImageProcessor* NewImageProcessorL(const CFbsBitmap& aBitmap,TInt aReductionFactor,TDisplayMode aImageDisplayMode, TBool aDisableErrorDiffusion);
1.148 + IMPORT_C static CImageProcessorExtension* ImageProcessorUtility::NewImageProcessorExtensionL(const CFbsBitmap& aBitmap,TInt aReductionFactor,TDisplayMode aImageDisplayMode, TBool aDisableErrorDiffusion);
1.149 +
1.150 +private:
1.151 + TBool static UseErrorDiffuser(const TDisplayMode& aBitmapDisplayMode, const TDisplayMode& aImageDisplayMode);
1.152 + TBool static IsMonochrome(const TDisplayMode& aBitmapDisplayMode, const TDisplayMode& aImageDisplayMode);
1.153 + };
1.154 +
1.155 +
1.156 +
1.157 +/**
1.158 +@publishedAll
1.159 +@released
1.160 +
1.161 +Interface to image processing classes.
1.162 +*/
1.163 +class CImageProcessor : public CBase
1.164 + {
1.165 +public:
1.166 + // Setup
1.167 +
1.168 + /**
1.169 + Initialises internal data structures prior to conversion.
1.170 +
1.171 + This is a virtual function that each derived class must implement.
1.172 +
1.173 + @param aBitmap
1.174 + A reference to a fully constucted bitmap with the required
1.175 + display mode and size.
1.176 + @param aImageRect
1.177 + The region of the image to convert.
1.178 + */
1.179 + virtual void PrepareL(CFbsBitmap& aBitmap,const TRect& aImageRect) = 0;
1.180 +
1.181 + /**
1.182 + Initialises internal data structures prior to the manipulation of the specified pixel block.
1.183 +
1.184 + This overloaded version allows specification of a block size
1.185 + for those formats which support blocked pixel data eg. JPEG
1.186 +
1.187 + This is a virtual function that each derived class must implement.
1.188 +
1.189 + @param aBitmap
1.190 + A reference to a fully constucted bitmap with the required
1.191 + display mode and size.
1.192 + @param aImageRect
1.193 + The region of the image to convert.
1.194 + @param aRgbBlockSize
1.195 + The size of the block to use.
1.196 + */
1.197 + virtual void PrepareL(CFbsBitmap& aBitmap,const TRect& aImageRect,const TSize& aRgbBlockSize) = 0;
1.198 +
1.199 + /**
1.200 + Sets the number of pixels by which to increment the current position in
1.201 + the Y-axis. This is used when rendering images supporting interlacing.
1.202 + eg GIF
1.203 +
1.204 + This is a virtual function that each derived class must implement.
1.205 +
1.206 + @param aYInc
1.207 + The number of pixels.
1.208 + */
1.209 + virtual void SetYPosIncrement(TInt aYInc) = 0;
1.210 +
1.211 + /**
1.212 + Sets the number times the current line should be repeated. The lines
1.213 + are repeated in the same direction as set by SetYPosIncrement(). This
1.214 + is used to fill blank lines when rendering interlaced images. eg GIF.
1.215 + @param aLineRepeat The number of times the current line should be repeated
1.216 + */
1.217 + virtual void SetLineRepeat(TInt aLineRepeat) = 0;
1.218 +
1.219 + /**
1.220 + Sets the pixel padding to the value specified by aNumberOfPixels.
1.221 +
1.222 + This is a virtual function that each derived class must implement.
1.223 +
1.224 + @param aNumberOfPixels
1.225 + The number of pixels to use for padding.
1.226 + */
1.227 + virtual void SetPixelPadding(TInt aNumberOfPixels) = 0;
1.228 +
1.229 + // Color pixel writing
1.230 +
1.231 + /**
1.232 + Sets the pixel at the current position to aColor.
1.233 +
1.234 + This is a virtual function that each derived class must implement.
1.235 +
1.236 + @post
1.237 + The current position is updated.
1.238 +
1.239 + @param aColor
1.240 + The RGB value to set the current pixel to.
1.241 +
1.242 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.243 + otherwise EFalse.
1.244 + */
1.245 + virtual TBool SetPixel(TRgb aColor) = 0;
1.246 +
1.247 + /**
1.248 + Sets aCount number of pixels to the value given by aColor, starting at
1.249 + the current position.
1.250 +
1.251 + This is a virtual function that each derived class must implement.
1.252 +
1.253 + @post
1.254 + On success, the current position is updated.
1.255 +
1.256 + @param aColor
1.257 + The RGB value to set the pixels to.
1.258 + @param aCount
1.259 + The number of pixels to set.
1.260 +
1.261 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.262 + otherwise EFalse.
1.263 + */
1.264 + virtual TBool SetPixelRun(TRgb aColor,TInt aCount) = 0;
1.265 +
1.266 + /**
1.267 + Updates the bitmap with colour information from the array of colour values.
1.268 +
1.269 + Uses the array of colour values supplied by aColorBuffer, whose length
1.270 + is specified by aBufferLength, to update successive pixels with values in the
1.271 + buffer, starting at the current position.
1.272 +
1.273 + This is a virtual function that each derived class must implement.
1.274 +
1.275 + @post
1.276 + The current position is updated.
1.277 +
1.278 + @param aColorBuffer
1.279 + A pointer to the first element in the array.
1.280 + @param aBufferLength
1.281 + The number of elements in the array.
1.282 +
1.283 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.284 + otherwise EFalse.
1.285 + */
1.286 + virtual TBool SetPixels(TRgb* aColorBuffer,TInt aBufferLength) = 0;
1.287 +
1.288 + /**
1.289 + Sets the current pixel block using the data supplied in aColorBuffer.
1.290 +
1.291 + Note:
1.292 + For use with image types that support blocking of pixels eg JPEG.
1.293 +
1.294 + This is a virtual function that each derived class must implement.
1.295 +
1.296 + @param aColorBuffer
1.297 + A pointer to a buffer representing a block of pixel color values.
1.298 +
1.299 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.300 + otherwise EFalse.
1.301 + */
1.302 + virtual TBool SetPixelBlock(TRgb* aColorBuffer) = 0;
1.303 +
1.304 + // Monochrome pixel writing
1.305 +
1.306 + /**
1.307 + Sets the pixel at the current position to aGray256.
1.308 +
1.309 + This is a virtual function that each derived class must implement.
1.310 +
1.311 + @post
1.312 + The current position is updated.
1.313 +
1.314 + @param aGray256
1.315 + The greyscale value to set the current pixel to.
1.316 +
1.317 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.318 + otherwise EFalse.
1.319 + */
1.320 + virtual TBool SetMonoPixel(TInt aGray256) = 0;
1.321 +
1.322 + /**
1.323 + Sets the number of pixels specified by aCount to the value given by aGray256, starting at
1.324 + the current position.
1.325 +
1.326 + This is a virtual function that each derived class must implement.
1.327 +
1.328 + @post
1.329 + The current position is updated.
1.330 +
1.331 + @param aGray256
1.332 + The greyscale value to set the pixels to.
1.333 + @param aCount
1.334 + The number of pixels to set.
1.335 +
1.336 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.337 + otherwise EFalse.
1.338 + */
1.339 + virtual TBool SetMonoPixelRun(TInt aGray256,TInt aCount) = 0;
1.340 +
1.341 + /**
1.342 + Updates the bitmap with greyscale information from the array of greyscale values.
1.343 +
1.344 + The array of values supplied by aGray256Buffer, whose length
1.345 + is specified in aBufferLength, is used to update successive pixels with the
1.346 + greyscales values.
1.347 +
1.348 + This is a virtual function that each derived class must implement.
1.349 +
1.350 + @post
1.351 + The current position is updated.
1.352 +
1.353 + @param aGray256Buffer
1.354 + A pointer to the first element in the array of greyscale values.
1.355 + @param aBufferLength
1.356 + The number of elements in the array.
1.357 +
1.358 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.359 + otherwise EFalse.
1.360 + */
1.361 + virtual TBool SetMonoPixels(TUint32* aGray256Buffer,TInt aBufferLength) = 0;
1.362 +
1.363 + /**
1.364 + Sets a specified number of pixels to the specified greyscale value.
1.365 +
1.366 + For image types which support blocking of pixels eg JPEG, the current
1.367 + pixel block is set using the data supplied in aGray256Buffer.
1.368 +
1.369 + This is a virtual function that each derived class must implement.
1.370 +
1.371 + @param aGray256Buffer
1.372 + A pointer to a buffer representing a block of pixel color values.
1.373 +
1.374 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.375 + otherwise EFalse.
1.376 + */
1.377 + virtual TBool SetMonoPixelBlock(TUint32* aGray256Buffer) = 0;
1.378 +
1.379 + // Processor flow control
1.380 +
1.381 + /**
1.382 + Sets the current position in the bitmap to aPosition.
1.383 +
1.384 + This is a virtual function that each derived class must implement.
1.385 +
1.386 + @param aPosition
1.387 + A reference to TPoint object defining the position to move to.
1.388 +
1.389 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.390 + otherwise EFalse.
1.391 + */
1.392 + virtual TBool SetPos(const TPoint& aPosition) = 0;
1.393 +
1.394 + /**
1.395 + Commits the changes made to the current bitmap by flushing the buffer.
1.396 +
1.397 + This is a virtual function that each derived class must implement.
1.398 +
1.399 + @post
1.400 + The current position is updated.
1.401 +
1.402 + @return A boolean indicating if the operation was successful. ETrue if the operation succeeded,
1.403 + otherwise EFalse.
1.404 + */
1.405 + virtual TBool FlushPixels() = 0;
1.406 +
1.407 +private:
1.408 + // Future proofing
1.409 + IMPORT_C virtual void ReservedVirtual1();
1.410 + IMPORT_C virtual void ReservedVirtual2();
1.411 + IMPORT_C virtual void ReservedVirtual3();
1.412 + IMPORT_C virtual void ReservedVirtual4();
1.413 + };
1.414 +
1.415 +/**
1.416 +@publishedAll
1.417 +@released
1.418 +
1.419 +Flag used to determine the type of transformation which is the result of
1.420 +single or multiple transformation operations requested via calls to
1.421 +COperationExtension::AddOperationL.
1.422 +
1.423 +8 unique orientations:
1.424 +
1.425 +@code
1.426 +normal 90 180 270
1.427 +00 10 01 00 11 01 10 11
1.428 +01 11 11 10 10 00 00 01
1.429 +
1.430 +V flip 90 180 270
1.431 +10 00 11 10 =Hflip =Hflip+90
1.432 +11 01 01 00
1.433 +
1.434 +H flip 90 180 270
1.435 +01 11 00 01 =Vflip =Vflip+90
1.436 +00 10 10 11
1.437 +@endcode
1.438 +
1.439 +@see COperationExtension::AddOperationL
1.440 +*/
1.441 +enum TTransformOptions
1.442 + {
1.443 + /** Normal Decode
1.444 + */
1.445 + EDecodeNormal = 0x11011000,
1.446 +
1.447 + /** Rotate 90 degrees.
1.448 + */
1.449 + EDecodeRotate90 = 0x10110001,
1.450 +
1.451 + /** Rotate 180 degrees.
1.452 + */
1.453 + EDecodeRotate180 = 0x00100111,
1.454 +
1.455 + /** Rotate 270 degrees.
1.456 + */
1.457 + EDecodeRotate270 = 0x01001110,
1.458 +
1.459 + /** Horizontal flip.
1.460 + */
1.461 + EDecodeHorizontalFlip = 0x10001101,
1.462 +
1.463 + /** Horizontal flip and rotate 90 degrees.
1.464 + */
1.465 + EDecodeHorizontalFlipRotate90 = 0x11100100,
1.466 +
1.467 + /** Vertical flip.
1.468 + */
1.469 + EDecodeVerticalFlip = 0x01110010,
1.470 +
1.471 + /** Vertical flip and rotate 90 degrees.
1.472 + */
1.473 + EDecodeVerticalFlipRotate90 = 0x00011011
1.474 + };
1.475 +
1.476 +
1.477 +/**
1.478 +@publishedAll
1.479 +@released
1.480 +
1.481 +Class that provides support for Framework Extensions.
1.482 +
1.483 +@see CImageProcessor
1.484 +@see CImageReadCodec
1.485 +@see CImageDecoderPlugin
1.486 +*/
1.487 +class CImageProcessorExtension : public CImageProcessor
1.488 + {
1.489 +public:
1.490 + IMPORT_C virtual ~CImageProcessorExtension();
1.491 + IMPORT_C void SetClippingRect(const TRect& aRect);
1.492 + IMPORT_C void SetScaling(TInt aScalingCoeff);
1.493 + IMPORT_C void SetScaling(const TSize& aDesiredSize);
1.494 + IMPORT_C void SetOperation(TTransformOptions aOperation);
1.495 + IMPORT_C void SetInitialScanlineSkipPadding(TInt aNumberOfScanlines);
1.496 +
1.497 +protected:
1.498 + IMPORT_C CImageProcessorExtension();
1.499 +
1.500 +protected:
1.501 + /** Clipping rectangle */
1.502 + TRect iClippingRect;
1.503 + /** Scaling coefficient */
1.504 + TInt iScalingCoeff;
1.505 + /** Desired size after scaling */
1.506 + TSize iDesiredSize;
1.507 + /** Operations to apply to image */
1.508 + TTransformOptions iOperation;
1.509 + /** Position in destination at which start rendering */
1.510 + TPoint iStartPosition;
1.511 + /** Position in destination at which rendering is complete */
1.512 + TPoint iEndPosition;
1.513 + /** An initial one-off number of scanlines to be skipped */
1.514 + TInt iNumberOfScanlinesToSkip;
1.515 + };
1.516 +
1.517 +inline TInt TColorConvertor::RgbToMonochrome(TRgb aRgb)
1.518 + {
1.519 + TInt value = aRgb.Internal();
1.520 + TInt r = value&0xFF0000;
1.521 + TInt g = value&0xFF00;
1.522 + value = (value&0xFF)<<16; // blue<<16
1.523 + value += r<<1; // + (red<<16)*2
1.524 + value += g<<(16+2-8); // + (green<<16)*4
1.525 + value += g<<(16+0-8); // + (green<<16)
1.526 + return value>>(16+3); // total/8
1.527 + }
1.528 +
1.529 +#endif //___IMAGEPROCESSOR_H__