Graphics32は、Delphi向けのグラフィックスライブラリで、32ビットピクセルフォーマットに最適化されており、ピクセルやグラフィックスプリミティブを使った高速な操作を実現しています。このライブラリを利用することで、Delphiで標準提供しているTBitmap/TCanvasクラスよりも大幅なパフォーマンス向上を発揮します。
また32ビットのデバイスに依存しないビットマップ(DIB)での描画を高速化し、最適化するように書き直されています。 さらにこのライブラリ独自の新しいオプションも提供しています。
Graphics32ライブラリの特徴
- 標準のTCanvas/TBitmapと比較して最大100倍高速なピクセルごとの高速アクセス
- 高性能ビットマップアルファブレンディング
- 任意のポリゴン変換とカスタム塗りつぶし
- 高品質の再構成フィルタを使用したビットマップのリサンプリング
- ビットマップのアフィン変換、回転、スケーリング
- 最大のサンプリング品質を実現する柔軟なスーパーサンプリングの実装
- 複数のカスタマイズ可能な使いやすいオーバーレイレイヤ
- プラットフォーム非依存のコード
そしてこのライブラリには標準コンポーネントとの決定的な違いがあります。Windows GDIに依存せず、ほとんどの機能が再実装され、32ビットピクセルフォーマットに特化した最適化が行われています。
以下のコードは、Graphics32のArrowHeadのサンプルプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
procedure TFmArrowHead.ReDraw; var Box : array [0..1] of TArrayOfFloatPoint; Poly, ArrowPts: TArrayOfFloatPoint; StartPoint, EndPoint, StartOffsetPt, EndOffsetPt: TFloatPoint; Delta: TFloatPoint; Arrow: TArrowHeadAbstract; GradientFiller: TLinearGradientPolygonFiller; const StartArrowColor: TColor32 = $60009900; StartArrowPenColor: TColor32 = $FF339900; EndArrowColor: TColor32 = $600000AA; EndArrowPenColor: TColor32 = $FF0033AA; begin ImgView32.Bitmap.Clear(clWhite32); case RgpArrowStyle.ItemIndex of 1: Arrow := TArrowHeadSimple.Create(ArrowSize); 2: Arrow := TArrowHeadFourPt.Create(ArrowSize); 3: Arrow := TArrowHeadDiamond.Create(ArrowSize); 4: Arrow := TArrowHeadCircle.Create(ArrowSize); else Arrow := nil; end; Box[0] := MakeBox(FBoxCenter[0], CBoxSize); Box[1] := MakeBox(FBoxCenter[1], CBoxSize); FBitmapFiller.Pattern := FPattern[0]; DashLineFS(ImgView32.Bitmap, Box[0], FDashes, FBitmapFiller, EndArrowPenColor, True, CBorderSize, 1.5); FBitmapFiller.Pattern := FPattern[1]; DashLineFS(ImgView32.Bitmap, Box[1], FDashes, FBitmapFiller, EndArrowPenColor, True, CBorderSize, 1.5); // now accommodate for CBorderSize width as above ... Box[0] := MakeBox(FBoxCenter[0], CBoxSizePlus); Box[1] := MakeBox(FBoxCenter[1], CBoxSizePlus); if BoxesOverlap(FBoxCenter[0], FBoxCenter[1], CBoxSizePlus) then begin StartPoint := FBoxCenter[0]; EndPoint := FBoxCenter[1]; end else begin StartPoint := GetNearestPointOnBox(FBoxCenter[1], FBoxCenter[0], Box[0]); EndPoint := GetNearestPointOnBox(FBoxCenter[0], FBoxCenter[1], Box[1]); end; Delta.X := StartPoint.X - FBoxCenter[0].X; Delta.Y := StartPoint.Y - FBoxCenter[0].Y; if Abs(Delta.X) > Abs(Delta.Y) then StartOffsetPt := FloatPoint(StartPoint.X + Delta.X * 2, StartPoint.Y) else StartOffsetPt := FloatPoint(StartPoint.X, StartPoint.Y + Delta.Y *2); Delta.X := EndPoint.X - FBoxCenter[1].X; Delta.Y := EndPoint.Y - FBoxCenter[1].Y; if Abs(Delta.X) > Abs(Delta.Y) then EndOffsetPt := FloatPoint(EndPoint.X + Delta.X * 2, EndPoint.Y) else EndOffsetPt := FloatPoint(EndPoint.X, EndPoint.Y + Delta.Y * 2); Poly := BuildPolygonF([StartPoint.X, StartPoint.Y, StartOffsetPt.X, StartOffsetPt.Y, EndOffsetPt.X, EndOffsetPt.Y, EndPoint.X, EndPoint.Y]); Poly := MakeBezierCurve(Poly); if Assigned(Arrow) then begin // shorten path at specified end(s) and draw ... case RgpPosition.ItemIndex of 0: Poly := Shorten(Poly, ArrowSize, lpStart); 1: Poly := Shorten(Poly, ArrowSize, lpEnd); 2: Poly := Shorten(Poly, ArrowSize, lpBoth); end; // draw the connecting line ... GradientFiller := TLinearGradientPolygonFiller.Create; try GradientFiller.SimpleGradient(Poly[0], StartArrowPenColor, Poly[High(Poly)], EndArrowPenColor); PolylineFS(ImgView32.Bitmap, Poly, GradientFiller, False, TbrLineWidth.Position); finally GradientFiller.Free; end; // draw specified arrows ... if RgpPosition.ItemIndex 1 then begin ArrowPts := Arrow.GetPoints(Poly, False); PolygonFS(ImgView32.Bitmap, ArrowPts, StartArrowColor); PolylineFS(ImgView32.Bitmap, ArrowPts, StartArrowPenColor, True, TbrLineWidth.Position); end; if RgpPosition.ItemIndex 0 then begin ArrowPts := Arrow.GetPoints(Poly, True); PolygonFS(ImgView32.Bitmap, ArrowPts, EndArrowColor); PolylineFS(ImgView32.Bitmap, ArrowPts, EndArrowPenColor, True, TbrLineWidth.Position); end; end else PolylineFS(ImgView32.Bitmap, Poly, clBlack32, False, TbrLineWidth.Position); end; |
上記以外にもGraphics32ライブラリでは、以下のような描画をサポートしており、詳しくはこちらのサンプルプログラムをご参照ください。
- AntiAliasing
- ArrowHead
- Benchmark
- Blurs
- Clipper
- CubicSpline
- Curves
- GammaBlur
- GammaCorrection
- GradFills
- GradLines
- GradSampler
- Grow
- LineStippling
- Lion
- MeshGradients
- Polygons
- RenderText
- ScatterPlot
- SvgPath
- TextVPR
- VertexReduction
Graphics32ライブラリはオープンプロジェクトで、こちらから入手できます。なお、エンバカデロではこのライブラリに関するテクニカルサポートサービスは提供しておりません。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition