Форум: "Прочее";
Текущий архив: 2009.09.27;
Скачать: [xml.tar.bz2];
ВнизПомогите перевести код на паскаль Найти похожие ветки
← →
Художник (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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c