8 changed files with 331 additions and 25 deletions
-
5CMakeLists.txt
-
11src/CMakeLists.txt
-
50src/Raster.cc
-
7src/Raster.h
-
68src/draw_filled_rect.cc
-
95src/drawbezzier.cc
-
102src/drawline.cc
-
18src/gtktest.cc
@ -0,0 +1,68 @@ |
|||
#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); |
|||
|
|||
unsigned char* makeBitmap() { |
|||
raster.clean(); |
|||
|
|||
raster.drawFilledRect(100, 100, 150, 500); |
|||
|
|||
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; |
|||
} |
@ -0,0 +1,95 @@ |
|||
#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 rester(width, height); |
|||
|
|||
unsigned char* makeBitmap() { |
|||
rester.clean(); |
|||
|
|||
/*贝塞尔的4个点*/ |
|||
float2 points[] = { |
|||
float2(50, 50), |
|||
float2(200, 50), |
|||
float2(33, 88), |
|||
float2(159, 100) |
|||
}; |
|||
|
|||
/*划线的两个点*/ |
|||
float2 actPoint[2]; |
|||
|
|||
for (float t = 0; t < 1; t += 0.01f) { |
|||
float x = points[0].x * pow(1 - t, 3) |
|||
+ 3 * points[1].x * t * pow(1 - t, 2) |
|||
+ 3 * points[2].x * t * t * (1 - t) |
|||
+ points[3].x * t * t * t; |
|||
float y = points[0].y * pow(1 - t, 3) |
|||
+ 3 * points[1].y * t * pow(1 - t, 2) |
|||
+ 3 * points[2].y * t * t * (1 - t) |
|||
+ points[3].y * t * t * t; |
|||
if (t == 0) { |
|||
actPoint[0] = float2(x, y); |
|||
} else { |
|||
actPoint[1] = float2(x, y); |
|||
rester.drawArray(DM_LINES, actPoint, 2); |
|||
actPoint[0] = actPoint[1]; |
|||
} |
|||
} |
|||
|
|||
return (unsigned char*) rester.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; |
|||
} |
@ -0,0 +1,102 @@ |
|||
#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); |
|||
|
|||
unsigned char* makeBitmapRand() { |
|||
unsigned char* data = new unsigned char[width * height * 4]; |
|||
for (int i = 0; i < width * height * 4; i++) { |
|||
data[i] = rand() % 255; |
|||
} |
|||
return data; |
|||
} |
|||
|
|||
unsigned char* makeBitmap() { |
|||
raster.clean(); |
|||
|
|||
for (int i = 0; i < 100; i++) { |
|||
raster.drawPoint(rand() % height, rand() % width, Rgba(255, 0, 0), 3); |
|||
} |
|||
|
|||
raster.drawLine(float2(100, 100), float2(100, 222), Rgba(255, 0, 0)); |
|||
raster.drawLine(float2(100, 100), float2(400, 400), Rgba(255, 0, 0), Rgba(0, 255, 0)); |
|||
|
|||
|
|||
float2 arrPoints[] = { |
|||
float2(11, 34), |
|||
float2(33, 66), |
|||
float2(1, 100), |
|||
float2(22, 88), |
|||
float2(100, 1) |
|||
}; |
|||
|
|||
raster.drawArray(DM_LINES_TRIP, arrPoints, sizeof (arrPoints) / sizeof (arrPoints[0])); |
|||
|
|||
float2 center(250, 250); |
|||
float radius = 80; |
|||
float2 arrCircle[360]; |
|||
|
|||
for (int i = 0; i < 180; i++) { |
|||
arrCircle[i].x = radius * cos(def2rad(i)) + center.x; |
|||
arrCircle[i].y = radius * sin(def2rad(i)) + center.y; |
|||
} |
|||
raster.drawArray(DM_LINES_TRIP, arrCircle, sizeof (arrCircle) / sizeof (arrCircle[0])); |
|||
|
|||
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