File: vtgraphicsi.inc

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (67 lines) | stat: -rw-r--r-- 2,038 bytes parent folder | download | duplicates (12)
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
uses
  gtkdef, gtkint, CairoXlib, gdk, Cairo, glib;

//procedure gdk_drawable_get_size(drawable: PGdkDrawable; width, height: Pgint); cdecl; external gdkdll;

procedure AlphaBlend(Source, Destination: HDC; const R: TRect; const Target: TPoint; Mode: TBlendMode; ConstantAlpha, Bias: Integer);

  function CreateSurface(GtkDC: TGtkDeviceContext): Pcairo_surface_t;
  var
    Width, Height: gint;
    Visual: PGdkVisual;
  begin
    Result := nil;
    if (GtkDC <> nil) and (GtkDC.Drawable <> nil) then
    begin
      gdk_window_get_size(GtkDC.Drawable, @Width, @Height);
      Visual := gdk_visual_get_system;
      Result := cairo_xlib_surface_create(
        GDK_WINDOW_XDISPLAY(PGdkWindowPrivate(GtkDC.Drawable)),
        GDK_WINDOW_XWINDOW(PGdkWindowPrivate(GtkDC.Drawable)),
        GDK_VISUAL_XVISUAL(PGdkVisualPrivate(Visual)),
        Width, Height);
    end;
  end;

var
  SrcDC: TGtkDeviceContext absolute Source;
  DestDC: TGtkDeviceContext absolute Destination;
  SrcSurface, DestSurface: Pcairo_surface_t;
  SrcContext, DestContext: Pcairo_t;
begin
  case Mode of
    bmConstantAlpha:;
    bmPerPixelAlpha:;
    bmMasterAlpha:;
    bmConstantAlphaAndColor:
      begin
        DestSurface := CreateSurface(DestDC);
        if DestSurface <> nil then
        begin
          DestContext := cairo_create(DestSurface);
          cairo_set_source_rgba(DestContext,
            (Bias and $000000FF) / 255,
            ((Bias shr 8) and $000000FF) / 255,
            ((Bias shr 16) and $000000FF) / 255,
            ConstantAlpha / 255
            );
          cairo_rectangle(DestContext, R.Left + Target.x, R.Top + Target.y,
            R.Right - R.Left, R.Bottom - R.Top);
          cairo_fill(DestContext);

          cairo_destroy(DestContext);
          cairo_surface_destroy(DestSurface);
        end;
      end;
  end;
end;

function CalculateScanline(Bits: Pointer; Width, Height, Row: Integer): Pointer;
begin
  Result := nil;
end;

function GetBitmapBitsFromBitmap(Bitmap: HBITMAP): Pointer;
begin
  Result := nil;
end;