text: /****************************************************************************
  **
  ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
  ** Contact: http://www.qt-project.org/legal
  **
  ** This file is part of the plugins of the Qt Toolkit.
  **
  ** $QT_BEGIN_LICENSE:LGPL21$
  ** Commercial License Usage
  ** Licensees holding valid commercial Qt licenses may use this file in
  ** accordance with the commercial license agreement provided with the
  ** Software or, alternatively, in accordance with the terms contained in
  ** a written agreement between you and Digia. For licensing terms and
  ** conditions see http://qt.digia.com/licensing. For further information
  ** use the contact form at http://qt.digia.com/contact-us.
  **
  ** GNU Lesser General Public License Usage
  ** Alternatively, this file may be used under the terms of the GNU Lesser
  ** General Public License version 2.1 or version 3 as published by the Free
  ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
  ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
  ** following information to ensure the GNU Lesser General Public License
  ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
  ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
  **
  ** In addition, as a special exception, Digia gives you certain additional
  ** rights. These rights are described in the Digia Qt LGPL Exception
  ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
  **
  ** $QT_END_LICENSE$
  **
  ****************************************************************************/
  
  #include "qwindowsdirect2dbackingstore.h"
  #include "qwindowsdirect2dintegration.h"
  #include "qwindowsdirect2dcontext.h"
  #include "qwindowsdirect2dpaintdevice.h"
  #include "qwindowsdirect2dbitmap.h"
  #include "qwindowsdirect2ddevicecontext.h"
  #include "qwindowsdirect2dwindow.h"
  
  #include "qwindowscontext.h"
  
  #include <QtGui/QPainter>
  #include <QtGui/QWindow>
  #include <QtCore/QDebug>
  
  QT_BEGIN_NAMESPACE
  
  /*!
      \class QWindowsDirect2DBackingStore
      \brief Backing store for windows.
      \internal
      \ingroup qt-lighthouse-win
  */
  
  static inline QWindowsDirect2DPlatformPixmap *platformPixmap(QPixmap *p)
  {
      return static_cast<QWindowsDirect2DPlatformPixmap *>(p->handle());
  }
  
  static inline QWindowsDirect2DBitmap *bitmap(QPixmap *p)
  {
      return platformPixmap(p)->bitmap();
  }
  
  static inline QWindowsDirect2DWindow *nativeWindow(QWindow *window)
  {
      return static_cast<QWindowsDirect2DWindow *>(window->handle());
  }
  
  QWindowsDirect2DBackingStore::QWindowsDirect2DBackingStore(QWindow *window)
      : QPlatformBackingStore(window)
  {
  }
  
  QWindowsDirect2DBackingStore::~QWindowsDirect2DBackingStore()
  {
  }
  
  void QWindowsDirect2DBackingStore::beginPaint(const QRegion &region)
  {
      QPixmap *pixmap = nativeWindow(window())->pixmap();
      bitmap(pixmap)->deviceContext()->begin();
  
      QPainter painter(pixmap);
      QColor clear(Qt::transparent);
  
      painter.setCompositionMode(QPainter::CompositionMode_Source);
  
      foreach (const QRect &r, region.rects())
          painter.fillRect(r, clear);
  }
  
  void QWindowsDirect2DBackingStore::endPaint()
  {
      bitmap(nativeWindow(window())->pixmap())->deviceContext()->end();
  }
  
  QPaintDevice *QWindowsDirect2DBackingStore::paintDevice()
  {
      return nativeWindow(window())->pixmap();
  }
  
  void QWindowsDirect2DBackingStore::flush(QWindow *targetWindow, const QRegion &region, const QPoint &offset)
  {
      if (targetWindow != window()) {
          QSharedPointer<QWindowsDirect2DBitmap> copy(nativeWindow(window())->copyBackBuffer());
          nativeWindow(targetWindow)->flush(copy.data(), region, offset);
      }
  
      nativeWindow(targetWindow)->present(region);
  }
  
  void QWindowsDirect2DBackingStore::resize(const QSize &size, const QRegion &region)
  {
      QPixmap old = nativeWindow(window())->pixmap()->copy();
  
      nativeWindow(window())->resizeSwapChain(size);
      QPixmap *newPixmap = nativeWindow(window())->pixmap();
  
      if (!old.isNull()) {
          foreach (const QRect &rect, region.rects()) {
              platformPixmap(newPixmap)->copy(old.handle(), rect);
          }
      }
  }
  
  QT_END_NAMESPACE
  