Qt: much faster DCSetPixel when painter is QImage or QPixmap. issue #29256

git-svn-id: trunk@51040 -
This commit is contained in:
zeljko 2015-12-26 16:30:37 +00:00
parent b8d42c3a62
commit 60c709a66b

View File

@ -1233,26 +1233,42 @@ end;
procedure TQtWidgetSet.DCSetPixel(CanvasHandle: HDC; X, Y: integer; AColor: TGraphicsColor); procedure TQtWidgetSet.DCSetPixel(CanvasHandle: HDC; X, Y: integer; AColor: TGraphicsColor);
var var
Color: TQColor; Color: TQColor;
AQColor: QColorH;
ColorRef: TColorRef; ColorRef: TColorRef;
Pen: QPenH; Pen: QPenH;
Painter: QPainterH; Painter: QPainterH;
ADevType: Integer;
begin begin
if IsValidDC(CanvasHandle) then if IsValidDC(CanvasHandle) then
begin begin
// WriteLn('TQtWidgetSet.DCSetPixel X=',X,' Y=',Y, ' AColor=',dbghex(AColor),' rgb ? ',dbgHex(ColorToRGB(AColor))); // WriteLn('TQtWidgetSet.DCSetPixel X=',X,' Y=',Y, ' AColor=',dbghex(AColor),' rgb ? ',dbgHex(ColorToRGB(AColor)));
Painter := TQtDeviceContext(CanvasHandle).Widget; Painter := TQtDeviceContext(CanvasHandle).Widget;
{Save current pen.Better save copy of pen instead of ADevType := QPaintDevice_devType(QPaintEngine_paintDevice(QPainter_paintEngine(Painter)));
using painter save/restore, or saved Pen in devicecontext which {qt private PaintDeviceFlags 2 = QPixmap 3 = QImage. issue #29256}
may be null. Issue #27620} if ((ADevType = 2) or (ADevType = 3)) and
Pen := QPen_create(QPainter_pen(Painter)); (TQtDeviceContext(CanvasHandle).vImage <> nil) and
try (TQtDeviceContext(CanvasHandle).vImage.Handle <> nil) then
begin
ColorRef := TColorRef(ColorToRGB(AColor)); ColorRef := TColorRef(ColorToRGB(AColor));
QColor_fromRgb(@Color, Red(ColorRef), Green(ColorRef), Blue(ColorRef)); QColor_fromRgb(@Color, Red(ColorRef), Green(ColorRef), Blue(ColorRef));
QPainter_setPen(Painter, PQColor(@Color)); AQColor := QColor_create(PQColor(@Color));
QPainter_drawPoint(Painter, X,Y); QImage_setPixel(TQtDeviceContext(CanvasHandle).vImage.Handle, X, Y, QColor_rgb(AQColor));
finally QColor_destroy(AQColor);
QPainter_setPen(Painter, Pen); end else
QPen_destroy(Pen); begin
{Save current pen.Better save copy of pen instead of
using painter save/restore, or saved Pen in devicecontext which
may be null. Issue #27620}
Pen := QPen_create(QPainter_pen(Painter));
try
ColorRef := TColorRef(ColorToRGB(AColor));
QColor_fromRgb(@Color, Red(ColorRef), Green(ColorRef), Blue(ColorRef));
QPainter_setPen(Painter, PQColor(@Color));
QPainter_drawPoint(Painter, X,Y);
finally
QPainter_setPen(Painter, Pen);
QPen_destroy(Pen);
end;
end; end;
end; end;
end; end;