Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Jun 26, 2019 1:21 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 35 posts ]  Go to page 1 2 3 Next
Author Message
PostPosted: Sat Jun 17, 2017 7:42 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
Я только учусь и в связи с этим, есть несколько воросов по языку Си.

1. Не могу понять как залить буфер 3-х байтовым цветом (красным цветом).
Делаю так:
Code:
#define IMG_WIDTH  70
#define IMG_HEIGHT 50

unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH*3);
unsigned int *p_img = NULL;

p_img = (unsigned int*)malloc(img_len);
if (p_img==NULL) exit (1);

for (unsigned int i; i < img_len; )
{
  p_img[i++] = 0x00;
  p_img[i++] = 0x00;
  p_img[i++] = 0xff;
}
но не получается... Какая-то сетка получается. Использую функцию для вывода изображения определённую в "newlib", как "draw_bitmap" в файле "kos32sys.h".

2. Как оформить код заливки в функцию, чтобы можно было передать 3-х байтовый цвет в аргумент функции? Может сделать аргумент данных с типом данных void? Чего-то понять немогу.

3. Как сделать рабочую функцию 65 на Си.
Сделал так:
Code:
static inline void draw_image(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int bpp, void *img)
{
    __asm__ __volatile__(
    "int $0x40"
    ::"a"(65), "b"(img),
    "c"((w << 16) | h),
    "d"((x << 16) | y),
    "S"(bpp),
    "D"(0),
    "ebp"(0));
}

компилируется, но не работает. Как исправить, чтобы работала?

Помогите пожалуйста. :roll:

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Sat Jun 17, 2017 9:45 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Code:
unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH*3);
unsigned int *p_img = NULL;
Размер int 32 бита. Тебе надо использовать char.
Я бы рекомендовал не мучиться с невыравненным доступом и использовать 32-х битный цвет и функцию Blit() для вывода.


Top
   
PostPosted: Sat Jun 17, 2017 11:01 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
Serge wrote:
Code:
unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH*3);
unsigned int *p_img = NULL;
Размер int 32 бита. Тебе надо использовать char.
Большое спасибо за помощь, заработало. :D
Ох уж эти типы данных, как же с ними трудно. Аж мозги кипят! Bash scripting значительно проще, имхо. :roll:
Serge wrote:
Я бы рекомендовал не мучиться с невыравненным доступом и использовать 32-х битный цвет и функцию Blit() для вывода.
Спасибо. Буду разбираться. :)

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Mon Jun 26, 2017 5:19 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
Прошу помощи. :roll: Опять ничего не получается. Никак не могу понять, в чём проблема. Наверно опять, что-то напутал с типами данных, но немогу понять, что именно. Сделал вывод в окно двух буферов, функцией Blit из newlib: первый буфер (p_img) залит красным цветом, второй (p_img2) жёлтым. В буфер залитый красным цветом хотел встроить изображение из второго буфера, просидел вчера целый день, но так ничего и не получилось. Написал функцию, которая неработает, с которой очень долго мучался, но позже понял, что дело не в функции. Закоментировал функцию и попробовал поместить в первый буфер два пикселя, жёлтого цвета. Но, получились теже яйца, только в профиль выводится красный прямоугольник с жёлтой полосой по вертикали, толщиной в два пикселя, а должен быть красный прямоугольник с желтой полосой по горизонтали, длиной в два пикселя. :(

Что не так?

Image

Code:
#include <stdlib.h>
#include <kos32sys.h>

#define IMG_WIDTH   70
#define IMG_HEIGHT  50
#define IMG2_WIDTH  30
#define IMG2_HEIGHT 20

static char *title="Window";
static char *text ="Program written in C language!";

//unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH*sizeof(int));
static unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH);
static unsigned int *p_img = NULL;

static unsigned int img2_len = (IMG2_HEIGHT*IMG2_WIDTH);
static unsigned int *p_img2 = NULL;

//void image_inject(int x, int y, int src_w, int src_h, void *src_img, int dst_w, int dst_h, void *dst_img);

//void image_inject(int x, int y, int src_w, int src_h, int *src_img, int dst_w, int dst_h, int *dst_img){

//int dst_offset = (dst_w * y) + x;

//  for (unsigned int i = 0; i < 5; i++)
//  {
//    dst_img[dst_offset+i] = src_img[i];
//  }

//}

void create_window(){
        BeginDraw();
        DrawWindow(100,100,400,200,title,0x80ffffff,0x13);
        EndDraw();
        Blit(p_img, 10, 30, 0, 0, IMG_WIDTH, IMG_HEIGHT, IMG_WIDTH, IMG_HEIGHT, 0);
        Blit(p_img2, 10, 90, 0, 0, IMG2_WIDTH, IMG2_HEIGHT, IMG2_WIDTH, IMG2_HEIGHT, 0);
}

int main(int argc, char** argv[])
{

p_img = (unsigned int*)malloc(img_len*4);
if (p_img==NULL) exit (1);
p_img2 = (unsigned int*)malloc(img2_len*4);
if (p_img2==NULL) exit (1);

for (unsigned int i = 0; i < img_len; i++)
{
  p_img[i] = 0x00ff0000;
}

for (unsigned int i = 0; i < img2_len; i++)
{
  p_img2[i] = 0x00ffff00;
}

p_img[0] = 0x00ffff00;
p_img[1] = 0x00ffff00;

// image_inject(2, 2, IMG2_WIDTH, IMG2_HEIGHT, p_img2, IMG_WIDTH, IMG_HEIGHT, p_img);

    create_window();
    for (;;)
    {
    switch(get_os_event())
   {
   case 1:
       create_window();
            continue;
   case 2:
       get_key();
            continue;
   case 3:
       // button pressed; we have only one button, close
            if(get_os_button()==1) return 0;
            continue;
   }
    }
}

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Mon Jun 26, 2017 6:17 pm 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
Странно, должен получиться красный прямоугольник с двумя первыми желтыми точками (


Top
   
PostPosted: Tue Jun 27, 2017 12:21 am 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
Всё, разобрался. Наконец программа заработала. :D Метадом тыка, понял в чём была проблема. Надо было, в последнем параметре функции Blit, указать ширину изображения умноженную на 4. Не понимаю, почему нельзя было сделать это умножение в ядре. :roll:

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Tue Jun 27, 2017 6:10 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
JohnXenox wrote:
ширину изображения умноженную на 4. Не понимаю, почему нельзя было сделать это умножение в ядре. :roll:
Наверное, потому что Stride — это не всегда SrcWidth*4(почему это так — вопрос другой). А говоришь: "Разобрался".

Вот тут что-то про Image Stride: https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx


Top
   
PostPosted: Tue Jun 27, 2017 7:28 am 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
0CodErr wrote:
Наверное, потому что Stride — это не всегда SrcWidth*4(почему это так — вопрос другой). А говоришь: "Разобрался".
Я имел ввиду, что разобрался с проблемой. :roll:
0CodErr wrote:
Спасибо за ссылку, почитаю. :)

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Wed Oct 03, 2018 2:49 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
Появились несколько вопросов:
1. Можно ли как-то подцепить бинарник (написанный на FASM) в KTCC (средствами KTCC)?
2. Кто-нибудь может подсказать, как грузить LIBIMG.OBJ в KTCC? Мне нужно сделать вывод картинок (.png, .jpg, .gif), а я не знаю как. Желательно средствами KTCC.

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Wed Oct 03, 2018 4:09 pm 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 141
JohnXenox wrote:
2. Кто-нибудь может подсказать, как грузить LIBIMG.OBJ в KTCC? Мне нужно сделать вывод картинок (.png, .jpg, .gif), а я не знаю как. Желательно средствами KTCC.

А ты знаешь, как загрузить произвольную obj-библиотеку (ф68.19), получить таблицу экспорта и связать ее с указателями на функции?


Top
   
PostPosted: Wed Oct 03, 2018 4:41 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5053
Посмотри по аналогии с загрузкой console.obj в tte.
Недавно было обсуждение и коммит этого редактора.

_________________
Через тернии к звездам


Top
   
PostPosted: Wed Oct 03, 2018 4:53 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
akron1 wrote:
А ты знаешь, как загрузить произвольную obj-библиотеку (ф68.19), получить таблицу экспорта и связать ее с указателями на функции?
Не знаю. Задаю вопросы по мере поступления.

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Wed Oct 03, 2018 4:55 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
Leency wrote:
Посмотри по аналогии с загрузкой console.obj в tte.
Недавно было обсуждение и коммит этого редактора.
Спасибо. Посмотрю.

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Wed Oct 03, 2018 5:30 pm 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 141
Не всё так просто.

В библиотеке libimg.obj есть функция lib_init, которая принимает 4 параметра в регистрах eax, ebx, ecx, edx (указатели на функции):
eax = malloc
ebx = free
ecx = realloc
edx = dll_load
эту функцию надо вызвать до первого использования библиотеки. Причем, функция dll_load довольно сложная: она принимает указатель на таблицу импорта, загружает библиотеку, получает таблицу экспорта и заполняет таблицу импорта данными из таблицы экспорта. А также вызывает функцию инициализации библиотеки.

В библиотеке console.obj функции lib_init нет, и поэтому подцепить библиотеку console.obj проще.


Top
   
PostPosted: Wed Oct 03, 2018 6:14 pm 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
JohnXenox wrote:
Появились несколько вопросов:
1. Можно ли как-то подцепить бинарник (написанный на FASM) в KTCC (средствами KTCC)?
2. Кто-нибудь может подсказать, как грузить LIBIMG.OBJ в KTCC? Мне нужно сделать вывод картинок (.png, .jpg, .gif), а я не знаю как. Желательно средствами KTCC.

Там есть готовый загрузчик.
Делай по образцу из \libc\stdio\conio.c

объявления импортов аналогично в conio.h


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 35 posts ]  Go to page 1 2 3 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited