5 changed files with 332 additions and 0 deletions
-
3src/CMakeLists.txt
-
106src/Raster.cc
-
61src/Raster.h
-
3src/Rgba.h
-
159src/draw_triangle.cc
@ -0,0 +1,159 @@ |
|||||
|
#include <iostream>
|
||||
|
#include <math.h>
|
||||
|
#include <cairo.h>
|
||||
|
#include <gtk/gtk.h>
|
||||
|
#include "Rgba.h"
|
||||
|
#include "Raster.h"
|
||||
|
#include "common.h"
|
||||
|
|
||||
|
using namespace std; |
||||
|
|
||||
|
|
||||
|
gint height = 500; |
||||
|
gint width = 500; |
||||
|
|
||||
|
Raster raster(width, height); |
||||
|
|
||||
|
/**
|
||||
|
* 使用drawSpan画线 |
||||
|
*/ |
||||
|
void example1() { |
||||
|
Span span(100, 400, 250, Rgba(255, 0, 0, 0), Rgba(255, 0, 0, 0)); |
||||
|
|
||||
|
raster.drawSpan(span); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* 使用斜率画斜线 |
||||
|
*/ |
||||
|
void example2() { |
||||
|
|
||||
|
static int x = 0; |
||||
|
|
||||
|
if (x >= width) { |
||||
|
x = 0; |
||||
|
} |
||||
|
|
||||
|
Ege e2(x++, 50, 250, 250, Rgba(255, 0, 0, 0), Rgba(255, 0, 0, 0)); |
||||
|
|
||||
|
//计算跨度
|
||||
|
float xOffset = e2.x2 - e2.x1; |
||||
|
float yOffset = e2.y2 - e2.y1; |
||||
|
|
||||
|
//计算斜率
|
||||
|
float slope = xOffset / yOffset; |
||||
|
|
||||
|
//以跨度大
|
||||
|
for (float y = e2.y1; y < e2.y2; y++) { |
||||
|
float x; |
||||
|
// --> (x - e2.x1) / (y - e2.y1) = slope
|
||||
|
// --> x - e2. x1 = slope * (y - e2.y1)
|
||||
|
x = slope * (y - e2.y1) + e2.x1; |
||||
|
raster.setPixel(x, y, Rgba(255, 0, 0, 0)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void example3() { |
||||
|
//Ege e1(250, 250, 350, 50);
|
||||
|
//Ege e2(250, 250, 100, 150);
|
||||
|
|
||||
|
Ege e1(250, 250, 350, 50, Rgba(255, 0, 0, 0), Rgba(255, 0, 0, 0)); |
||||
|
Ege e2(100, 150, 350, 50, Rgba(255, 0, 0, 0), Rgba(255, 0, 0, 0)); |
||||
|
|
||||
|
raster.drawPoint(e1.x1, e1.y1, Rgba(255, 0, 0, 0), 3); |
||||
|
raster.drawPoint(e1.x2, e1.y2, Rgba(255, 0, 0, 0), 3); |
||||
|
|
||||
|
raster.drawPoint(e2.x1, e2.y1, Rgba(255, 0, 0, 0), 3); |
||||
|
raster.drawPoint(e2.x2, e2.y2, Rgba(255, 0, 0, 0), 3); |
||||
|
|
||||
|
raster.drawEge(e1, e2); |
||||
|
} |
||||
|
|
||||
|
void example4() { |
||||
|
|
||||
|
int2 p[3] = { |
||||
|
int2(50, 50), |
||||
|
int2(250, 250), |
||||
|
int2(300, 150) |
||||
|
}; |
||||
|
|
||||
|
// int2 p[3] = {
|
||||
|
// int2(100, 150),
|
||||
|
// int2(250, 250),
|
||||
|
// int2(350, 50)
|
||||
|
// };
|
||||
|
|
||||
|
Ege e0(p[0].x, p[0].y, p[1].x, p[1].y, Rgba(255, 0, 0, 0), Rgba(0, 255, 0, 0)); |
||||
|
Ege e1(p[1].x, p[1].y, p[2].x, p[2].y, Rgba(0, 255, 0, 0), Rgba(0, 0, 255, 0)); |
||||
|
Ege e2(p[2].x, p[2].y, p[0].x, p[0].y, Rgba(0, 0, 255, 0), Rgba(255, 0, 0, 0)); |
||||
|
|
||||
|
raster.drawPoint(e0.x1, e0.y1, Rgba(255, 0, 0, 0), 3); |
||||
|
raster.drawPoint(e0.x2, e0.y2, Rgba(255, 0, 0, 0), 3); |
||||
|
|
||||
|
raster.drawPoint(e2.x1, e2.y1, Rgba(255, 0, 0, 0), 3); |
||||
|
raster.drawPoint(e2.x2, e2.y2, Rgba(255, 0, 0, 0), 3); |
||||
|
|
||||
|
//raster.drawEge(e0, e1);
|
||||
|
//raster.drawEge(e0, e2);
|
||||
|
|
||||
|
|
||||
|
// raster.drawEge(e1, e0);
|
||||
|
// raster.drawEge(e1, e2);
|
||||
|
|
||||
|
|
||||
|
raster.drawTriangle(p[0], p[1], p[2], Rgba(255, 0, 0, 0), Rgba(0, 255, 0, 0), Rgba(0, 0, 255, 0)); |
||||
|
} |
||||
|
|
||||
|
unsigned char* makeBitmap() { |
||||
|
raster.clean(); |
||||
|
|
||||
|
example4(); |
||||
|
|
||||
|
return (unsigned char*) raster.buffer; |
||||
|
} |
||||
|
|
||||
|
void render(GtkWidget *widget) { |
||||
|
//允许窗口可以绘图
|
||||
|
gtk_widget_set_app_paintable(widget, TRUE); |
||||
|
gtk_widget_realize(widget); |
||||
|
gtk_widget_queue_draw(widget); |
||||
|
|
||||
|
//模拟一张图片
|
||||
|
unsigned char* data = makeBitmap(); |
||||
|
|
||||
|
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, TRUE, 8, width, height, width * 4, NULL, NULL); |
||||
|
|
||||
|
GdkPixmap *pixmap = NULL; |
||||
|
|
||||
|
gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, NULL, 128); |
||||
|
|
||||
|
gdk_window_set_back_pixmap(widget->window, pixmap, FALSE); |
||||
|
|
||||
|
g_object_unref(pixbuf); |
||||
|
g_object_unref(pixmap); |
||||
|
//delete data;
|
||||
|
} |
||||
|
|
||||
|
int main(int argc, char* argv[]) { |
||||
|
|
||||
|
gtk_init(&argc, &argv); |
||||
|
|
||||
|
//创建窗口
|
||||
|
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
||||
|
gtk_widget_set_size_request(window, width, height); |
||||
|
|
||||
|
gtk_window_set_title(GTK_WINDOW(window), "Gtk testing"); |
||||
|
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS); |
||||
|
|
||||
|
//窗口关闭时候,关闭程序
|
||||
|
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); |
||||
|
//设置渲染
|
||||
|
g_signal_connect(window, "expose-event", G_CALLBACK(render), window); |
||||
|
|
||||
|
|
||||
|
gtk_widget_show_all(window); |
||||
|
gtk_main(); |
||||
|
|
||||
|
return 0; |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue