/* * Loads a single cursor shape from resources and appends it to a native sprite. * Animated cursors (e.g. the busy cursor) have multiple members. */ void QCursorData::loadShapeFromResource(RWsSpriteBase& target, QString resource, int hx, int hy, int interval) { QPixmap pix; CFbsBitmap* native; QScopedPointer<TSpriteMember> member(new TSpriteMember); member->iInterval = interval; member->iInvertMask = false; member->iMaskBitmap = 0; // all shapes are RGBA member->iDrawMode = CGraphicsContext::EDrawModePEN; member->iOffset = TPoint(-hx, -hy); QString res(QLatin1String(":/trolltech/symbian/cursors/images/%1.png")); pix.load(res.arg(resource)); native = pix.toSymbianCFbsBitmap(); member->iBitmap = native; qt_symbian_throwIfError(nativeSpriteMembers.Append(member.data())); target.AppendMember(*(member.take())); }
void WindowSurfaceImpl::updateSurfaceData() { // If painting is active, i.e. beginPaint has been called // surface data is not updated if(mPaintingStarted) { return; } QWindowSurface* surface = mMainSurface.widget->windowSurface(); // If window surface is null it means that the widget has been // sent to background and widget's window surface has been deleted, // in such case create own QImage as local surface in order to support // rendering in background if(surface == NULL) { // check if we already have local surface with valid size if(!isLocalSurfaceValid()) { // incase we have invalid surface delete the current one // and create new if(mMainSurface.localSurfaceInUse) { deleteLocalSurface(); } createLocalSurface(); // set info mMainSurface.qSurface = NULL; mMainSurface.device = mMainSurface.localSurface; mMainSurface.type = WsTypeQtImage; mMainSurface.localSurfaceInUse = true; return; } else { // We have valid local surface so make sure its active and return mMainSurface.localSurfaceInUse = true; return; } } else { // We got Qt's window surface, so in case we had local surface in use // delete it as it's not used anymore if(mMainSurface.localSurfaceInUse) { // in case we have needed the local surface as temp // buffer for a client, it is not deleted as we most likely // will need it again. In any case the local surface // stops to be the main surface and is atleast demoted to // temp surface. if(!mPreserveLocalSurface) { deleteLocalSurface(); } } } // We got window surface so extract information QPaintDevice* device = surface->paintDevice(); QPaintEngine* engine = NULL; // If the device is active it means that some painter is attached to the widget, // if not then we attach our own painter to do the job if(device->paintingActive()) { engine = device->paintEngine(); } else { mPainter.begin(device); engine = mPainter.paintEngine(); } // determine the surface type based on the engine used // as Qt does not provide exact info of the surface type switch (engine->type()) { case QPaintEngine::OpenVG: // surface is EGL window surface mMainSurface.type = WsTypeEglSurface; break; case QPaintEngine::Raster: mMainSurface.type = WsTypeSymbianBitmap; if(device->devType() == QInternal::Pixmap) { QPixmap* pixmap = static_cast<QPixmap*>(device); mMainSurface.symbianBitmap = pixmap->toSymbianCFbsBitmap(); } else { throw GfxException(EGfxErrorIllegalArgument, "Unsupported device type"); } break; default: throw GfxException(EGfxErrorIllegalArgument, "Unsupported widget window surface type"); } // release painter if its active if(mPainter.isActive()) { mPainter.end(); } mMainSurface.qSurface = surface; mMainSurface.device = device; mMainSurface.localSurfaceInUse = false; }