Browse Source

draw rect

master
blobt 5 years ago
parent
commit
359db9d64d
  1. 5
      CMakeLists.txt
  2. 11
      src/CMakeLists.txt
  3. 50
      src/Raster.cc
  4. 7
      src/Raster.h
  5. 68
      src/draw_filled_rect.cc
  6. 95
      src/drawbezzier.cc
  7. 102
      src/drawline.cc
  8. 18
      src/gtktest.cc

5
CMakeLists.txt

@ -15,5 +15,10 @@ include_directories(${GTK2_INCLUDE_DIRS})
link_directories(${GTK2_LIBRARY_DIRS})
list(APPEND FC_DEP_LIBS ${GTK2_LIBRARIES})
set(commom_src
Rgba.cc
Raster.cc
)
add_subdirectory(src)

11
src/CMakeLists.txt

@ -1,4 +1,13 @@
add_executable(gtktest gtktest.cc Rgba.cc Rester.cc)
add_executable(draw_filled_rect draw_filled_rect.cc ${commom_src})
target_link_libraries (draw_filled_rect ${FC_DEP_LIBS})
add_executable(drawbezzier drawbezzier.cc ${commom_src})
target_link_libraries (drawbezzier ${FC_DEP_LIBS})
add_executable(drawline drawline.cc ${commom_src})
target_link_libraries (drawline ${FC_DEP_LIBS})
add_executable(gtktest gtktest.cc ${commom_src})
target_link_libraries (gtktest ${FC_DEP_LIBS})
add_executable(timer timer.cc)

src/Rester.cc → src/Raster.cc

src/Rester.h → src/Raster.h

68
src/draw_filled_rect.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;
}

95
src/drawbezzier.cc

@ -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;
}

102
src/drawline.cc

@ -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;
}

18
src/gtktest.cc

@ -3,7 +3,7 @@
#include <cairo.h>
#include <gtk/gtk.h>
#include "Rgba.h"
#include "Rester.h"
#include "Raster.h"
#include "common.h"
using namespace std;
@ -12,7 +12,7 @@ using namespace std;
gint height = 500;
gint width = 500;
Rester rester(width, height);
Raster raster(width, height);
unsigned char* makeBitmapRand() {
unsigned char* data = new unsigned char[width * height * 4];
@ -23,14 +23,14 @@ unsigned char* makeBitmapRand() {
}
unsigned char* makeBitmap() {
rester.clean();
raster.clean();
for (int i = 0; i < 100; i++) {
rester.drawPoint(rand() % height, rand() % width, Rgba(255, 0, 0), 3);
raster.drawPoint(rand() % height, rand() % width, Rgba(255, 0, 0), 3);
}
rester.drawLine(float2(100, 100), float2(100, 222), Rgba(255, 0, 0));
rester.drawLine(float2(100, 100), float2(400, 400), Rgba(255, 0, 0), Rgba(0, 255, 0));
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[] = {
@ -41,7 +41,7 @@ unsigned char* makeBitmap() {
float2(100, 1)
};
rester.drawArray(DM_LINES_TRIP, arrPoints, sizeof (arrPoints) / sizeof (arrPoints[0]));
raster.drawArray(DM_LINES_TRIP, arrPoints, sizeof (arrPoints) / sizeof (arrPoints[0]));
float2 center(250, 250);
float radius = 80;
@ -51,9 +51,9 @@ unsigned char* makeBitmap() {
arrCircle[i].x = radius * cos(def2rad(i)) + center.x;
arrCircle[i].y = radius * sin(def2rad(i)) + center.y;
}
rester.drawArray(DM_LINES_TRIP, arrCircle, sizeof (arrCircle) / sizeof (arrCircle[0]));
raster.drawArray(DM_LINES_TRIP, arrCircle, sizeof (arrCircle) / sizeof (arrCircle[0]));
return (unsigned char*) rester.buffer;
return (unsigned char*) raster.buffer;
}
void render(GtkWidget *widget) {

Loading…
Cancel
Save