javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/graphics/qt/imagebase.cpp
author hgs
Fri, 15 Oct 2010 12:29:39 +0300
changeset 80 d6dafc5d983f
permissions -rw-r--r--
v2.2.19_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     1
/*******************************************************************************
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     2
 * Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies).
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     3
 * All rights reserved. This program and the accompanying materials
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     4
 * are made available under the terms of the Eclipse Public License v1.0
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     5
 * which accompanies this distribution, and is available at
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     6
 * http://www.eclipse.org/legal/epl-v10.html
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     7
 *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     8
 * Contributors:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     9
 *     Nokia Corporation - initial API and implementation
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    10
 *******************************************************************************/
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    11
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    12
#include "imagebase.h"
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    13
#include "gfxlog.h"
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    14
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    15
namespace Java { namespace GFX {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    16
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    17
ImageBase::ImageBase() : mAlpha(-1), mHasMask(false)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    18
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    19
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    20
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    21
ImageBase::~ImageBase()
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    22
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    23
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    24
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    25
void ImageBase::doGetRgb(QImage& image, int* aRgbdata, int aOffset, int aScanlength, 
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    26
                         int aX, int aY, int aWidth, int aHeight)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    27
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    28
    GFX_LOG_FUNC_CALL();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    29
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    30
    if(aX != 0 || aY != 0 || aWidth < image.width() || aHeight < image.height())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    31
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    32
        image = image.copy(aX, aY, aWidth, aHeight);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    33
        if(image.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    34
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    35
            throw GfxException(EGfxErrorNoMemory, "copying from original image failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    36
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    37
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    38
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    39
    // If image is not 32bpp we need to convert it
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    40
    if(image.format() != QImage::Format_RGB32 &&
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    41
       image.format() != QImage::Format_ARGB32)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    42
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    43
        image = image.convertToFormat(QImage::Format_ARGB32);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    44
        if(image.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    45
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    46
            throw GfxException(EGfxErrorNoMemory, "format convertion to 32bpp failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    47
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    48
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    49
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    50
    // Temporary storage for pixels
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    51
    QRgb* pixel = NULL;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    52
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    53
    // dataArray index, start from offset
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    54
    int targetIndex = aOffset;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    55
    // Iterate through lines
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    56
    for(int b = 0; b < aHeight; ++b)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    57
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    58
        // Obtain pointer to start of current line (y)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    59
        const unsigned char* lineStart = image.scanLine(b);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    60
        // Iterate through pixels on each line
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    61
        for (int a = 0; a < aWidth; ++a)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    62
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    63
            // Set the current pixel, relative to line start
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    64
            pixel = ((QRgb*)lineStart) + a;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    65
            // Move target pointer to the next slot
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    66
            targetIndex = aOffset + a + (b * aScanlength);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    67
            // Shift pixels to correct places, needed for 32-bit format
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    68
            // as the bits order in memory may vary between systems
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    69
            aRgbdata[targetIndex] =  ((qAlpha(*pixel) & 0xff) << 24) |
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    70
                                     ((qRed(*pixel)   & 0xff) << 16) |
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    71
                                     ((qGreen(*pixel) & 0xff) << 8 ) |
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    72
                                     ((qBlue(*pixel)  & 0xff));
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    73
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    74
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    75
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    76
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    77
void ImageBase::doGetRgb(QImage& image, char* aRgbdata, char* aTransparencyMask,int aOffset, 
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    78
                         int aScanlength, int aX, int aY, int aWidth, int aHeight, int aFormat)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    79
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    80
    GFX_LOG_FUNC_CALL();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    81
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    82
    if(aX != 0 || aY != 0 || aWidth < image.width() || aHeight < image.height())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    83
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    84
        image = image.copy(aX, aY, aWidth, aHeight);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    85
        if(image.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    86
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    87
            throw GfxException(EGfxErrorNoMemory, "copying from original image failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    88
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    89
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    90
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    91
    if(aScanlength < 0)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    92
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    93
         image = image.mirrored(false, true);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    94
         if(image.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    95
             {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    96
             throw GfxException(EGfxErrorNoMemory, "Mirroring failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    97
             }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    98
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    99
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   100
    // If image is not monochrome we need to convert it
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   101
    if(image.format() != QImage::Format_Mono)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   102
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   103
        image = image.convertToFormat(QImage::Format_Mono);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   104
        if(image.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   105
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   106
            throw GfxException(EGfxErrorNoMemory, "Format conversion to 8bpp failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   107
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   108
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   109
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   110
    // dataArray index, start from offset
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   111
    int targetIndex = aOffset;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   112
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   113
    const unsigned char* imageStart = image.bits();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   114
    QImage mask = image.alphaChannel();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   115
    const unsigned char* maskStart = mask.bits();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   116
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   117
    // Find the number of full bytes
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   118
    int fullBytes = aWidth/8;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   119
    int bpl = image.bytesPerLine();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   120
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   121
    if(bpl == fullBytes)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   122
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   123
        memcpy(aRgbdata+targetIndex, imageStart, bpl*aHeight);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   124
        memcpy(aTransparencyMask+targetIndex, maskStart, bpl*aHeight);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   125
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   126
    else
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   127
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   128
        memcpy(aRgbdata+targetIndex, imageStart, fullBytes*aHeight + aHeight);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   129
        memcpy(aTransparencyMask+targetIndex, maskStart, fullBytes*aHeight + aHeight);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   130
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   131
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   132
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   133
void ImageBase::doGetRgb(QImage& image, short* aRgbdata, int aOffset, int aScanlength, 
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   134
                         int aX, int aY, int aWidth, int aHeight, int aFormat)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   135
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   136
    GFX_LOG_FUNC_CALL();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   137
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   138
    // Match format to QT
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   139
    int format;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   140
    switch (aFormat) {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   141
        case EFormatRGB555:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   142
            format = QImage::Format_RGB555;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   143
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   144
        case EFormatRGB16:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   145
            format = QImage::Format_RGB16;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   146
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   147
         case EFormatRGB444:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   148
            format = QImage::Format_RGB444;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   149
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   150
         case EFormatARGB4444Premultiplied:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   151
            format = QImage::Format_ARGB4444_Premultiplied;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   152
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   153
         default:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   154
            format = QImage::Format_RGB16;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   155
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   156
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   157
    if(aX != 0 || aY != 0 || aWidth < image.width() || aHeight < image.height())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   158
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   159
        image = image.copy(aX, aY, aWidth, aHeight);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   160
        if(image.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   161
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   162
            throw GfxException(EGfxErrorNoMemory, "copying from original image failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   163
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   164
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   165
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   166
    // If image is not format we need, convert it
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   167
    if(image.format() != format)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   168
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   169
        image = image.convertToFormat((QImage::Format)format);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   170
        if(image.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   171
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   172
            throw GfxException(EGfxErrorNoMemory, "format convertion to 16bpp failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   173
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   174
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   175
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   176
    // Temporary storage for pixels
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   177
    short* pixel = NULL;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   178
    // dataArray index, start from offset
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   179
    int targetIndex = aOffset;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   180
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   181
    // Iterate through lines
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   182
    for(int b=0; b < aHeight; b++)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   183
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   184
        // Obtain pointer to start of current line (y)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   185
        const unsigned char* lineStart = image.scanLine(b);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   186
        // Iterate through pixels on each line
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   187
        for(int a=0; a < aWidth; a++)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   188
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   189
            // Set the current pixel, relative to line start
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   190
            pixel = ((short*)lineStart) + a;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   191
            // Move target pointer to the next slot
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   192
            targetIndex = aOffset + a + (b * aScanlength);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   193
            aRgbdata[targetIndex] =  *pixel;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   194
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   195
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   196
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   197
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   198
QTransform ImageBase::generateTransformMatrix(TTransform aTransform)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   199
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   200
    GFX_LOG_FUNC_CALL();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   201
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   202
    // In case there's both mirror and rotate is requested, the angle of rotation
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   203
    // must be negative since when the transform is applied the z-axis is processed
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   204
    // before y-axis, while the spec mandates reverse order. So by having negative  
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   205
    // degrees for rotation along z-axis here, gives correct output.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   206
    QTransform transform;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   207
    switch(aTransform) 
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   208
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   209
        case ETransNone:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   210
            // No transform or mirror
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   211
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   212
        case ETransRot90:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   213
            transform.rotate(90, Qt::ZAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   214
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   215
        case ETransRot180:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   216
            transform.rotate(180, Qt::ZAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   217
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   218
        case ETransRot270:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   219
            transform.rotate(270, Qt::ZAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   220
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   221
        case ETransMirror:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   222
            transform.rotate(180,Qt::YAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   223
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   224
        case ETransMirrorRot90:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   225
            transform.rotate(180, Qt::YAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   226
            transform.rotate(-90, Qt::ZAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   227
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   228
        case ETransMirrorRot180:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   229
            transform.rotate(180, Qt::YAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   230
            transform.rotate(-180, Qt::ZAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   231
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   232
        case ETransMirrorRot270:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   233
            transform.rotate(180, Qt::YAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   234
            transform.rotate(-270, Qt::ZAxis);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   235
            break;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   236
        default:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   237
            Q_ASSERT_X(false, "Graphics", "Transform type not recognized");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   238
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   239
    return transform;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   240
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   241
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   242
int ImageBase::getAlpha() 
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   243
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   244
    return mAlpha;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   245
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   246
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   247
bool ImageBase::hasMask()
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   248
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   249
    return mHasMask;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   250
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   251
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   252
QImage ImageBase::imageDataToQImage(ImageDataWrapper* aData)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   253
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   254
    if(aData->getDepth() != 32)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   255
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   256
        // Java side always converts the ImageData to 32 bit before passing it
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   257
        // to native side, bail out if we get something else
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   258
        throw GfxException(EGfxErrorNoMemory, "Only 32 bit ImageData is supported in Image creation");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   259
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   260
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   261
    int bpp = 4; // bit depth = 32, 4 bytes per pixel
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   262
    int size = aData->getWidth()*aData->getHeight()*bpp;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   263
    char* pixelData = aData->getData(ImageDataWrapper::EPixelData);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   264
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   265
    for(int index = 0; index < size; index += bpp)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   266
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   267
        int pixel = *(reinterpret_cast<int*>(pixelData+index));
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   268
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   269
        pixelData[index]   = (uchar)(pixel >> 24) & 0xFF;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   270
        pixelData[index+1] = (uchar)(pixel >> 16) & 0xFF;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   271
        pixelData[index+2] = (uchar)(pixel >> 8) & 0xFF;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   272
        pixelData[index+3] = 0xFF; // Set alpha to opaque here, alpha channel data will be handled later
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   273
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   274
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   275
    QImage image(reinterpret_cast<uchar*>(aData->getData(ImageDataWrapper::EPixelData)),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   276
                                              aData->getWidth(),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   277
                                              aData->getHeight(),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   278
                                              aData->getBytesPerLine(),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   279
                                              QImage::Format_ARGB32);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   280
    if(image.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   281
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   282
        throw GfxException(EGfxErrorNoMemory, "Image creation failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   283
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   284
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   285
    // Set indexed palette (if one is set)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   286
    if(!aData->isDirect())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   287
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   288
        image.setColorTable(*aData->getPaletteData()->getIndexedPalette());
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   289
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   290
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   291
    mHasMask = false;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   292
    mAlpha = aData->getAlpha();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   293
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   294
    if(aData->getData(ImageDataWrapper::EMaskData))
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   295
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   296
        QImage mask(reinterpret_cast<uchar*>(aData->getData(ImageDataWrapper::EMaskData)),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   297
                                             aData->getWidth(),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   298
                                             aData->getHeight(),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   299
                                             QImage::Format_Mono);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   300
        if(mask.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   301
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   302
            throw GfxException(EGfxErrorNoMemory, "Image alpha channel creation failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   303
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   304
        image.setAlphaChannel(mask);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   305
        mHasMask = true;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   306
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   307
    else if(mAlpha != -1)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   308
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   309
        // Global alpha is set, overrides alpha channel data
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   310
        QImage alpha(aData->getWidth(), aData->getHeight(), QImage::Format_Indexed8);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   311
        if(alpha.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   312
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   313
            throw GfxException(EGfxErrorNoMemory, "Image alpha channel creation failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   314
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   315
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   316
        alpha.fill(aData->getAlpha());
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   317
        image.setAlphaChannel(alpha);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   318
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   319
    else if(aData->getData(ImageDataWrapper::EAlphaData))
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   320
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   321
        // Alpha channel data is set
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   322
        const int w = aData->getWidth();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   323
        QImage alpha(reinterpret_cast<uchar*>(aData->getData(ImageDataWrapper::EAlphaData)),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   324
                                              w,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   325
                                              aData->getHeight(),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   326
                                              w,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   327
                                              QImage::Format_Indexed8);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   328
        QVector<QRgb> colors(255);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   329
        for(int i=0; i<255; i++)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   330
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   331
            colors[i] = qRgb(i, i, i);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   332
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   333
        alpha.setColorTable(colors);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   334
        colors.clear();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   335
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   336
        if(alpha.isNull())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   337
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   338
            throw GfxException(EGfxErrorNoMemory, "Image alpha channel creation failed");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   339
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   340
        image.setAlphaChannel(alpha);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   341
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   342
    return image;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   343
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   344
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   345
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   346
QImage::Format ImageBase::mapInternalFormatToQt(TImageFormat internalImageFormat)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   347
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   348
    switch (internalImageFormat) 
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   349
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   350
        case EFormatARGB32:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   351
            return QImage::Format_ARGB32;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   352
        case EFormatRGB32:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   353
            return QImage::Format_RGB32;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   354
        case EFormatARGB32Premultiplied:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   355
            return QImage::Format_ARGB32_Premultiplied;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   356
         case EFormatRGB16:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   357
            return QImage::Format_RGB16;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   358
         case EFormatRGB555:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   359
            return QImage::Format_RGB555;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   360
         case EFormatRGB444:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   361
            return QImage::Format_RGB444;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   362
         case EFormatARGB4444Premultiplied:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   363
            return QImage::Format_ARGB4444_Premultiplied;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   364
         case EFormatMONO:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   365
            return QImage::Format_Mono;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   366
         default:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   367
            return QImage::Format_Invalid;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   368
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   369
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   370
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   371
TImageFormat ImageBase::mapQtFormatToInternal(QImage::Format qtImageFormat)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   372
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   373
    switch (qtImageFormat) 
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   374
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   375
        case QImage::Format_ARGB32:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   376
            return EFormatARGB32;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   377
        case QImage::Format_RGB32:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   378
            return EFormatRGB32;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   379
        case QImage::Format_ARGB32_Premultiplied:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   380
            return EFormatARGB32Premultiplied;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   381
         case QImage::Format_RGB16:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   382
            return EFormatRGB16;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   383
         case QImage::Format_RGB555:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   384
            return EFormatRGB555;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   385
         case QImage::Format_RGB444:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   386
            return EFormatRGB444;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   387
         case QImage::Format_ARGB4444_Premultiplied:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   388
            return EFormatARGB4444Premultiplied;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   389
         case QImage::Format_Mono:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   390
            return EFormatMONO;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   391
         default:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   392
            return EFormatNone;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   393
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   394
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   395
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   396
} // namespace GFX
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   397
} // namespace Java