Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.27;
Скачать: CL | DM;

Вниз

Помогите перевести код на паскаль   Найти похожие ветки 

 
Художник   (2009-07-26 03:00) [0]

Структуры уже в паскале

type
cairo_path_data_t = record
   case LongInt of
     0 : ( header : record
           _type : cairo_path_data_type_t;
           length : LongInt;
         end );
     1 : ( point : record
           x : Double;
           y : Double;
         end );
 end;
Pcairo_path_data_t = ^cairo_path_data_t;

type
cairo_path_t = record
   status : cairo_status_t;
   data : Pcairo_path_data_t;
   num_data : LongInt;
 end;
Pcairo_path_t = ^cairo_path_t;

cairo_copy_path() возвращает в Pcairo_path_t

Собсно сам код.

{
   String string = "";
   cairo_path_t* path = cairo_copy_path(platformPath()->m_cr);
   cairo_path_data_t* data;

.....

 for (int i = 0; i < path->num_data; i += path->data[i].header.length) {
       data = &path->data[i];



Вот непонятно каким образом может быть data[i]? и как можно это обойти. Единственное что приходит на ум делать сделать динамический массив и ему присвоить указатель на поле data. Попробовал. Вроде работает, но както странно. Допустим вводишь четыре точки, возвращает восемь. И поля через один чередуются со всякой чухней.

Кстати это с++?

да привожу полную процедуру может там что напутал. Хотя недолжно бы...

procedure TForm1.Button1Click(Sender: TObject);
var
 cr: Pcairo_t;
 Surfase: Pcairo_surface_t;
 dc: THandle;
 pt: Pcairo_path_t;
 data: array of cairo_path_data_t;
 x: integer;
begin
 Surfase := cairo_win32_surface_create_with_dib(CAIRO_FORMAT_ARGB32, 300, 300);

 cr := cairo.cairo_create(Surfase);
 cairo_scale(cr, 300, 300);

 cairo_set_source_rgba(cr, 1, 1, 1, 1);
 cairo_paint(cr);

 cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);

 cairo_move_to(cr, 0, 0);
 cairo_line_to(cr, 0.8, 0.8);
 cairo_line_to(cr, 0.4, 0.8);
 cairo_line_to(cr, 0, 0);

 
/////////////////////////////////////////////////
 pt := cairo_copy_path(cr);
 setlength(data, pt.num_data);
 pointer(data) := pt.data;

 for x := 0 to pt.num_data - 1 do
 begin
 showmessage(inttostr(data[x].header.length));
   memo1.Lines.Add(floattostr(data[x].point.x) + "x" + floattostr(data[x].point.y));

   case data[x].header._type of
     CAIRO_PATH_MOVE_TO: showmessage("CAIRO_PATH_MOVE_TO");
     CAIRO_PATH_LINE_TO: showmessage("CAIRO_PATH_LINE_TO");
     CAIRO_PATH_CURVE_TO: showmessage("CAIRO_PATH_CURVE_TO");
     CAIRO_PATH_CLOSE_PATH: showmessage("CAIRO_PATH_CLOSE_PATH");
   end;
 end;
 ////////////////////////////////////////////////////

 cairo_set_source_rgba(cr, 1, 0, 1, 1);
 cairo.cairo_fill(cr);
 cairo_stroke(cr);

 cairo_destroy(cr);

 dc := cairo_win32_surface_get_dc(Surfase);
 bitblt(canvas.Handle, 0, 0, 300, 300, dc, 0, 0, SRCCOPY);

 cairo_surface_destroy(Surfase);

end;


 
TUser ©   (2009-07-26 07:12) [1]


> Вот непонятно каким образом может быть data[i]

Это указатель. Вместо массивов используется - указатель на первый элемент. То есть разумнее написать Pcairo_path_data_t (longint (data) + i * sizeof (cairo_path_data_t)) или вообще заменить на массив (но тогда, возможно, думать придется).



Страницы: 1 вся ветка

Текущий архив: 2009.09.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.009 c
1-1216360184
GraySE
2008-07-18 09:49
2009.09.27
WebBrowser - изменения на странице до её отображения


11-1205706977
AMDX4
2008-03-17 01:36
2009.09.27
KOL + Linux


15-1248444891
TStas
2009-07-24 18:14
2009.09.27
Какие книжки посоветуете про API функции?


15-1248467648
Германн
2009-07-25 00:34
2009.09.27
Успеют или не успеют к строку в этом году?


15-1248650332
Petr V. Abramov
2009-07-27 03:18
2009.09.27
Центры НТТМ