Hi,
Over the last weekend I've implemented text rotate in GTK2. I've
implemented it in Gtk2WidgetSet.ExtTextOut. Since there is no way to
define that the font is rotated, TGtk2WidgetSet.CreateFontIndirectEx ..
lfEscapement can only be used to place the angle somewhere to
ExtTextOut to use.
The used functions (with gtk/pango version)
pango_matrix_rotate - gtk2.6
pango_matrix_translate - gtk2.6
pango_context_set_matrix - gtk2.6
pango_renderer_draw_layout - pango1.8
gdk_pango_renderer_get_default - gtk2.6
gdk_pango_renderer_set_drawable - gtk2.6
gdk_pango_renderer_set_gc - gtk2.6
gtk2.6 and pango1.8 where released in Dec 2004 so I guess i can be
implemented with no problems :)
I've defined in Gtk2int.pas
TPangoMatrix = record
xx: double;
xy: double;
yx: double;
yy: double;
x0: double;
y0: double;
end;
PTPangoMatrix = ^TPangoMatrix;
PPangoRenderer = pointer;
PGdkPangoRenderer = pointer;
procedure pango_font_description_set_gravity
(desc:PPangoFontDescription;gravity:TPangoGravity); cdecl; external
'libpango-1.0.so.0';
procedure pango_matrix_rotate(matrix: PPangoMatrix; degrees: double);
cdecl; external 'libpango-1.0.so.0';
procedure pango_matrix_translate(matrix: PPangoMatrix; tx, ty: double);
cdecl; external 'libpango-1.0.so.0';
procedure pango_matrix_scale (matrix: PPangoMatrix; scale_x, scale_y:
double); cdecl; external 'libpango-1.0.so.0';
procedure pango_context_set_matrix(context: PPangoContext; matrix:
PPangoMatrix); cdecl; external 'libpango-1.0.so.0';
procedure pango_renderer_draw_layout (renderer: PPangoRenderer; layout:
PPangoLayout; x,y: Integer); cdecl; external 'libpango-1.0.so.0';
function gdk_pango_renderer_get_default (screen: PGdkScreen):
PPangoRenderer; cdecl; external 'libgtk-x11-2.0.so';
procedure gdk_pango_renderer_set_drawable (gdk_renderer:
PGdkPangoRenderer; drawable: PGdkDrawable); cdecl; external
'libgtk-x11-2.0.so';
procedure gdk_pango_renderer_set_gc (gdk_renderer: PGdkPangoRenderer;
gc: PGdkGC); cdecl; external 'libgtk-x11-2.0.so';
and changed gtkwinapi.inc
procedure DoTextOut(X,Y : Integer; Str: Pchar; CurCount: Integer);
var
DevCtx: TDeviceContext;
CurScreenX: LongInt;
CharLen: LongInt;
WidgetCont: PPangoContext;
matrix: TPangoMatrix;
renderer: PPangoRenderer;
screen: PGdkScreen;
gc: PGdkGc;
begin
DevCtx:=TDeviceContext(DC);
if (Dx<>nil) then begin
CurScreenX:=X;
while CurCount>0 do begin
CharLen:=UTF8CharacterLength(CurStr);
//gdk_draw_glyphs(DevCtx.drawable,DevCtx.gc );
pango_layout_set_text(UseFont, CurStr, CharLen);
gdk_draw_layout_with_colors(DevCtx.drawable, DevCtx.GC,
CurScreenX, Y,
UseFont, Foreground, nil);
//gdk_draw_rectangle(DevCtx.Drawable,DevCtx.GC,1,CurScreenX,Y,3,3);
inc(CurScreenX,CurDx^);
inc(CurDx);
inc(CurStr,CharLen);
dec(CurCount,CharLen);
end;
end else begin //just changed this branch
pango_layout_set_text(UseFont, Str, Count);
renderer :=
gdk_pango_renderer_get_default( gtk_widget_get_screen(DevCtx.DCWidget) );
gdk_pango_renderer_set_drawable ( renderer, DevCtx.drawable);
gdk_pango_renderer_set_gc ( renderer, DevCtx.GC);
WidgetCont := pango_layout_get_context(UseFont);
matrix.xx := 1.0;
matrix.xy := 0.0;
matrix.yx := 0.0;
matrix.yy := 1.0;
matrix.x0 := 0.0;
matrix.y0 := 0.0;
pango_matrix_translate (@matrix, X, Y);
pango_matrix_rotate (@matrix, 285); //<--this is the angle
pango_context_set_matrix (WidgetCont, @matrix);
pango_layout_context_changed (UseFont);
pango_renderer_draw_layout (renderer, UseFont, X, Y);
gdk_pango_renderer_set_drawable ( renderer, nil);
gdk_pango_renderer_set_gc ( renderer, nil);
end;
end;
I could have done a patch but this code is just a proof of concept and
needs to be integrated in the correct files (with I don't know with they
are). So now we can have text rotate in Gtk2 also :)
regards,
Luis
On Wed, 2007-09-05 at 11:43 +0200, Mattias Gaertner wrote:
> On Tue, 04 Sep 2007 21:31:07 +0100
> Luis Rodrigues <[EMAIL PROTECTED]> wrote:
>
> > Hello,
> >
> > I was going to implement rotating text on GTK2 but just noticed that
> > pango_font_description_set_gravity, PangoGravity, etc are not defined
> > on FreePascal Pango bindings.
> >
> > I tried to find on GTK website and on FPC
> > (http://www.freepascal.org/packages/gtk.html) but had no luke :(
> >
> > Is anyone actively working on that?
>
> No.
>
> See lcl/interfaces/gtk2/gtk2winapi.inc
> TGtk2WidgetSet.CreateFontIndirectEx for lfEscapement.
>
> AFAIK rotating text needs pango 1.16, which is quite new and not all
> linux distributions contain it yet.
> So the gtk2 interface must check the pango version and then dynamically
> load the needed function.
>
>
> Mattias
>
> _________________________________________________________________
> To unsubscribe: mail [EMAIL PROTECTED] with
> "unsubscribe" as the Subject
> archives at http://www.lazarus.freepascal.org/mailarchives
_________________________________________________________________
To unsubscribe: mail [EMAIL PROTECTED] with
"unsubscribe" as the Subject
archives at http://www.lazarus.freepascal.org/mailarchives