powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная текстовая картинка
51 сообщений из 51, показаны все 3 страниц
Тяпничная текстовая картинка
    #38918959
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здарова челы!

Мои читуны тяпничных загадок. Хакатон-щики.
Фанаты сей. Рыцари крестов и Асма.
И прочие geeks.

Сегодня - особый тикет .

Дано - текстовая консоль. Какая? А вот такая. Как в линуксе. Или как cmd в Винде.
Дан - графический файлик. Маленький. Надо отобразить этот графический
файлик цветом в текстовой консоли. Максимально правдоподобно.

Пример:



P.S. Hardcore & Hardcode приветствуется! Mua-haha!

P.P.S. #include <ncurses.h> вам в помощь!

Go! Go!
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919075
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаем ресайз bmp из исходного разрешения в 80*25. Потом выводим.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919104
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaПотом выводим.
А с цветами что делать?
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919149
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА с цветами что делать?
До 16 уменьшить. Или сколько там консоль умеет показывать.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919179
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Библиотека ncurses различает 8 цветовых констант. Но что-то мне подсказывает что
можно сымитировать больше.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919202
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonБиблиотека ncurses различает 8 цветовых констант. Но что-то мне подсказывает что
можно сымитировать больше.
Можно псевдографику задействовать, тогда каждый "пиксель" станет 2х2, но с цветами такого пикселя тогда поизвращаться надо.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919207
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю не мелочиться и сразу видео отображать.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919216
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Go!Go! Давайте хотяб преведмир.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919218
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonБиблиотека ncurses различает 8 цветовых констант. Но что-то мне подсказывает что
можно сымитировать больше.
Можно псевдографику задействовать, тогда каждый "пиксель" станет 2х2, но с цветами такого пикселя тогда поизвращаться надо.
Там хитрые символы есть. Прямоугольник. Со штриховкой.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919271
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
quick&dirty.c
Код: plaintext
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.
#include <stdio.h>
#include <windows.h>   // WinApi header

int main()
{
  HANDLE  hConsole;
  int w, h, k;

  FILE *f = fopen("c.bmp", "rb");
  fseek(f, 0x12, 0);
  fread(&w, sizeof(w), 1, f);
  fread(&h, sizeof(h), 1, f);

  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

  // you can loop k higher to see more color choices
  for(int y = 0; y < h; y++)
  {
    fseek(f, 0x36+(h-y-1)*w*4, 0);
    for(int x = 0; x < w; x++)
    {
      int color, r, g, b;
      fread(&color, sizeof(color), 1, f);
      r = color & 0xFF;
      g = (color>>8) & 0xFF;
      b = (color>>16) & 0xFF;
      r >>= 7;
      g >>= 7;
      b >>= 7;
      int k = b<<2 | g<<1 | r;
      SetConsoleTextAttribute(hConsole, k);
      printf("Ы");
    }
    printf("\n");
  }

  getchar();  // wait
  return 0;
}


...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919314
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Р-Волк. Круть. Давай цветов больше.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919405
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

В принципе, без усилий добавляется 8 градаций яркости знакоместа (две родных консольных и четыре символами штриховки). С цветностью сложнее, в консольи под r,g,b отведено всего по одному биту. Можно что-то получить из смешивания цвета символа и фона теми же символами.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919545
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В табличке 866 есть несколько интересных букв.



Пробел (0x20), 0xB0, 0xB1, 0xB2, 0xDB. Можно используя цвет шрифта и (если есть backgroud)
добиться большего количества.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919661
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
#define FILL_0   0x20
#define FILL_25  0xB0
#define FILL_50  0xB1
#define FILL_75  0xB2
#define FILL_100 0xDB
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919916
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такое вот гониво вышло... Пока черно-белое.

Сорц не совсем мой. Прости википедия...

Код: plaintext
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.
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <math.h>
#include "bitmap.h" /* Здесь определения заголовков BMP как было описано выше в этой статье (структуры должны быть упакованы на 2 байта!) */


#define PS_FILL_EMPTY  0x20
#define PS_FILL_FULL   0xDB
#define PS_FILL_DOWN   0xDC
#define PS_FILL_UP     0xDF

/////////////////////////

#define FILL_0   0x20
#define FILL_25  0xB0
#define FILL_50  0xB1
#define FILL_75  0xB2
#define FILL_100 0xDB


double value(int r,int g,int b){
        return (0.299*(r&0xFF) + 0.587*(g&0xFF) + 0.114*(b&0xFF)) / 255.0;
}

double distance(int r1,int g1,int b1,int r2,int g2,int b2){
	int dr = r1 - r2;
	int dg = g1 - g2;
	int db = b1 - b2;
	return sqrt( 0.299 * (double)dr * dr + 0.587 * (double)dg * dg + 0.114 * (double)db * db);
}

 
main(int argc, char *argv[])
{
    int  n, w, h, fd, size;
    unsigned char *data;
    BITMAPFILEHEADER bmp;
    BITMAPINFOHEADER inf;

    char* buf;
 
 
    if ((fd = open(argv[1], O_RDONLY)) == -1) {
        printf("Error open bitmap\n");
        exit(1);
    }

    

    read(fd, &bmp, sizeof(BITMAPFILEHEADER));

    read(fd, &inf,sizeof(BITMAPINFOHEADER));
 
    w = inf.biWidth;
    h = inf.biHeight;

    printf("Image size (pix) : %d,%d \n",w,h);
 
    /*if ((dis = XOpenDisplay(getenv("DISPLAY"))) == NULL) {
	printf("Can't connect X server: %s\n", strerror(errno));
	exit(1);
    }
 
    win = XCreateSimpleWindow(dis, RootWindow(dis, DefaultScreen(dis)), 0, 0, width, height, 5,
                   BlackPixel(dis, DefaultScreen(dis)), WhitePixel(dis, DefaultScreen(dis)));
 
    XSetStandardProperties(dis, win, argv[1], argv[0], None, argv, argc, NULL);
    gc = DefaultGC(dis, DefaultScreen(dis));*/
 
 /* Иногда в структуре это место не заполнено */

    int linesize = w * 3 + w % 4;

    if(inf.biSizeImage == 0)  {
    /* Вычислим размер */
      size = w * 3 + w % 4;
      size = size * h;
    } else {
      size = inf.biSizeImage;
     }
 
    buf = malloc(size);

    if(buf == NULL) {
	perror("malloc");
	exit(1);
    }

    printf("size = %d allocated\n", size);
 
     /* Сместимся на начало самого изображения */
    lseek(fd, bmp.bfOffBits, SEEK_SET);
 
    /* Читаем в буфер */
    n = read(fd, buf, size);

    printf("size = %d readed\n", n);
    int x;
    int y;
    for(y=0;y<h;y++){
       for(x=0;x<w;x++){

           byte *p = buf + x * 3 + (h - y - 1) * linesize;

           int r = *p++;
           int g = *p++;
           int b = *p++;

           double v = value(r,g,b);

	   if (v<0.2){
              printf("%c",FILL_0);
           } else if (v<0.4){
              printf("%c",FILL_25);
           } else if (v<0.6){
              printf("%c",FILL_50);
           } else if (v<0.8){
              printf("%c",FILL_75);
           } else {
              printf("%c",FILL_100);
           }
       }
       printf("\n");
    }
 
    //image = CreateImageFromBuffer(dis, buf, width, height);
 
    /* Удалим буфер - он нам больше не нужен */
    free(buf);
 
    /*XMapWindow(dis, win);
    XSelectInput(dis, win, ExposureMask | KeyPressMask);
    while (1) {
	XNextEvent(dis, &event);
	if (event.xany.window == win) {
	    switch (event.type) {
	    case Expose:
		XPutImage(dis, win, gc, image, 0, 0, 0, 0, image->width, image->height);
		break;
 
	    case KeyPress:
		if (XLookupKeysym(&event.xkey, 0) == XK_q) {
		    XDestroyImage(image);
		    XCloseDisplay(dis);
    	    	    close(fd);
		    exit(EXIT_SUCCESS);
		}
		break;
 
	    default:
		break;
	    }
	}
    }*/
}
 
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919928
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот такое вот гониво вышло... Пока черно-белое.
Ты бы картинки показал "до" и "после", как RWolf сделал. Товар лицом посмотрел, после интересно и код глянуть. Не выйдет из тебя продавец :)
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919932
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я не продаю пока. Значить о проблемах.

Я задал 5 уровней квантования для Value (цветовая яркость). Это мало. Т.к.
слабо-контрастные Ч-Б картинки могут попадать на границу 0.4 - 0.6.
Это хреново. Необходимо перед преобразованием определять границы
гистограммы светимости и авто-нормировать чтобы min max были соот 0.0 - 1.0.
При этом 0.0 подразумевает что выборка пикселов 0.0-0.2 достаточно велика.
Не один и не два. А ощутимо велика.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919936
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919937
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919939
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неплохой результат. Можно еще поколдовать с палитрой. 16 цветов ограничение, но они же не фиксированные. В DOSе можно было палитру свою задать, в виндовсе - не знаю.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919941
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Касаемо виндовс.

Я полез в МСДН по ссылке на фунцию SetConsoleTextAttribute(...) которую использовал Р-Волк.

И оттуда вытянул следующее.
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes

Виндовс действительно управляет цветовыми атрибутами как ZX-Spectrum.
А именно (3 + 1) бита - активация системных цветов RGB + дополнительно интенсивность для беграунда.
И еще (3 + 1) бита для цвета шрифта на 1 знакоместе.

Итого 8 бит. Подозреваю что следующи битовые маски для этого предназначены.

Код: plaintext
1.
2.
3.
4.
5.
FOREGROUND_BLUE	Text color contains blue.
FOREGROUND_GREEN	Text color contains green.
FOREGROUND_RED	Text color contains red.
FOREGROUND_INTENSITY	Text color is intensified.
...



Не густо.... Ну что-ж попробуем.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919945
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй хотя бы эту в черно-серую превратить. Думаю лучше будет чем сине-голубая.
Мне кажется в данном случае перевод в оттенки серого должен дать более качественную картинку, чем пытаться цвет передать.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38919948
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сине-голубая это черно-белая. Которую я открыл в ФАР-е.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920296
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом приближении - работает.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920298
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О проблемах:

1) Низкая контрастность исходных данных. Экспериментально я установил что лучший результат получался
когда картинка предварительно имеет высокий уровень контраста. Для этого я использовал графические
тулзы чтобы нормировать наиболее информативные участки гистограммы во весь спектр 0..255 уровней по
трем каналам.

2) Антизотропность . Псевдографический блок имеет плохие пропорции. На картинке с Джери видно что ее
лицо сжато по вертикали довольно значительно. Что с этим делать - я не знаю. Наверное ничего. Оставлю как есть.
Чуть позже доработаю фильтр масштабирования чтобы поправить разрешение исходного материала (автоматически)
с учётом набора блочной псевдографики ( gray1 - 200%, color2 - 200%, color1 - 60% (приблизительно)).

3) Несостоятельность фомулы цветовой дистанции которую я использовал. Возможно она неплохо подходит
для точных цветовых расчётов но в палитре 16 системных цветов она даёт парадоксальные результаты.
Например в градиенте между синим белым внезапо появляется пурпурный. Объяснить я это не могу.
Или у меня баг в коде. Не в самой формуле дистанции а где-то дальше по коду ее применения.

Код: plaintext
1.
2.
3.
4.
5.
6.
double distance(int r1,int g1,int b1,int r2,int g2,int b2){
	double dr = 0.299 * (r1 - r2);
	double dg = 0.587 * (g1 - g2);
	double db = 0.114 * (b1 - b2);
	return sqrt(dr * dr + dg * dg + db * db);
}
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920305
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недоделанный пока сорц.

Код: plaintext
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.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <math.h>
#include <limits.h>

#include "bitmap.h" 

//#define DEB

#define FOREGROUND_BLUE	1
#define FOREGROUND_GREEN	2
#define FOREGROUND_RED	4
#define FOREGROUND_INTENSITY	8
#define BACKGROUND_BLUE	16
#define BACKGROUND_GREEN	32
#define BACKGROUND_RED	64
#define BACKGROUND_INTENSITY	128

////////////////////////////////////

#define PS_FILL_EMPTY  0x20
#define PS_FILL_FULL   0xDB
#define PS_FILL_DOWN   0xDC
#define PS_FILL_UP     0xDF

/////////////////////////

#define FILL_0   0x20
#define FILL_25  0xB0
#define FILL_50  0xB1
#define FILL_75  0xB2
#define FILL_100 0xDB

#define MODE_GRAY   1
#define MODE_COLOR1 2
#define MODE_COLOR2 3

double value(int r,int g,int b){
        return (0.299*(r&0xFF) + 0.587*(g&0xFF) + 0.114*(b&0xFF)) / 255.0;
}

double distance(int r1,int g1,int b1,int r2,int g2,int b2){
	double dr = 0.299 * (r1 - r2);
	double dg = 0.587 * (g1 - g2);
	double db = 0.114 * (b1 - b2);
	return sqrt(dr * dr + dg * dg + db * db);
}

void printColor(int r,int g,int b){
      #ifdef DEB
       printf("(%02X,%02X,%02X)",r,g,b);
      #endif
}


void drawColor2(int w,int h,int linesize,byte *buf,int inverse,HANDLE hConsole){
       fprintf(stderr,"\n::drawColor2(..) not implemented yet.\n");
       exit(-5);
}

// TODO: Warning! The height should be divided by 2
void drawColor1(int w,int h,int linesize,byte *buf,int inverse,HANDLE hConsole){
    if (h%2==1){
       fprintf(stderr,"\nThe height should be divided by 2\n");
       exit(-3);
    }
    int x;
    int y;
    for(y=0;y<h;y+=2){
       for(x=0;x<w;x++){
           
           byte *p1 = buf + x * 3 + (h - y - 1) * linesize;
           int b1 = *p1++;
           int g1 = *p1++;
           int r1 = *p1++;

           byte *p2 = buf + x * 3 + (h - y) * linesize;
           int b2 = *p2++;
           int g2 = *p2++;
           int r2 = *p2++;

           #ifdef DEB
           printf("(%d,%d) ",x,y);
           printColor(r1,g1,b1);
           printf("\n");
           #endif

           double v1min = 255.0; 
           double v2min = 255.0;

           int k;
           int re,ge,be;
           int rr1,gr1,br1,ir1;
           int rr2,gr2,br2,ir2;
           int ir;
           // TODO: This loop should be refactored logic or optimized 
           for(k=0;k<16;k++){
               re = 255 * ((k&0x04)?1:0);
               ge = 255 * ((k&0x02)?1:0);
               be = 255 * ((k&0x01)?1:0);
               // TODO: The grey level may be 192,192,192 or 128,128,128. I dont know.
               if (!(k&&0x08)){
                  re/=2;
                  ge/=2;
                  be/=2;
                  ir=0;
               } else {
                  ir=1;
               }
               double v1 = distance(r1,g1,b1,re,ge,be);
               double v2 = distance(r2,g2,b2,re,ge,be);
               if (v1<v1min){
                  v1min=v1;
                  #ifdef DEB
                  printf(" v1 = %f ",v1);
                  printColor(re,ge,be);
                  printf("\n");
                  #endif
                  rr1=re; // 0..255
                  gr1=ge; // 0..255
                  br1=be; // 0..255
                  ir1=ir; // 0..1
                  
               }
               if (v2<v2min){
                  v2min=v2;
                  #ifdef DEB
                  printf(" v2 = %f ",v2);
                  printColor(re,ge,be);
                  printf("\n");
                  #endif
                  rr2=re;
                  gr2=ge;
                  br2=be;
                  ir2=ir;
               }
           }
           #ifdef DEB
           printf(" [1]-> ");
           printColor(rr1,gr1,br1);
           printf("\n");
           printf(" [2]-> ");
           printColor(rr2,gr2,br2);
           printf("\n");
           #endif
           // TODO: To much complex. Should be simplifyed.
           SetConsoleTextAttribute(hConsole, 
                  (rr1?BACKGROUND_RED:0) |
                  (gr1?BACKGROUND_GREEN:0) |
                  (br1?BACKGROUND_BLUE:0) |
                  (ir1?BACKGROUND_INTENSITY:0) |
                  (rr2?FOREGROUND_RED:0) |
                  (gr2?FOREGROUND_GREEN:0) |
                  (br2?FOREGROUND_BLUE:0) |
                  (ir2?FOREGROUND_INTENSITY:0) 
           );
	   printf("%c",PS_FILL_UP);
       }
       printf("\n");
    }
}


void drawGray(int w,int h,int linesize,byte *buf,int inverse,HANDLE hConsole){
    int x;
    int y;
    for(y=0;y<h;y++){
       for(x=0;x<w;x++){
           byte *p = buf + x * 3 + (h - y - 1) * linesize;
           int r = *p++;
           int g = *p++;
           int b = *p++;
           double v = value(r,g,b);
           if (inverse){
              v = 1.0 - v;
           }
	   if (v<0.2){
              printf("%c",FILL_0);
           } else if (v<0.4){
              printf("%c",FILL_25);
           } else if (v<0.6){
              printf("%c",FILL_50);
           } else if (v<0.8){
              printf("%c",FILL_75);
           } else {
              printf("%c",FILL_100);
           }
       }
       printf("\n");
    }
}

 
main(int argc, char *argv[])
{
        int mode = 0;

	if (argc==1) {
		fprintf(stderr,"\nTextModeArt demo 1.0 (c) Mayton and SQL.RU. Written in 'C' :)\n");
		fprintf(stderr,"\nUsage: tma [inputfile.bmp] [-i] [ { -gray | -color1 | color2 } ]");
		fprintf(stderr,"\n");
		return -1;
	} else {

          HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);    
          int  n, w, h, fd, size;
          unsigned char *data;
          BITMAPFILEHEADER bmp;
          BITMAPINFOHEADER inf;
          char* buf;
          int inverse = 0;
          if ((fd = open(argv[1], O_RDONLY)) == -1) {
              fprintf(stderr,"Error open bitmap\n");
              return -1;
          }

          read(fd, &bmp, sizeof(BITMAPFILEHEADER));

          if (bmp.bfType!=0x4d42){
             fprintf(stderr,"This is not a Windows bitmap file!\n");
      	     return -2;
          }

          read(fd, &inf, sizeof(BITMAPINFOHEADER));

          //printf("inf.biBitCount = %d\n",inf.biBitCount);
          if (inf.biBitCount!=24) {
             fprintf(stderr,"The only 24-bit (TrueColor) images is supported! (Sorry...:()\n");
      	     return -6;
          }
       
          w = inf.biWidth;
          h = inf.biHeight;

          int linesize = w * 3 + w % 4;

          if(inf.biSizeImage == 0)  {
            size = linesize * h;
          } else {
            size = inf.biSizeImage;
           }
       
          buf = malloc(size);

          lseek(fd, bmp.bfOffBits, SEEK_SET);
       
          n = read(fd, buf, size);

          int cnt = 2;
          while(cnt<argc){
             char *arg = argv[cnt];
             if (!stricmp("-i",arg)){
                inverse = 1;
             } else if (!stricmp("-gray",  arg)){
                mode = MODE_GRAY;
             } else if (!stricmp("-color1",arg)){
                mode = MODE_COLOR1;
             } else if (!stricmp("-color2",arg)){
                mode = MODE_COLOR2;
             }
             cnt++;
          }
          
          switch(mode){
               case MODE_COLOR1:
                    drawColor1(w,h,linesize,buf,inverse,hConsole);
                    break;
               case MODE_COLOR2:       
                    drawColor2(w,h,linesize,buf,inverse,hConsole);
                    break;
               case MODE_GRAY:
                    drawGray(w,h,linesize,buf,inverse,hConsole);
               default:
                    fprintf(stderr,"Please select mode (gray, color...) !\n");
      	            return -4; 
          }
       
          free(buf);
       }
}
 

...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920314
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот демо дефекта №3 . В mspaint была создана картинка 80 на 50. Белый фон.
Затем были сделаны надписи. "R", "G", "B". И вот результат textModeArt:
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920353
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя.... какого чёрта? Посмотрел на оригинал. Там есть цветная окантовка.
Прям дисперсия света какая-то...
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920438
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton2) Антизотропность . Псевдографический блок имеет плохие пропорцииЕсли стандартные VGA-адаптер и VGA-монитор загнать в режим 80x60 (без уширения девятую колонку), то знакоместо будет строго квадратным. И по точкам (8x8 и физически).
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920460
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь не знаю что ответить.

Несколько мыслей.

Я базировался на информации с wiki.
http://en.wikipedia.org/wiki/VGA-compatible_text_mode#PC_common_text_modes

Мне помниться что в WinXP и более древних версях Far Manager мог переключаться
между графикой и текст-режимом 80x25, 80x50. Но к сожалению сейчас я воспроизвести
этот фокус не могу.

Кроме того, наше поделие должно работать в любом терминале поэтому исходить надо
скорее всего из здравого смысла. Каково может быть максимальное разрешение окна
терминала в пикс? И какова ширина (высота) 1 символа? Каков font? System?
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920499
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

размеры терминалов могут быть любыми. шрифты могут быть сколь угодно маленькими, а терминалы все виртуальные давно, так что просто можно любые размеры задавать.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920501
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На том и порешим. А это - игрушка для фриков. Кому интересно - чуть позже выложу поддержку режима Color2
где будет не 16 а порядка чуть менее 80 цветов на 1 знако-место.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920519
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ базировался на информации с wiki.
http://en.wikipedia.org/wiki/VGA-compatible_text_mode#PC_common_text_modes Даже в этой статье указано, что в режиме 80x50 размер знакоместа - 9x8, а разрешение - 720x400.
Это, конечно, несколько искажает пропорции, но гораздо меньше, чем 80x25. С учётом лучшей детализации - особого выбора не остаётся.

P.S. MS, конечно, чудаки, но даже в семёрке есть (растровый) шрифт 8x9.
С учётом (почти) гарантированной квадратности пикселя в оконном режиме текстовой консоли, с анизотропией можно не париться.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920522
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хех... какой-же я беспамятный. Никакой интерференции нету. Я вить про это читал раньше. Но щас вспомнил.

Вобщем эта хрень называется ClearType subpixel anti-aliased rendering. Рендеринг фонта который учитывает
цвет результирующего полу-пиксела который стоит слева или справа от глифа.

http://en.wikipedia.org/wiki/Font_rasterization

Отсюда и появление этого радужного ареала на увеличенной копии.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920523
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonэта хрень называется ClearType subpixel anti-aliased rendering
верно

В оттенках серого, эта хрень смотрелась бы нормально.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920602
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКасаемо виндовс.

Я полез в МСДН по ссылке на фунцию SetConsoleTextAttribute(...) которую использовал Р-Волк.

...Windows в консоле может графику рисовать, думаю можно и bmp картинку выводить

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#define _WIN32_WINNT 0x0500

#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    HDC dc;
    HWND hwnd = GetConsoleWindow();
    dc = GetDC(hwnd);

    HBRUSH hBrush = CreateSolidBrush(RGB(255,0,0));

    while(1)
    {
            RECT rect={ 100,100,200,200};

            Ellipse(dc,100,300,200,350);
            FillRect(dc, &rect, hBrush);
            Sleep(10);
    }
}

...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920630
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... думаю что мой первоначальный интерес состоял в том чтобы устройство
предназначенное для вывода только цветного текста (SSH-терминал) могло показать нечто
большее чем текст.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920875
kisssko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже одно время страдал подобным. Вот моя небольшая наработка:

Код: plaintext
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.
#include <stdio.h>
#include <math.h>
#include "tglaa.h"
#include "sysio.h"

u8 div3tab[96]=
{
	 0,  0,  0,  1,  1,  1,  2,  2,
	 2,  3,  3,  3,  4,  4,  4,  5,
	 5,  5,  6,  6,  6,  7,  7,  7,
	 8,  8,  8,  9,  9,  9, 10, 10,
	10, 11, 11, 11, 12, 12, 12, 13,
	13, 13, 14, 14, 14, 15, 15, 15,
	16, 16, 16, 17, 17, 17, 18, 18,
	18, 19, 19, 19, 20, 20, 20, 21,
	21, 21, 22, 22, 22, 23, 23, 23,
	24, 24, 24, 25, 25, 25, 26, 26,
	26, 27, 27, 27, 28, 28, 28, 29,
	29, 29, 30, 30, 30, 31, 31, 31
};

u8 tpal[]="   .-.:/+-,;%<?!*+$:/;@0<%?!*$@0";
u8 btab[]="00000100011000000101110011111111";

void print_fb(u16 *pfb, int w, int h)
{
	int otc=7;
	int x,y,c;
	u8 r,g,b,v,m;
	//io_gotoxy(1,1);
	for(y=0;y<h;y++)
	{
		io_gotoxy(1,y+1);
		for(x=0;x<w;x++)
		{
			v=0; c=0; m=0;
			r=*pfb>>11;
			g=(*pfb>>6)&0x1F;
			b=*pfb&0x1F;
			if(r>v)v=r;
			if(g>v)v=g;
			if(b>v)v=b;
			m=div3tab[r+g+b]; // m=(r+g+b)/3;
			if(r>=m)c|=4;
			if(g>=m)c|=2;
			if(b>=m)c|=1;
			//if(v&16)c|=8;
			if(btab[v]&1)c|=8;
			if(c!=otc)io_textcolor(c);
			otc=c;
			io_putchar(tpal[v]);
			pfb++;
		}
	}
	io_flush();
}




Вывод на экран легко реализуются самостоятельно. Функции io_* аналогичны тем, что в conio.h, но несколько расширен набор.
Так что, кому интересно - тестируйте. ;)

В догонку приведу свою реализацию ввода/вывода под винду.
Здесь используется буферный вывод. Это самый быстрый способ вывода на консоль в винде.
Перед использованием вызвать io_init(). Этот код был потенциально криво на спех вырезан из приложения. :)

sysio.с:

Код: plaintext
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.
#include "sysio.h"
#include "tglaa.h"

#ifdef _WIN32
HANDLE     sys_stdin;
HANDLE     sys_stdout;
HANDLE     sys_stderr;
COORD      zero_coord={0,0};
COORD      tbsz;
CHAR_INFO *txtbuf;
DWORD      tbidx=0;
DWORD      cm_old;
WORD       txa;


void update_winsize(void)
{
	CONSOLE_SCREEN_BUFFER_INFO sbi;
	GetConsoleScreenBufferInfo(sys_stdout, &sbi);
	tbsz.X=(SHORT)(sbi.srWindow.Right-sbi.srWindow.Left+1);
	tbsz.Y=(SHORT)(sbi.srWindow.Bottom-sbi.srWindow.Top+1);
}

void resize_handler(void)
{
	update_winsize();
}

BOOL WINAPI event_handler(DWORD ev)
{
	switch(ev)
	{
		case CTRL_C_EVENT:
		case CTRL_BREAK_EVENT:
		case CTRL_CLOSE_EVENT:
		case CTRL_LOGOFF_EVENT:
		case CTRL_SHUTDOWN_EVENT:
			break;
	}
	return TRUE;
}

#else
#endif

void io_init(void)
{
#ifdef _WIN32
	DWORD cm;
	sys_stdin	= GetStdHandle(STD_INPUT_HANDLE);
	sys_stdout	= GetStdHandle(STD_OUTPUT_HANDLE);
	sys_stderr	= GetStdHandle(STD_ERROR_HANDLE);
	GetConsoleMode(sys_stdin, &cm);
	cm_old=cm;
	SETBIT(cm,ENABLE_WINDOW_INPUT);
	SetConsoleMode(sys_stdin, cm);
	update_winsize();
	txtbuf=(CHAR_INFO*)malloc(tbsz.X*tbsz.Y*sizeof(CHAR_INFO));
#else
#endif
}

void io_cleanup(void)
{
#ifdef _WIN32
	free((void*)txtbuf);
	SetConsoleMode(sys_stdin, cm_old);
#else
#endif
}

void io_gotoxy(int x, int y)
{
#ifdef _WIN32
	x--;y--;
	tbidx=(DWORD)tbsz.X*y+x;
#else
#endif
}

void io_putchar(int c)
{
#ifdef _WIN32
	txtbuf[tbidx].Char.AsciiChar=(CHAR)c;
	txtbuf[tbidx].Attributes=txa;
	tbidx++;
#else
#endif
}

void io_textcolor(int c)
{
#ifdef _WIN32
	txa=(WORD)c;
#else
#endif
}

int io_kbhit(void)
{
	int ret=0;
#ifdef _WIN32
	DWORD n;
	INPUT_RECORD ev;
	PeekConsoleInputA(sys_stdin,&ev,1,&n);
	while(n)
	{
		ReadConsoleInputA(sys_stdin,&ev,1,&n);
		if((ev.EventType&KEY_EVENT)&&(ev.Event.KeyEvent.bKeyDown))
			ret=1;
		if(ev.EventType&MOUSE_EVENT)
			mouse_handler(&(ev.Event.MouseEvent));
		if(ev.EventType&WINDOW_BUFFER_SIZE_EVENT)
			resize_handler();
		PeekConsoleInputA(sys_stdin,&ev,1,&n);
	}
#else
#endif
	return ret;
}

void io_flush(void)
{
#ifdef _WIN32
	SMALL_RECT wrgn;
	wrgn.Top=0;
	wrgn.Left=0;
	wrgn.Right=tbsz.X-1;
	wrgn.Bottom=tbsz.Y-1;
	WriteConsoleOutputA(sys_stdout, txtbuf, tbsz, zero_coord, &wrgn);
#else
#endif
}

void io_clrscr(void)
{
#ifdef _WIN32
	int i,sz;
	CHAR_INFO ci;
	sz=((int)tbsz.X)*((int)tbsz.Y);
	ci.Char.AsciiChar=32;
	ci.Attributes=7;
	for(i=0;i<sz;i++) txtbuf[i]=ci;
	io_flush();
#else
#endif
}

int io_get_width(void)
{
#ifdef _WIN32
	return (int)tbsz.X;
#else
#endif
}

int io_get_height(void)
{
#ifdef _WIN32
	return (int)tbsz.Y;
#else
#endif
}

unsigned int io_get_ticks(void)
{
#ifdef _WIN32
	return (unsigned int)GetTickCount();
#else
#endif
}



sysio.h:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#ifdef _WIN32
#include <windows.h>
#define io_sleep(S) Sleep((DWORD)(S))
#endif

void io_init(void);
void io_cleanup(void);
void io_clrscr(void);
void io_gotoxy(int x, int y);
void io_putchar(int c);
void io_textcolor(int c);
void io_flush(void);
int  io_kbhit(void);
int  io_get_width(void);
int  io_get_height(void);
unsigned int io_get_ticks(void);



tglaa.h:

Код: plaintext
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.
typedef unsigned int   u32;
typedef unsigned short u16;
typedef unsigned char  u8;

typedef struct
{
	u8 R,G,B,A;
} RGBA8888_t;

typedef struct
{
	u16 B:5;
	u16 G:6;
	u16 R:5;
} BGR565_t;

typedef union
{
	u16       I;
	BGR565_t  C;
} COLOR16_t;


#define SETBIT(A,B) (A)|=(B)
#define CLRBIT(A,B) (A)&=(~(B))


...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920887
kisssko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S. Картинка во входном фреймбуфере должна быть 16bit RGB565.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920922
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38920977
kisssko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и сама программка :) Рендеринг сделан на коде TinyGL. Мыша работает! :)
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38921126
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kisssko Ну и сама программка :) Рендеринг сделан на коде TinyGL. Мыша работает! :)

Скажи пож., кому нужен екзешник для винды ?

Код с проектом -- это да, интересно.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38921139
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kissskohttp://kisssko.ru/Ну и сама программка :) Рендеринг сделан на коде TinyGL. Мыша работает! :)

Однако круть...
Я только не понял, что мышка делает...
Выделение какое-то ?
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38921361
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kisssko Ну и сама программка :) Рендеринг сделан на коде TinyGL. Мыша работает! :)
Это на базе этой штуки был создан Quake в TextMode?
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38921389
kisssko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivkissskohttp://kisssko.ru/Ну и сама программка :) Рендеринг сделан на коде TinyGL. Мыша работает! :)

Однако круть...
Я только не понял, что мышка делает...
Выделение какое-то ?

Вообще, мыша крутит и двигает сцену. Видимо, у вас в свойствах консоли включено выделение мышью.
Ещё размер консоли можно менять на лету.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38921393
kisssko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonkisssko Ну и сама программка :) Рендеринг сделан на коде TinyGL. Мыша работает! :)
Это на базе этой штуки был создан Quake в TextMode?

Нет. Там было через aalib. И рендерер родной квейковский.

P.S. Исходники выложу вечером.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38921600
kisssko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обещанные исходники tglaa.

tglaa static source
TinyGL Static Library source
TinyGL DLL source
Автор TinyGL не я. Только портировал и допилил работу с контекстом. :)

Проекты собираются под PellesC. Взять можно тут .
При желании легко переделать под MSVC++. Ничего зависимого там не должно быть, всё максимально портабельно.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38921616
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kisssko,

Здорово как...
А ты это с какой целью делал ?
Просто так, for fun ?
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38921623
kisssko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, почти. ;) Ну и ещё для отработки алгоритмов, чтоб потом использовать как шаблон для создания разных заставок в консоли unix, и т.д. Началось с того, что начал ковырять TinyGL. Изначально была идея использовать для генерации картинок в web. А потом захотелось потестить в реалтайме с анимацией. И вот нашлось ещё такое применение. :)

Вообще, это можно было сделать и с аппаратным OpenGL, только рендерить в оффскриновый фреймбуфер сначала.
Может как потом запилю... А пока мало времени и много работы.
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38921681
kisssko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНеплохой результат. Можно еще поколдовать с палитрой. 16 цветов ограничение, но они же не фиксированные. В DOSе можно было палитру свою задать, в виндовсе - не знаю.

SetConsoleScreenBufferInfoEx
CONSOLE_SCREEN_BUFFER_INFOEX
...
Рейтинг: 0 / 0
Тяпничная текстовая картинка
    #38943634
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кисско мне нравится твой файло-браузер.

http://kisssko.ru/
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная текстовая картинка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]