358991e3b0
For tdf#124292, Qt's own HiDPI scaling was explicitly disabled, but it turns out, you can't really scale QStyle painting then. This patch series had a 2nd approach also used by Gtk+ currently, which relied on the scaling of ths Cairo surface, which works surprisingly good, but has to lie about the real DPI value, so nothing is scaled twice. Also all icons are then scaled instead of rendered with the proper resolution. When HiDPI support in Qt is enabled, and the application is started using QT_SCALE_FACTOR=1.25, Qt simply lowers the reported resolution, keeps the logical DPI value of 96 and changes the devicePixelRatio to the specified value. But LO still expects the real DPI values and sizes, so we have to multiply a lot of rectangles, sizes and positions. The current result is far from perfect, which you can see with the various graphics glitches, but it at least doesn't crash anymore in the ControlType::Editbox sizing code. The main problem is all the up and downscaling in the getNativeControlRegion code, so LO knows the size of the widgets for the correct layouting, since there seem to be no API to get the scaled values from Qt / QStyle. Change-Id: I687b1df6ef27724ce68326d256e9addccd72e759 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86239 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
67 lines
2.1 KiB
C++
67 lines
2.1 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <QtCore/QRectF>
|
|
#include <QtGui/QPainter>
|
|
#include <QtWidgets/QWidget>
|
|
|
|
#include "Qt5Frame.hxx"
|
|
#include "Qt5Graphics.hxx"
|
|
|
|
class Qt5Painter final : public QPainter
|
|
{
|
|
Qt5Graphics& m_rGraphics;
|
|
QRegion m_aRegion;
|
|
|
|
public:
|
|
Qt5Painter(Qt5Graphics& rGraphics, bool bPrepareBrush = false, sal_uInt8 nTransparency = 255);
|
|
~Qt5Painter()
|
|
{
|
|
if (m_rGraphics.m_pFrame && !m_aRegion.isEmpty())
|
|
m_rGraphics.m_pFrame->GetQWidget()->update(m_aRegion);
|
|
}
|
|
|
|
void update(int nx, int ny, int nw, int nh)
|
|
{
|
|
if (m_rGraphics.m_pFrame)
|
|
m_aRegion += scaledQRect({ nx, ny, nw, nh }, 1 / m_rGraphics.devicePixelRatioF());
|
|
}
|
|
|
|
void update(const QRect& rRect)
|
|
{
|
|
if (m_rGraphics.m_pFrame)
|
|
m_aRegion += scaledQRect(rRect, 1 / m_rGraphics.devicePixelRatioF());
|
|
}
|
|
|
|
void update(const QRectF& rRectF)
|
|
{
|
|
if (m_rGraphics.m_pFrame)
|
|
update(scaledQRect(rRectF.toAlignedRect(), 1 / m_rGraphics.devicePixelRatioF()));
|
|
}
|
|
|
|
void update()
|
|
{
|
|
if (m_rGraphics.m_pFrame)
|
|
m_aRegion += m_rGraphics.m_pFrame->GetQWidget()->rect();
|
|
}
|
|
};
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|