aboutsummaryrefslogtreecommitdiffstats
path: root/emulators/x49gp/files/grayscale.diff
blob: c207d1d4209f8a39995b4f1faddef7089e7bf737 (plain) (blame)
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
Index: include/x49gp_ui.h
===================================================================
--- include/x49gp_ui.h	(revision 11)
+++ include/x49gp_ui.h	(working copy)
@@ -15,6 +15,22 @@
 	UI_COLOR_SILVER,
 	UI_COLOR_ORANGE,
 	UI_COLOR_BLUE,
+	UI_COLOR_GRAYSCALE_0,
+	UI_COLOR_GRAYSCALE_1,
+	UI_COLOR_GRAYSCALE_2,
+	UI_COLOR_GRAYSCALE_3,
+	UI_COLOR_GRAYSCALE_4,
+	UI_COLOR_GRAYSCALE_5,
+	UI_COLOR_GRAYSCALE_6,
+	UI_COLOR_GRAYSCALE_7,
+	UI_COLOR_GRAYSCALE_8,
+	UI_COLOR_GRAYSCALE_9,
+	UI_COLOR_GRAYSCALE_10,
+	UI_COLOR_GRAYSCALE_11,
+	UI_COLOR_GRAYSCALE_12,
+	UI_COLOR_GRAYSCALE_13,
+	UI_COLOR_GRAYSCALE_14,
+	UI_COLOR_GRAYSCALE_15,
 	UI_COLOR_MAX
 } x49gp_ui_color_t;
 
Index: s3c2410_lcd.c
===================================================================
--- s3c2410_lcd.c	(revision 11)
+++ s3c2410_lcd.c	(working copy)
@@ -94,6 +94,32 @@
 	}
 }
 
+static int
+x49gp_get_pixel_color(s3c2410_lcd_t *lcd, int x, int y)
+{
+	uint32_t bank, addr, data, offset, pixel_offset;
+	int bits_per_pixel = lcd->lcdcon5 > 2 ? 1 : 4 >> lcd->lcdcon5;
+
+	bank = (lcd->lcdsaddr1 << 1) & 0x7fc00000;
+	addr = bank | ((lcd->lcdsaddr1 << 1) & 0x003ffffe);
+
+	pixel_offset = (160 * y + x) * bits_per_pixel;
+	offset = (pixel_offset >> 3) & 0xfffffffc;
+
+	data = ldl_phys(addr + offset);
+	data >>= pixel_offset & 31;
+	data &= (1 << bits_per_pixel) - 1;
+
+	switch (bits_per_pixel) {
+		case 1:
+			return 15 * data;
+		case 2:
+			return 15 & (lcd->bluelut >> (2 * data));
+		default:
+			return data;
+	}
+}
+
 void
 x49gp_lcd_update(x49gp_t *x49gp)
 {
@@ -100,8 +126,7 @@
 	x49gp_ui_t *ui = x49gp->ui;
 	s3c2410_lcd_t *lcd = x49gp->s3c2410_lcd;
 	GdkRectangle rect;
-	uint32_t bank, addr, offset, data;
-	int row, i, b, x, y;
+	int color, x, y;
 
 	if (!(lcd->lcdcon1 & 1)) {
 		gdk_draw_drawable(ui->lcd_pixmap, ui->window->style->bg_gc[0],
@@ -111,70 +136,45 @@
 		goto done;
 	}
 
-	bank = (lcd->lcdsaddr1 << 1) & 0x7fc00000;
-	addr = bank | ((lcd->lcdsaddr1 << 1) & 0x003ffffe);
-
 	gdk_draw_drawable(ui->lcd_pixmap, ui->window->style->bg_gc[0],
 			  ui->bg_pixmap,
 			  ui->lcd_x_offset, ui->lcd_y_offset,
 			  0, 0, ui->lcd_width, ui->lcd_height);
 
-	data = ldl_phys(addr + 16);
-	if (data & (1 << 3)) {
-		gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_io_gc, TRUE,
-				   236, 0, 15, 12);
-	}
-	data = ldl_phys(addr + 36);
-	if (data & (1 << 3)) {
-		gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_left_gc, TRUE,
-				   11, 0, 15, 12);
-	}
-	data = ldl_phys(addr + 56);
-	if (data & (1 << 3)) {
-		gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_right_gc, TRUE,
-				   56, 0, 15, 12);
-	}
-	data = ldl_phys(addr + 76);
-	if (data & (1 << 3)) {
-		gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_alpha_gc, TRUE,
-				   101, 0, 15, 12);
-	}
-	data = ldl_phys(addr + 96);
-	if (data & (1 << 3)) {
-		gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_battery_gc, TRUE,
-				   146, 0, 15, 12);
-	}
-	data = ldl_phys(addr + 116);
-	if (data & (1 << 3)) {
-		gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_busy_gc, TRUE,
-				   191, 0, 15, 12);
-	}
+	color = x49gp_get_pixel_color(lcd, 131, 0);
+	gdk_gc_set_rgb_fg_color(ui->ann_io_gc, &(ui->colors[UI_COLOR_GRAYSCALE_0 + color]));
+	gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_io_gc, TRUE, 236, 0, 15, 12);
 
-	offset = 0;
-	for (row = 0; row < ui->lcd_height / 2; row++) {
-		y = 2 * row;
-		x = 0;
-		for (i = 0; i < 5; i++) {
-			data = ldl_phys(addr + offset);
-			offset += sizeof(uint32_t);
+	color = x49gp_get_pixel_color(lcd, 131, 1);
+	gdk_gc_set_rgb_fg_color(ui->ann_left_gc, &(ui->colors[UI_COLOR_GRAYSCALE_0 + color]));
+	gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_left_gc, TRUE, 11, 0, 15, 12);
 
-			for (b = 0; b < 32; b++) {
-				if (data & (1 << b)) {
-					gdk_draw_rectangle(ui->lcd_pixmap,
-							   ui->window->style->fg_gc[0],
-							   TRUE, x, y + ui->lcd_top_margin, 2, 2);
-				}
-				x += 2;
+	color = x49gp_get_pixel_color(lcd, 131, 2);
+	gdk_gc_set_rgb_fg_color(ui->ann_right_gc, &(ui->colors[UI_COLOR_GRAYSCALE_0 + color]));
+	gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_right_gc, TRUE, 56, 0, 15, 12);
 
-				if (x >= ui->lcd_width) {
-					break;
-				}
-			}
+	color = x49gp_get_pixel_color(lcd, 131, 3);
+	gdk_gc_set_rgb_fg_color(ui->ann_alpha_gc, &(ui->colors[UI_COLOR_GRAYSCALE_0 + color]));
+	gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_alpha_gc, TRUE, 101, 0, 15, 12);
+
+	color = x49gp_get_pixel_color(lcd, 131, 4);
+	gdk_gc_set_rgb_fg_color(ui->ann_battery_gc, &(ui->colors[UI_COLOR_GRAYSCALE_0 + color]));
+	gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_battery_gc, TRUE, 146, 0, 15, 12);
+
+	color = x49gp_get_pixel_color(lcd, 131, 5);
+	gdk_gc_set_rgb_fg_color(ui->ann_busy_gc, &(ui->colors[UI_COLOR_GRAYSCALE_0 + color]));
+	gdk_draw_rectangle(ui->lcd_pixmap, ui->ann_busy_gc, TRUE, 191, 0, 15, 12);
+
+	for (y = 0; y < (ui->lcd_height - ui->lcd_top_margin) / 2; y++) {
+		for (x = 0; x < ui->lcd_width / 2; x++) {
+			color = x49gp_get_pixel_color(lcd, x, y);
+			gdk_gc_set_rgb_fg_color(ui->window->style->fg_gc[0],
+								  &(ui->colors[UI_COLOR_GRAYSCALE_0 + color]));
+			gdk_draw_rectangle(ui->lcd_pixmap, ui->window->style->fg_gc[0], TRUE,
+							   2 * x, 2 * y + ui->lcd_top_margin, 2, 2);
 		}
 	}
 
-	addr = bank | ((lcd->lcdsaddr2 << 1) & 0x003ffffe);
-
 done:
 	rect.x = 0;
 	rect.y = 0;
Index: ui.c
===================================================================
--- ui.c	(revision 11)
+++ ui.c	(working copy)
@@ -2285,7 +2285,24 @@
 	x49gp_ui_color_init(&ui->colors[UI_COLOR_ORANGE], 0xc0, 0x6e, 0x60);
 	x49gp_ui_color_init(&ui->colors[UI_COLOR_BLUE], 0x40, 0x60, 0xa4);
 
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_0], 0xab, 0xd2, 0xb4);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_1], 0xa0, 0xc4, 0xa8);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_2], 0x94, 0xb6, 0x9c);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_3], 0x89, 0xa8, 0x90);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_4], 0x7d, 0x9a, 0x84);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_5], 0x72, 0x8c, 0x78);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_6], 0x67, 0x7e, 0x6c);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_7], 0x5b, 0x70, 0x60);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_8], 0x50, 0x62, 0x54);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_9], 0x44, 0x54, 0x48);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_10], 0x39, 0x46, 0x3c);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_11], 0x2e, 0x38, 0x30);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_12], 0x22, 0x2a, 0x24);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_13], 0x17, 0x1c, 0x18);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_14], 0x0b, 0x03, 0x0c);
+	x49gp_ui_color_init(&ui->colors[UI_COLOR_GRAYSCALE_15], 0x00, 0x00, 0x00);
 
+
 	ui->lcd_canvas = gtk_drawing_area_new();
 	gtk_drawing_area_size(GTK_DRAWING_AREA(ui->lcd_canvas),
 			      ui->lcd_width, ui->lcd_height);