📄 qt_transition.cpp
字号:
// This file is part of Ambulant Player, www.ambulantplayer.org.//// Copyright (C) 2003-2007 Stichting CWI, // Kruislaan 413, 1098 SJ Amsterdam, The Netherlands.//// Ambulant Player is free software; you can redistribute it and/or modify// it under the terms of the GNU Lesser General Public License as published by// the Free Software Foundation; either version 2.1 of the License, or// (at your option) any later version.//// Ambulant Player is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public License// along with Ambulant Player; if not, write to the Free Software// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA/* * @$Id: qt_transition.cpp,v 1.35 2007/02/12 14:15:00 jackjansen Exp $ */#include "ambulant/gui/qt/qt_includes.h"#include "ambulant/gui/qt/qt_renderer.h"#include "ambulant/gui/qt/qt_transition.h"#include "ambulant/lib/colors.h"#include "ambulant/lib/logger.h"//#define AM_DBG#ifndef AM_DBG#define AM_DBG if(0)#endifnamespace ambulant {using namespace lib;namespace gui {namespace qt {void qt_transition_debug::paint_rect(ambulant_qt_window* aqw, // TMP common::surface * dst, color_t color) { const rect& dstrect_whole = dst->get_clipped_screen_rect(); QPainter paint; paint.begin(aqw->get_ambulant_pixmap()); int L = dstrect_whole.left(), T = dstrect_whole.top(), W = dstrect_whole.width(), H = dstrect_whole.height(); // XXXX Fill with background color AM_DBG logger::get_logger()->debug( "qt_transition_debug::paint_rect:" " %s0x%x,%s(%d,%d,%d,%d)", " clearing to ", (long)color, " local_ltwh=",L,T,W,H); QColor bgc = QColor(redc(color), greenc(color), bluec(color)); paint.setBrush(bgc); paint.drawRect(L,T,W,H); paint.flush(); paint.end();}// Helper functions to setup transitionsstatic voidsetup_transition(bool outtrans, ambulant_qt_window *aqw, QPixmap** oldpxmp, QPixmap** newpxmp){ if (outtrans) { if (aqw->m_tmppixmap == NULL) { // make a copy aqw->m_tmppixmap = new QPixmap(*aqw->get_ambulant_oldpixmap()); } *oldpxmp = aqw->get_ambulant_surface(); *newpxmp = aqw->m_tmppixmap; } else { *oldpxmp = aqw->get_ambulant_pixmap(); *newpxmp = aqw->get_ambulant_surface(); }}static voidfinalize_transition(bool outtrans, ambulant_qt_window *aqw, common::surface *dest){ if (outtrans) { // copy the pixels in m_tmppixmap to the on-screen pixmap QPixmap* dest_pixmap = aqw->get_ambulant_pixmap(); QPixmap* temp_pixmap = aqw->get_ambulant_surface(); const lib::rect& r = dest->get_clipped_screen_rect(); AM_DBG logger::get_logger()->debug("finalize_transition: dest_pixmap=0x%x: temp_pixmap=0x%x (L,T,W,H)=(%d,%d,%d,%d)", dest_pixmap, temp_pixmap,r.left(),r.top(),r.width(), r.height()); bitBlt(dest_pixmap,r.left(),r.top(), temp_pixmap,r.left(),r.top(),r.width(), r.height()); }}voidqt_transition_blitclass_fade::update(){ AM_DBG logger::get_logger()->debug("qt_transition_blitclass_fade::update(%f)", m_progress); ambulant_qt_window *aqw = (ambulant_qt_window *)m_dst->get_gui_window(); QPixmap *npm, *qpm; setup_transition(m_outtrans, aqw, &qpm, &npm); AM_DBG logger::get_logger()->debug("qt_transition_blitclass_fade::update(%f) qpm(%d,%d),npm(%d,%d)", m_progress, qpm->width(), qpm->height(), npm->width(), npm->height()); QImage m_old_image; QImage m_new_image; m_old_image = qpm->convertToImage(); m_new_image = npm->convertToImage(); QImage res(m_old_image.size(),m_old_image.depth()); int i, j, iw = res.width(), ih = res.height(); AM_DBG logger::get_logger()->debug("qt_transition_blitclass_fade::update() qpm=0x%x, npm=0x%x. res=0x%x, iw=%d, ih=%d", qpm, npm, &res, iw, ih); // Following code From: Qt-interest Archive, July 2002 // blending of qpixmaps, Sebastian Loebbert #define OPTIM#ifndef OPTIM double fac1 = 1.0 - m_progress; double fac2 = 1.0 - fac1;#else /*OPTIM*/ unsigned int mul1 = 255 - (unsigned int) (m_progress * 255); unsigned int mul2 = 255 - mul1;#endif/*OPTIM*/ for(int i = 0;i < iw;i++){ for(int j = 0; j < ih;j++){ QRgb p1 = m_old_image.pixel(i,j); QRgb p2 = m_new_image.pixel(i,j); res.setPixel(i,j,#ifndef OPTIM qRgb ( (int)( qRed(p1)*fac1 + qRed(p2)*fac2 ), (int)( qGreen(p1)*fac1 + qGreen(p2)*fac2 ), (int)( qBlue(p1)*fac1 + qBlue(p2)*fac2 ) )#else /*OPTIM*/ qRgb ( ( qRed(p1)*mul1 + qRed(p2)*mul2 ) >> 8, ( qGreen(p1)*mul1 + qGreen(p2)*mul2 ) >> 8, ( qBlue(p1)*mul1 + qBlue(p2)*mul2 ) >> 8 )#endif/*OPTIM*/ );// if (j&4 && !(j&3) && i&4 &&!(i&3)) AM_DBG logger::get_logger()->debug("qt_transition_blitclass_fade::update(): i=%3d, j=%3d, p1=0x%x, p2=0x%x, res=0x%x", i, j, p1, p2, res.pixel(i,j)); } } const rect& newrect_whole = m_dst->get_clipped_screen_rect(); int L = newrect_whole.left(), T = newrect_whole.top(), W = newrect_whole.width(), H = newrect_whole.height(); AM_DBG logger::get_logger()->debug( "qt_transition_blitclass_fade::update(): " " ltwh=(%d,%d,%d,%d)",L,T,W,H); QPixmap rpm(W,H); rpm.convertFromImage(res); bitBlt(qpm, L, T, &rpm, L, T, W, H); finalize_transition(m_outtrans, aqw, m_dst);}voidqt_transition_blitclass_rect::update(){ AM_DBG logger::get_logger()->debug("qt_transition_blitclass_rect::update(%f)", m_progress); ambulant_qt_window *aqw = (ambulant_qt_window *)m_dst->get_gui_window(); QPixmap *npm, *qpm; setup_transition(m_outtrans, aqw, &qpm, &npm); rect newrect_whole = m_newrect; newrect_whole.translate(m_dst->get_global_topleft()); newrect_whole &= m_dst->get_clipped_screen_rect(); int L = newrect_whole.left(), T = newrect_whole.top(), W = newrect_whole.width(), H = newrect_whole.height(); AM_DBG logger::get_logger()->debug("qt_transition_blitclass_rect: qpm=0x%x, npm=0x%x, (L,T,W,H)=(%d,%d,%d,%d)",qpm,npm,L,T,W,H); bitBlt(qpm, L, T, npm, L, T, W, H); finalize_transition(m_outtrans, aqw, m_dst);}voidqt_transition_blitclass_r1r2r3r4::update(){ AM_DBG logger::get_logger()->debug("qt_transition_blitclass_r1r2r3r4::update(%f)", m_progress); ambulant_qt_window *aqw = (ambulant_qt_window *)m_dst->get_gui_window(); QPixmap *npm, *qpm; setup_transition(m_outtrans, aqw, &qpm, &npm); AM_DBG logger::get_logger()->debug("qt_transition_blitclass_r1r2r3r4::update(%f) qpm(%d,%d),npm(%d,%d)", m_progress, qpm->width(), qpm->height(), npm->width(), npm->height()); AM_DBG logger::get_logger()->debug("qt_transition_blitclass_r1r2r3r4::update() qpm=0x%x, npm=0x%x.", qpm, npm); rect oldsrcrect_whole = m_oldsrcrect; rect olddstrect_whole = m_olddstrect; rect newsrcrect_whole = m_newsrcrect; rect newdstrect_whole = m_newdstrect; oldsrcrect_whole.translate(m_dst->get_global_topleft()); oldsrcrect_whole &= m_dst->get_clipped_screen_rect(); olddstrect_whole.translate(m_dst->get_global_topleft()); olddstrect_whole &= m_dst->get_clipped_screen_rect(); newsrcrect_whole.translate(m_dst->get_global_topleft()); newsrcrect_whole &= m_dst->get_clipped_screen_rect(); newdstrect_whole.translate(m_dst->get_global_topleft()); newdstrect_whole &= m_dst->get_clipped_screen_rect(); int Loldsrc = oldsrcrect_whole.left(), Toldsrc = oldsrcrect_whole.top(), Woldsrc = oldsrcrect_whole.width(), Holdsrc = oldsrcrect_whole.height();// logger::get_logger()->debug("qt_transition_blitclass_r1r2r3r4: (Loldsrc,Toldsrc,Woldsrc,Holdsrc)=(%d,%d,%d,%d)",Loldsrc,Toldsrc,Woldsrc,Holdsrc); int Lolddst = olddstrect_whole.left(), Tolddst = olddstrect_whole.top(), Wolddst = olddstrect_whole.width(), Holddst = olddstrect_whole.height();// logger::get_logger()->debug("qt_transition_blitclass_r1r2r3r4: (Lolddst,Tolddst,Wolddst,Holddst)=(%d,%d,%d,%d)",Lolddst,Tolddst,Wolddst,Holddst); int Lnewsrc = newsrcrect_whole.left(), Tnewsrc = newsrcrect_whole.top(), Wnewsrc = newsrcrect_whole.width(), Hnewsrc = newsrcrect_whole.height();// logger::get_logger()->debug("qt_transition_blitclass_r1r2r3r4: (Lnewsrc,Tnewsrc,Wnewsrc,Hnewsrc)=(%d,%d,%d,%d)",Lnewsrc,Tnewsrc,Wnewsrc,Hnewsrc); int Lnewdst = newdstrect_whole.left(), Tnewdst = newdstrect_whole.top(), Wnewdst = newdstrect_whole.width(), Hnewdst = newdstrect_whole.height();// logger::get_logger()->debug("qt_transition_blitclass_r1r2r3r4: (Lnewdst,Tnewdst,Wnewdst,Hnewdst)=(%d,%d,%d,%d)",Lnewdst,Tnewdst,Wnewdst,Hnewdst); bitBlt(qpm, Lolddst, Tolddst, qpm, Loldsrc, Toldsrc, Woldsrc, Holdsrc); bitBlt(qpm, Lnewdst, Tnewdst, npm, Lnewsrc, Tnewsrc, Wnewsrc, Hnewsrc); finalize_transition(m_outtrans, aqw, m_dst);}voidqt_transition_blitclass_rectlist::update(){ AM_DBG logger::get_logger()->debug("qt_transition_blitclass_rectlist::update(%f)", m_progress); ambulant_qt_window *aqw = (ambulant_qt_window *)m_dst->get_gui_window(); QPixmap *npm, *qpm; setup_transition(m_outtrans, aqw, &qpm, &npm); QImage img1 = qpm->convertToImage(); QImage img2 = npm->convertToImage(); const rect& dstrect_whole = m_dst->get_clipped_screen_rect(); int L = dstrect_whole.left(), T = dstrect_whole.top(), W = dstrect_whole.width(), H = dstrect_whole.height(); AM_DBG logger::get_logger()->debug("qt_transition_blitclass_rectlist: (L,T,W,H)=(%d,%d,%d,%d)",L,T,W,H); QPainter paint;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -