--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/inc/swtimage.h Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,498 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia Corporation - S60 implementation
+ *******************************************************************************/
+// SwtImage.h
+
+
+#ifndef SWTIMAGE_H
+#define SWTIMAGE_H
+
+
+#include "eswtgraphics.h"
+
+
+class CSwtGrPaletteData;
+
+
+/**
+ * CSwtImage
+ * C++ implementation of org.eclipse.swt.graphics.Image.
+ * Due to lack of support for paletted modes in CFbsBitmap ( the API exists
+ * but is empty implemented ), colour images of bit depths 1, 2, 4 and 8 are
+ * converted to 24 bits per pixel. This, however, does not affect grayscale
+ * images.
+ * @lib eswt
+ */
+NONSHARABLE_CLASS(CSwtImage)
+ : public CBase
+ , public MSwtImage
+ , public MSwtResourceChangeObserver
+{
+// Data types
+private:
+ enum TMaskType
+ {
+ ENoMask = 0, // No transparency
+ EBinaryMask, // Binary transparency
+ EColorKey, // Colour key: a colour is considered transparent.
+ EDirtyColorKey, // Same as EColorKey but the mask needs to be regenerated
+ EAlphaMask // Alpha transparency
+ };
+
+// Own methods
+public:
+ /**
+ * Two phase constructor.
+ * @param aDevice graphic device
+ * @param aSize initial image dimensions
+ * @param aDisplay parent display
+ * @param aMode display mode
+ * @return pointer to blank image
+ */
+ static CSwtImage* NewL(MSwtDevice& aDevice, const TSize& aSize,
+ MSwtDisplay& aDisplay, TDisplayMode aMode = ENone);
+
+ /**
+ * Two phase constructor.
+ * @param aDevice graphic device
+ * @param aData image data
+ * @param aDisplay parent display
+ * @return pointer to image constructed from image data
+ */
+ static CSwtImage* NewL(MSwtDevice* aDevice, const MSwtImageData& aData,
+ MSwtDisplay* aDisplay);
+
+ /**
+ * Two phase constructor.
+ * @param aBitmap source bitmap
+ * @param aBitmap source mask
+ * @param aTopLeft initial position
+ * @param aDelayTime frame delay
+ * @param aDisposalMethod disposal method of previous frames
+ * @return pointer to image constructed bitmap + mask
+ */
+ static CSwtImage* NewL(CFbsBitmap& aBitmap, CFbsBitmap* aMask,
+ const TPoint& aTopLeft, TInt aDelayTime, TSwtGifDisposal aDisposalMethod);
+
+private:
+ /**
+ * First phase constructor.
+ * @param aDevice graphic device
+ * @param aDisplay parent display
+ */
+ inline CSwtImage(MSwtDevice* aDevice, MSwtDisplay* aDisplay);
+
+ /**
+ * Destructor
+ */
+ ~CSwtImage();
+
+ /**
+ * Second phase constructor.
+ * @param aSize initial image dimensions
+ * @param aMode display mode
+ */
+ void ConstructL(const TSize& aSize, TDisplayMode aMode);
+
+ /**
+ * Second phase constructor.
+ * @param aData image data
+ */
+ void ConstructL(const MSwtImageData& aData);
+
+ /**
+ * Second phase constructor.
+ * @param aBitmap source bitmap
+ * @param aBitmap source mask
+ * @param aTopLeft initial position
+ * @param aDelayTime frame delay
+ * @param aDisposalMethod disposal method of previous frames
+ */
+ void ConstructL(CFbsBitmap& aBitmap, CFbsBitmap* aMask, const TPoint& aTopLeft,
+ TInt aDelayTime, TSwtGifDisposal aDisposalMethod);
+
+ /**
+ * Color key setter.
+ * @param aData image data
+ */
+ void SetColorKeyL(const MSwtImageData& aData);
+
+ /**
+ * Ensures the mask is up to date. This method, although const, may actually
+ * modify the image's mask but this will only occur if the image's content
+ * has been modified and the mask wasn't updated at that moment.
+ */
+ void EnsureMaskIsUpToDate() const;
+
+ /**
+ * Computes the binary mask from the colour key.
+ */
+ void ComputeColorKeyMask();
+
+ /**
+ * Tests whether the image is a grayscale one.
+ */
+ TBool IsGrayscale() const;
+
+ /**
+ * Creates a new palette data object for the image.
+ */
+ CSwtGrPaletteData* GetPaletteDataL() const;
+
+ /**
+ * Computes the gray mode for the provided palette.
+ * @return The gray mode suitable for the current palette or ENone if none
+ * has been found.
+ */
+ static TDisplayMode PaletteGrayMode(TInt aDepth, const CPalette& aPalette);
+
+ /**
+ * Computes the display mode of the provided data.
+ * @return The display mode, or ENone if no suitable mode could be found.
+ */
+ static TDisplayMode DisplayMode(const MSwtImageData& aData);
+
+ /**
+ * Returns the bit depth for the specified display mode.
+ */
+ static TInt BitDepth(TDisplayMode aMode);
+
+ /**
+ * Returns the image depth bpp according to the bitmap display type.
+ */
+ TInt ImageDepth() const;
+
+ /**
+ * Returns the scanline padding for the specified bit depth.
+ */
+ static TInt ScanlinePadding(TInt aBitDepth);
+
+ /**
+ * Computes the number of bytes needed in a line.
+ */
+ static TInt BytesPerLine(TInt aPixelsPerLine, TInt aBitsPerPixel,
+ TInt aPadding);
+
+ /**
+ * Fills the provided bitmap with the provided colour.
+ */
+ static void FillBitmapL(CFbsBitmap& aBitmap, const TRgb& aColor,
+ const TRect& aRect);
+
+ /**
+ * Bitblt the bitmap with another bitmap.
+ */
+ void BitBltBitmapL(CFbsBitmapDevice& aDevice, const CFbsBitmap& aBitmap);
+
+
+ /**
+ * Fills the provided bitmap with the provided colour.
+ */
+ static void FillBitmapL(CFbsBitmapDevice& aDevice, const TRgb& aColor,
+ const TRect& aRect);
+
+ /**
+ * Creates a new palette object for a given gray mode.
+ */
+ static CPalette* NewGrayPaletteL(TDisplayMode aMode);
+
+ /**
+ * Shifts an integer by a certain number of bits.
+ * @param aValue The integer whose bits are to be shifted
+ * @param aShift The number of bits to shift by; a positive value shifts
+ * to the left, a negative value shifts to the right.
+ */
+ static inline TUint BitShift(TUint aValue, TInt aShift);
+
+ /**
+ * Extracts the red component of a pixel. The result is a value in [0;255].
+ */
+ static inline TUint GetRed(TUint aPixel,
+ const MSwtPaletteData::TDirectData& aPalette);
+
+ /**
+ * Extracts the green component of a pixel. The result is a value in [0;255].
+ */
+ static inline TUint GetGreen(TUint aPixel,
+ const MSwtPaletteData::TDirectData& aPalette);
+
+ /**
+ * Extracts the blue component of a pixel. The result is a value in [0;255].
+ */
+ static inline TUint GetBlue(TUint aPixel,
+ const MSwtPaletteData::TDirectData& aPalette);
+
+ /**
+ * Extracts the RGB components of a pixel.
+ */
+ static inline TRgb GetRgb(TUint aPixel,
+ const MSwtPaletteData::TDirectData& aPalette);
+
+ /**
+ * Writes a 16-bit pixel in the Symbian format ( [rrrrrggg gggbbbbb] binary ).
+ * @param aPtr Where to write the pixel, the pointer is modified to point
+ * after the pixel upon return.
+ * @param aPixel The pixel to write
+ * @param aPalette Information about aPixel's format.
+ */
+ static inline void WritePixel16(TUint8*& aPtr, TUint aPixel,
+ const MSwtPaletteData::TDirectData& aPalette);
+
+ /**
+ * Writes a True Color pixel in the Symbian format ( BGR ).
+ * @param aPtr Where to write the pixel, the pointer is modified to point
+ * after the pixel upon return.
+ * @param aPixel The pixel to write
+ * @param aPalette Information about aPixel's format.
+ * @param a24Bit Do the write in 24- or 32-bit format
+ */
+ static inline void WritePixelTrueColor(TUint8*& aPtr, TUint aPixel,
+ const MSwtPaletteData::TDirectData& aPalette, TBool a24Bit);
+
+ /**
+ * Writes a True Color pixel in the Symbian format ( BGR ).
+ * @param aPtr Where to write the pixel, the pointer is modified to point
+ * after the pixel upon return.
+ * @param aColor The colour to write at the specified location.
+ */
+ static inline void WritePixelTrueColor(TUint8*& aPtr, const TRgb& aColor,
+ TBool a24Bit);
+
+ /**
+ * Copies data from a buffer of bytes to a bitmap.
+ */
+ static void CopyData(const CFbsBitmap& aBitmap, const TDesC8& aData,
+ TInt aLineCount, TInt aDepth, TInt aBytesPerLine,
+ const MSwtPaletteData* aPalette);
+
+ /**
+ * Add mask bitmap's alpha channel.
+ */
+ void AddMaskToAlphaChannel(const CFbsBitmap& aBitmap, const CFbsBitmap& aMask);
+
+ /**
+ * Copies data between two buffers arranged in units of 1 bit.
+ * The bits of each byte are reversed on the fly.
+ */
+ static void Copy1(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount);
+
+ /**
+ * Copies data between two buffers arranged in units of 4 bits.
+ * The four quarters of each byte are reversed on the fly.
+ */
+ static void Copy2(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount);
+
+ /**
+ * Copies data between two buffers arranged in units of 4 bits.
+ * The two halves of each byte are swapped on the fly.
+ */
+ static void Copy4(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount);
+
+ /**
+ * Copies data between two buffers arranged in units of 8 bits.
+ */
+ static void Copy8(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount);
+
+ /**
+ * Copies data between two buffers arranged in units of 16 bits.
+ * The first and last bytes of each unit are swapped on the fly to account
+ * for the fact that Symbian's and SWT's red and blue channels are inverted.
+ */
+ static void Copy16(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount,
+ const MSwtPaletteData::TDirectData& aPalette);
+
+ /**
+ * Copies data from a buffer of 1-bit paletted pixels to a buffer of
+ * 24/32-bit pixels.
+ */
+ static void Copy1ToTrueColor(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount,
+ const CPalette& aPalette, TBool a24Bit);
+
+ /**
+ * Copies data from a buffer of 2-bit paletted pixels to a buffer of
+ * 24/32-bit pixels.
+ */
+ static void Copy2ToTrueColor(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount,
+ const CPalette& aPalette, TBool a24Bit);
+
+ /**
+ * Copies data from a buffer of 4-bit paletted pixels to a buffer of
+ * 24/32-bit pixels
+ */
+ static void Copy4ToTrueColor(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount,
+ const CPalette& aPalette, TBool a24Bit);
+
+ /**
+ * Copies data from a buffer of 8-bit paletted pixels to a buffer of
+ * 24/32-bit pixels
+ */
+ static void Copy8ToTrueColor(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount,
+ const CPalette& aPalette, TBool a24Bit);
+
+ /**
+ * Copies data from a buffer of 8-bit pixels to a buffer of 24/32-bit pixels.
+ */
+ static void Copy8ToTrueColor(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount,
+ const MSwtPaletteData::TDirectData& aPalette, TBool a24Bit);
+
+ /**
+ * Copies data between two buffers arranged in units of 24 bits.
+ */
+ static void Copy24(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount,
+ const MSwtPaletteData::TDirectData& aPalette);
+
+ /**
+ * Copies data between two buffers arranged in units of 24 bits.
+ */
+ static void Copy32(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, TInt aLineCount,
+ const MSwtPaletteData::TDirectData& aPalette);
+
+ /**
+ * Returns a newly allocated buffer to the data of the specified bitmap.
+ */
+ static HBufC8* GetPixelDataLC(const CFbsBitmap& aBitmap);
+
+ /**
+ * ?
+ */
+ static void GetPixels16(TUint8* aDest, TInt aBytesPerDestLine,
+ const TUint8* aSrce, TInt aBytesPerSrceLine, const TSize& aSize);
+
+// From MSwtBitmapDrawable
+public:
+ MSwtGc* NewGcL();
+ CBitmapDevice& GraphicsDevice();
+ void HandleUpdate();
+private:
+ static void DestroyNativeGc(CBitmapContext* aGc);
+
+// From MSwtImage
+protected:
+ CFbsBitmap& GetBitmap() const;
+ CFbsBitmap& GetSubBitmap(const TSize& aSize) const;
+
+// From MSwtImage
+public:
+ void Dispose();
+ const CFbsBitmap* MaskBitmap(TBool aInvertedIfMonochrome = EFalse) const;
+ const CFbsBitmap* SubMaskBitmap(const TSize& aSize, TBool aInvertedIfMonochrome = EFalse) const;
+ TRect GetBounds() const;
+ MSwtImageData* GetImageDataL() const;
+ TInt AddSubRef(const TSize& aSize) const;
+ TInt RemoveSubRef(const TSize& aSize) const;
+ TInt SubRefCount(const TSize& aSize) const;
+ CFbsBitmap* BitmapWithAlphaLC();
+
+// From MSwtResourceChangeObserver
+public:
+ void OfferResourceChangeL(TInt aType);
+
+// Data
+private:
+ /**
+ * The device on which the image is created, may be NULL.
+ * Not own.
+ */
+ MSwtDevice* iDevice;
+
+ /**
+ * Colour data, may be owned, cannot be NULL.
+ * May be own or not own.
+ */
+ CFbsBitmap* iBitmap;
+
+ /**
+ * Device for drawing onto the bitmap, cannot be NULL.
+ * Own.
+ */
+ CFbsBitmapDevice* iBitmapDevice;
+
+ /**
+ * The type of mask we're dealing with
+ */
+ TMaskType iMaskType;
+
+ /**
+ * Transparency mask, binary ( 1 bit ) or alpha ( 8 bits ), may be NULL.
+ * May be own or not own.
+ */
+ CFbsBitmap* iMask;
+
+ /**
+ * Transparency mask inverted, binary ( 1 bit ) or alpha ( 8 bits ), may be NULL.
+ * Created only upon request.
+ * Own.
+ */
+ mutable CFbsBitmap* iMaskInverted;
+
+ /**
+ * The transparent colour, may be NULL.
+ * Own.
+ */
+ TRgb* iColorKey;
+
+ /**
+ * The coordinates the bitmap's origin is at within an animation.
+ */
+ TPoint iOffset;
+
+ /**
+ * The original image information
+ */
+ MSwtImageData::TInfo iInfo;
+
+ /**
+ * The iBitmap and iMask object have been created outside of the object.
+ * Do not delete them in the destructor.
+ */
+ TBool iOwnExternally;
+
+ /**
+ * The Display the image belongs to, may be NULL.
+ * Not own.
+ */
+ MSwtDisplay* iDisplay;
+
+ /**
+ * Array holding the reference count for scaled copies of the main bitmap.
+ */
+ mutable RArray<TInt> iScaledBitmapRefs;
+
+ /**
+ * Array holding the scaled copies of the main bitmap.
+ */
+ mutable RPointerArray<CFbsBitmap> iScaledBitmaps;
+
+ /**
+ * Array holding the scaled copies of the main mask.
+ */
+ mutable RPointerArray<CFbsBitmap> iScaledMasks;
+
+ /**
+ * Array holding the scaled inverted copies of the main mask.
+ * Entries valid only if mask is monochrome, otherwise NULL.
+ */
+ mutable RPointerArray<CFbsBitmap> iScaledMasksInverted;
+};
+
+
+#endif // SWTIMAGE_H