Убраны лишние комментарии
This commit is contained in:
@@ -4,5 +4,5 @@ const DrawContext = pipeline.DrawContext;
|
||||
|
||||
const Object = Document.Object;
|
||||
|
||||
/// Рисует дугу (заглушка: пока не реализовано).
|
||||
/// Дуга (не реализовано).
|
||||
pub fn draw(_: *DrawContext, _: *const Object) void {}
|
||||
|
||||
@@ -9,7 +9,7 @@ const Object = Document.Object;
|
||||
const default_stroke: Color.PMA = .{ .r = 0, .g = 0, .b = 0, .a = 255 };
|
||||
const default_thickness: f32 = 2.0;
|
||||
|
||||
/// Рисует ломаную по точкам в локальных координатах. Обводка по stroke_rgba.
|
||||
/// Ломаная по точкам, обводка stroke_rgba.
|
||||
pub fn draw(ctx: *DrawContext, obj: *const Object) void {
|
||||
const p_prop = obj.getProperty(.points) orelse return;
|
||||
const pts = p_prop.points.items;
|
||||
|
||||
@@ -48,7 +48,7 @@ fn drawObject(ctx: *DrawContext, obj: *const Object, parent_transform: Transform
|
||||
}
|
||||
}
|
||||
|
||||
/// Рекурсивно рисует документ в буфер: сначала корневые объекты по порядку, затем их потомков (каждый следующий поверх предыдущего).
|
||||
/// Рекурсивно рисует документ в буфер (объекты и потомки по порядку).
|
||||
pub fn drawDocument(
|
||||
pixels: []@import("dvui").Color.PMA,
|
||||
buf_width: u32,
|
||||
@@ -68,8 +68,6 @@ pub fn drawDocument(
|
||||
.scale_x = scale_x,
|
||||
.scale_y = scale_y,
|
||||
};
|
||||
// вывести visible_rect
|
||||
std.debug.print("visible_rect: {{ x: {}, y: {}, w: {}, h: {} }}\n", .{ visible_rect.x, visible_rect.y, visible_rect.w, visible_rect.h });
|
||||
const identity = Transform{};
|
||||
for (document.objects.items) |*obj| {
|
||||
drawObject(&ctx, obj, identity);
|
||||
|
||||
@@ -7,7 +7,7 @@ const Color = @import("dvui").Color;
|
||||
const Object = Document.Object;
|
||||
const default_stroke: Color.PMA = .{ .r = 0, .g = 0, .b = 0, .a = 255 };
|
||||
|
||||
/// Рисует эллипс: центр (0,0), полуоси radii. Растеризация в координатах буфера (обводка кольцом).
|
||||
/// Эллипс с центром (0,0) и полуосями radii (обводка).
|
||||
pub fn draw(ctx: *DrawContext, obj: *const Object) void {
|
||||
const r_prop = obj.getProperty(.radii) orelse return;
|
||||
const rx = r_prop.radii.x;
|
||||
|
||||
@@ -7,7 +7,7 @@ const Object = Document.Object;
|
||||
const default_stroke: Color.PMA = .{ .r = 0, .g = 0, .b = 0, .a = 255 };
|
||||
const default_thickness: f32 = 2.0;
|
||||
|
||||
/// Рисует линию в локальных координатах: от (0,0) до end_point. Растеризация в координатах буфера (без пробелов при зуме).
|
||||
/// Линия от (0,0) до end_point.
|
||||
pub fn draw(ctx: *DrawContext, obj: *const Object) void {
|
||||
const ep_prop = obj.getProperty(.end_point) orelse return;
|
||||
const end_x = ep_prop.end_point.x;
|
||||
@@ -17,7 +17,7 @@ pub fn draw(ctx: *DrawContext, obj: *const Object) void {
|
||||
drawLine(ctx, 0, 0, end_x, end_y, stroke, thickness);
|
||||
}
|
||||
|
||||
/// Линия по локальным координатам фигуры: переводит концы в буфер и рисует в пикселях буфера.
|
||||
/// Рисует отрезок по локальным концам (перевод в буфер внутри).
|
||||
pub fn drawLine(ctx: *DrawContext, x0: f32, y0: f32, x1: f32, y1: f32, color: Color.PMA, thickness: f32) void {
|
||||
const w0 = ctx.localToWorld(x0, y0);
|
||||
const w1 = ctx.localToWorld(x1, y1);
|
||||
@@ -26,7 +26,6 @@ pub fn drawLine(ctx: *DrawContext, x0: f32, y0: f32, x1: f32, y1: f32, color: Co
|
||||
drawLineInBuffer(ctx, b0.x, b0.y, b1.x, b1.y, color, thickness);
|
||||
}
|
||||
|
||||
/// Брезенхем в координатах буфера; пиксели вне [0, buf_width) x [0, buf_height) пропускаются.
|
||||
fn drawLineInBuffer(ctx: *DrawContext, bx0: i32, by0: i32, bx1: i32, by1: i32, color: Color.PMA, thickness: f32) void {
|
||||
const bw = ctx.buf_width;
|
||||
const bh = ctx.buf_height;
|
||||
|
||||
@@ -7,14 +7,14 @@ const Scale2_f = basic_models.Scale2_f;
|
||||
const Rect_i = basic_models.Rect_i;
|
||||
const Color = dvui.Color;
|
||||
|
||||
/// Трансформ объекта в мировых координатах документа (позиция, угол, масштаб, непрозрачность).
|
||||
/// Трансформ объекта: позиция, угол, масштаб, непрозрачность.
|
||||
pub const Transform = struct {
|
||||
position: Point2_f = .{},
|
||||
angle: f32 = 0,
|
||||
scale: Scale2_f = .{},
|
||||
opacity: f32 = 1.0,
|
||||
|
||||
/// Композиция: мировой трансформ = parent * local (local в пространстве родителя).
|
||||
/// Композиция: world = parent * local.
|
||||
pub fn compose(parent: Transform, local: Transform) Transform {
|
||||
const cos_a = std.math.cos(parent.angle);
|
||||
const sin_a = std.math.sin(parent.angle);
|
||||
@@ -36,8 +36,7 @@ pub const Transform = struct {
|
||||
}
|
||||
};
|
||||
|
||||
/// Единый конвейер: принимает позицию в локальных координатах фигуры и цвет пикселя,
|
||||
/// применяет трансформ (вращение, масштаб, перенос) и непрозрачность, накладывает на буфер.
|
||||
/// Конвейер отрисовки: локальные координаты -> трансформ -> буфер.
|
||||
pub const DrawContext = struct {
|
||||
pixels: []Color.PMA,
|
||||
buf_width: u32,
|
||||
@@ -51,7 +50,7 @@ pub const DrawContext = struct {
|
||||
self.transform = t;
|
||||
}
|
||||
|
||||
/// Локальные координаты фигуры -> мировые (документ).
|
||||
/// Локальные -> мировые.
|
||||
pub fn localToWorld(self: *const DrawContext, local_x: f32, local_y: f32) Point2_f {
|
||||
const t = &self.transform;
|
||||
const cos_a = std.math.cos(t.angle);
|
||||
@@ -62,7 +61,7 @@ pub const DrawContext = struct {
|
||||
};
|
||||
}
|
||||
|
||||
/// Мировые координаты документа -> координаты в буфере (float; могут быть вне [0, buf_w] x [0, buf_h]).
|
||||
/// Мировые -> буфер (float).
|
||||
pub fn worldToBufferF(self: *const DrawContext, wx: f32, wy: f32) Point2_f {
|
||||
const canvas_x = wx * self.scale_x;
|
||||
const canvas_y = wy * self.scale_y;
|
||||
@@ -74,7 +73,7 @@ pub const DrawContext = struct {
|
||||
};
|
||||
}
|
||||
|
||||
/// Мировые координаты документа -> целочисленные координаты в буфере (округление до ближайшего пикселя).
|
||||
/// Мировые -> буфер (целые).
|
||||
pub fn worldToBuffer(self: *const DrawContext, wx: f32, wy: f32) Point2_i {
|
||||
const b = self.worldToBufferF(wx, wy);
|
||||
return .{
|
||||
@@ -83,7 +82,7 @@ pub const DrawContext = struct {
|
||||
};
|
||||
}
|
||||
|
||||
/// Координаты буфера -> мировые (документ). scale_x/scale_y не должны быть 0.
|
||||
/// Буфер -> мировые.
|
||||
pub fn bufferToWorld(self: *const DrawContext, buf_x: f32, buf_y: f32) Point2_f {
|
||||
const vx = @as(f32, @floatFromInt(self.visible_rect.x));
|
||||
const vy = @as(f32, @floatFromInt(self.visible_rect.y));
|
||||
@@ -97,7 +96,7 @@ pub const DrawContext = struct {
|
||||
};
|
||||
}
|
||||
|
||||
/// Мировые координаты -> локальные фигуры (обратное к localToWorld).
|
||||
/// Мировые -> локальные.
|
||||
pub fn worldToLocal(self: *const DrawContext, wx: f32, wy: f32) Point2_f {
|
||||
const t = &self.transform;
|
||||
const dx = wx - t.position.x;
|
||||
@@ -112,14 +111,13 @@ pub const DrawContext = struct {
|
||||
};
|
||||
}
|
||||
|
||||
/// Смешивает цвет в пикселе буфера (bx, by). color уже в PMA; opacity трансформа применяется к альфе и к RGB.
|
||||
/// Смешивает цвет в пикселе буфера с учётом opacity трансформа.
|
||||
pub fn blendPixelAtBuffer(self: *DrawContext, bx: u32, by: u32, color: Color.PMA) void {
|
||||
if (bx >= self.buf_width or by >= self.buf_height) return;
|
||||
const t = &self.transform;
|
||||
const idx = by * self.buf_width + bx;
|
||||
const dst = &self.pixels[idx];
|
||||
const a = @as(f32, @floatFromInt(color.a)) / 255.0 * t.opacity;
|
||||
// PMA: color.r/g/b уже помножены на color.a; при opacity только масштабируем их на t.opacity
|
||||
const src_r = @as(f32, @floatFromInt(color.r)) * t.opacity;
|
||||
const src_g = @as(f32, @floatFromInt(color.g)) * t.opacity;
|
||||
const src_b = @as(f32, @floatFromInt(color.b)) * t.opacity;
|
||||
@@ -130,7 +128,7 @@ pub const DrawContext = struct {
|
||||
dst.a = @intFromFloat(std.math.clamp(a * 255 + inv_a * @as(f32, @floatFromInt(dst.a)), 0, 255));
|
||||
}
|
||||
|
||||
/// Записывает пиксель в локальных координатах фигуры с учётом трансформа и прозрачности (PMA blend).
|
||||
/// Пиксель в локальных координатах (трансформ + PMA).
|
||||
pub fn blendPixelLocal(self: *DrawContext, local_x: f32, local_y: f32, color: Color.PMA) void {
|
||||
const w = self.localToWorld(local_x, local_y);
|
||||
const b = self.worldToBufferF(w.x, w.y);
|
||||
@@ -143,7 +141,7 @@ pub const DrawContext = struct {
|
||||
}
|
||||
};
|
||||
|
||||
/// u32 в порядке 0xRRGGBBAA: старший байт R, младший A (чёрный = 0x000000FF).
|
||||
/// Конвертирует u32 0xRRGGBBAA в Color.PMA.
|
||||
pub fn rgbaToPma(rgba: u32) Color.PMA {
|
||||
const r: u8 = @intCast((rgba >> 24) & 0xFF);
|
||||
const g: u8 = @intCast((rgba >> 16) & 0xFF);
|
||||
|
||||
Reference in New Issue
Block a user