-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcanvas.cpp
125 lines (104 loc) · 2.89 KB
/
canvas.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <QPainter>
#include <QBrush>
#include <QDebug>
#include <QMouseEvent>
#include "canvas.h"
#include "image_editor.h"
#include "utility.h"
#include "graphics_formats/abstract_format.h"
#include "palette_container.h"
#include "palette_manager.h"
canvas::canvas(image_editor *parent, QByteArray *b, palette_manager *controller) :
QWidget(parent)
{
buffer = b;
palette_controller = controller;
}
void canvas::scroll_tiles(int delta)
{
offset_y += delta;
offset_y = clamp(offset_y, 0, qMax((tile_count-x_tiles*y_tiles)/x_tiles, 0));
update();
}
void canvas::set_scale(int scale_factor)
{
scale = scale_factor;
setMinimumSize(x_tiles * tile_width * scale, qMin(y_tiles * tile_height * scale, 512));
setMaximumWidth(x_tiles * tile_width * scale);
update();
}
void canvas::set_format(abstract_format *image_format)
{
format = image_format;
x_tiles = format->default_x_tiles();
y_tiles = format->default_y_tiles();
tile_count = format->max_tiles();
tiles = format->get_tiles(0, tile_count);
palette_container palette = palette_controller->get_palette(2);
for(auto &tile : tiles){
tile.image.setColorTable(palette.get_subpalette(256, 0));
}
set_scale(scale);
}
void canvas::set_tile_palette(int palette)
{
tiles[position_to_tile(mouse_current)].palette = palette;
}
void canvas::set_tile_subpalette(int subpalette)
{
tiles[position_to_tile(mouse_current)].subpalette = subpalette;
}
void canvas::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.fillRect(0, 0, x_tiles * tile_width * scale, y_tiles * tile_height * scale, Qt::black);
for(int y = offset_y; y < offset_y + y_tiles && y < tiles.size() / x_tiles; y++){
for(int x = 0; x < x_tiles; x++){
QImage image = tiles[y * x_tiles + x].image.scaled(tile_width * scale, tile_height * scale);
painter.drawImage(x * tile_width * scale, (y - offset_y) * tile_height * scale, image);
}
}
QPen pen(Qt::white, 1);
painter.setPen(pen);
QPoint point = clip_to_tile(mouse_current);
painter.drawRect(point.x(), point.y(), 8*scale, 8*scale);
}
void canvas::mousePressEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton){
event->accept();
mouse_held = true;
mouse_press = event->pos();
mouse_current = event->pos();
update();
}
}
void canvas::mouseMoveEvent(QMouseEvent *event)
{
if(mouse_held){
event->accept();
mouse_current = event->pos();
update();
}
}
void canvas::mouseReleaseEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton && mouse_held){
event->accept();
mouse_release = event->pos();
mouse_current = event->pos();
update();
}
}
QPoint canvas::clip_to_tile(QPoint point)
{
return {(point.x() - point.x() % (scale * 8)), (point.y() - point.y() % (scale * 8))};
}
int canvas::position_to_tile(QPoint position)
{
position = clip_to_tile(position);
int x = position.x() / scale / 8;
int y = position.y() / scale / 8;
return y * y_tiles + x;
}