X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Flib%2Fvampimg%2FImagingCanvases.pas;h=448191cdcbb3591739c383cabed62bcf81efc58b;hb=48fffe15692e9dcd2bdc2ed64f6e998af13211cf;hp=0069502b61d391ad14c0e64e3f45f6ea7925d68f;hpb=ecfa6c6b626717711a8ae93cc455f69f0048498a;p=d2df-sdl.git diff --git a/src/lib/vampimg/ImagingCanvases.pas b/src/lib/vampimg/ImagingCanvases.pas index 0069502..448191c 100644 --- a/src/lib/vampimg/ImagingCanvases.pas +++ b/src/lib/vampimg/ImagingCanvases.pas @@ -1,5 +1,4 @@ { - $Id: ImagingCanvases.pas 174 2009-09-08 09:37:59Z galfar $ Vampyre Imaging Library by Marek Mauder http://imaginglib.sourceforge.net @@ -26,9 +25,7 @@ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html } -{ - This unit contains canvas classes for drawing and applying effects. -} +{ This unit contains canvas classes for drawing and applying effects.} unit ImagingCanvases; {$I ImagingOptions.inc} @@ -645,7 +642,10 @@ begin DestPix := DestInfo.GetPixelFP(DestPtr, DestInfo, nil); // Blend the two pixels (Src 'over' Dest alpha composition operation) DestPix.A := SrcPix.A + DestPix.A - SrcPix.A * DestPix.A; - SrcAlpha := IffFloat(DestPix.A = 0, 0, SrcPix.A / DestPix.A); + if DestPix.A = 0 then + SrcAlpha := 0 + else + SrcAlpha := SrcPix.A / DestPix.A; DestAlpha := 1.0 - SrcAlpha; DestPix.R := SrcPix.R * SrcAlpha + DestPix.R * DestAlpha; DestPix.G := SrcPix.G * SrcAlpha + DestPix.G * DestAlpha; @@ -1046,14 +1046,14 @@ begin if FPenMode = pmClear then Exit; // If line is vertical or horizontal just call appropriate method - if X2 - X1 = 0 then + if X2 = X1 then begin - HorzLine(X1, X2, Y1); + VertLine(X1, Y1, Y2); Exit; end; - if Y2 - Y1 = 0 then + if Y2 = Y1 then begin - VertLine(X1, Y1, Y2); + HorzLine(X1, X2, Y1); Exit; end; @@ -1414,11 +1414,11 @@ procedure TImagingCanvas.StretchDrawInternal(const SrcRect: TRect; PixelWriteProc: TPixelWriteProc); const FilterMapping: array[TResizeFilter] of TSamplingFilter = - (sfNearest, sfLinear, DefaultCubicFilter); + (sfNearest, sfLinear, DefaultCubicFilter, sfLanczos); var X, Y, I, J, SrcX, SrcY, SrcWidth, SrcHeight: Integer; DestX, DestY, DestWidth, DestHeight, SrcBpp, DestBpp: Integer; - SrcPix, PDest: TColorFPRec; + SrcPix: TColorFPRec; MapX, MapY: TMappingTable; XMinimum, XMaximum: Integer; LineBuffer: array of TColorFPRec; @@ -1900,8 +1900,8 @@ end; procedure TFastARGB32Canvas.StretchDrawAlpha(const SrcRect: TRect; DestCanvas: TImagingCanvas; const DestRect: TRect; Filter: TResizeFilter); var - X, Y, ScaleX, ScaleY, Yp, Xp, Weight1, Weight2, Weight3, Weight4, - FracX, FracY, InvFracY, T1, T2: Integer; + X, Y, ScaleX, ScaleY, Yp, Xp, Weight1, Weight2, Weight3, Weight4, InvFracY, T1, T2: Integer; + FracX, FracY: Cardinal; SrcX, SrcY, SrcWidth, SrcHeight: Integer; DestX, DestY, DestWidth, DestHeight: Integer; SrcLine, SrcLine2: PColor32RecArray; @@ -1985,9 +1985,9 @@ begin end; T2 := Iff(T1 < SrcWidth - 1, T1 + 1, T1); - Weight2:= (Cardinal(InvFracY) * FracX) shr 16; // cast to Card, Int can overflow gere + Weight2:= Integer((Cardinal(InvFracY) * FracX) shr 16); // cast to Card, Int can overflow here Weight1:= InvFracY - Weight2; - Weight4:= (Cardinal(FracY) * FracX) shr 16; + Weight4:= Integer((Cardinal(FracY) * FracX) shr 16); Weight3:= FracY - Weight4; Accum.B := (SrcLine[T1].B * Weight1 + SrcLine[T2].B * Weight2 + @@ -2007,77 +2007,6 @@ begin Inc(Yp, ScaleY); end; end; - { - - // Generate mapping tables - MapX := BuildMappingTable(DestX, DestX + DestWidth, SrcX, SrcX + SrcWidth, - FPData.Width, FilterFunction, Radius, False); - MapY := BuildMappingTable(DestY, DestY + DestHeight, SrcY, SrcY + SrcHeight, - FPData.Height, FilterFunction, Radius, False); - FindExtremes(MapX, XMinimum, XMaximum); - SetLength(LineBuffer, XMaximum - XMinimum + 1); - - for J := 0 to DestHeight - 1 do - begin - ClusterY := MapY[J]; - for X := XMinimum to XMaximum do - begin - AccumA := 0; - AccumR := 0; - AccumG := 0; - AccumB := 0; - for Y := 0 to Length(ClusterY) - 1 do - begin - Weight := Round(ClusterY[Y].Weight * 256); - SrcColor := FScanlines[ClusterY[Y].Pos, X]; - - AccumB := AccumB + SrcColor.B * Weight; - AccumG := AccumG + SrcColor.G * Weight; - AccumR := AccumR + SrcColor.R * Weight; - AccumA := AccumA + SrcColor.A * Weight; - end; - with LineBuffer[X - XMinimum] do - begin - A := AccumA; - R := AccumR; - G := AccumG; - B := AccumB; - end; - end; - - DestPtr := @TFastARGB32Canvas(DestCanvas).FScanlines[DestY + J, DestX]; - - for I := 0 to DestWidth - 1 do - begin - ClusterX := MapX[I]; - AccumA := 0; - AccumR := 0; - AccumG := 0; - AccumB := 0; - for X := 0 to Length(ClusterX) - 1 do - begin - Weight := Round(ClusterX[X].Weight * 256); - with LineBuffer[ClusterX[X].Pos - XMinimum] do - begin - AccumB := AccumB + B * Weight; - AccumG := AccumG + G * Weight; - AccumR := AccumR + R * Weight; - AccumA := AccumA + A * Weight; - end; - end; - - AccumA := ClampInt(AccumA, 0, $00FF0000); - AccumR := ClampInt(AccumR, 0, $00FF0000); - AccumG := ClampInt(AccumG, 0, $00FF0000); - AccumB := ClampInt(AccumB, 0, $00FF0000); - SrcColor.Color := (Cardinal(AccumA and $00FF0000) shl 8) or - (AccumR and $00FF0000) or ((AccumG and $00FF0000) shr 8) or ((AccumB and $00FF0000) shr 16); - - AlphaBlendPixels(@SrcColor, DestPtr); - - Inc(DestPtr); - end; - end; } end; procedure TFastARGB32Canvas.UpdateCanvasState; @@ -2133,9 +2062,14 @@ finalization -- TODOS ---------------------------------------------------- - more more more ... - implement pen width everywhere - - add blending (*image and object drawing) - more objects (arc, polygon) + -- 0.26.5 Changes/Bug Fixes --------------------------------- + - Fixed bug that could raise floating point error in DrawAlpha + and StretchDrawAlpha. + - Fixed bug in TImagingCanvas.Line that caused not drawing + of horz or vert lines. + -- 0.26.3 Changes/Bug Fixes --------------------------------- - Added some methods to TFastARGB32Canvas (InvertColors, DrawAlpha/StretchDrawAlpha) - Fixed DrawAlpha/StretchDrawAlpha destination alpha calculation.