Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вт ноя 21, 2017 7:29 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 8 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Общие вопросы по языку Си.
СообщениеДобавлено: Сб июн 17, 2017 7:42 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Я только учусь и в связи с этим, есть несколько воросов по языку Си.

1. Не могу понять как залить буфер 3-х байтовым цветом (красным цветом).
Делаю так:
Код:
#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 на Си.
Сделал так:
Код:
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:


Вернуться к началу
 Заголовок сообщения: Re: Общие вопросы по языку Си.
СообщениеДобавлено: Сб июн 17, 2017 9:45 pm 
Не в сети
Kernel Developer

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


Вернуться к началу
 Заголовок сообщения: Re: Общие вопросы по языку Си.
СообщениеДобавлено: Сб июн 17, 2017 11:01 pm 
Не в сети
Аватара пользователя

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

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
 Заголовок сообщения: Re: Общие вопросы по языку Си.
СообщениеДобавлено: Пн июн 26, 2017 5:19 pm 
Не в сети
Аватара пользователя

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

Что не так?

Изображение

Код:
#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:


Вернуться к началу
 Заголовок сообщения: Re: Общие вопросы по языку Си.
СообщениеДобавлено: Пн июн 26, 2017 6:17 pm 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
Странно, должен получиться красный прямоугольник с двумя первыми желтыми точками (


Вернуться к началу
 Заголовок сообщения: Re: Общие вопросы по языку Си.
СообщениеДобавлено: Вт июн 27, 2017 12:21 am 
Не в сети
Аватара пользователя

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

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
 Заголовок сообщения: Re: Общие вопросы по языку Си.
СообщениеДобавлено: Вт июн 27, 2017 6:10 am 
Не в сети

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

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


Вернуться к началу
 Заголовок сообщения: Re: Общие вопросы по языку Си.
СообщениеДобавлено: Вт июн 27, 2017 7:28 am 
Не в сети
Аватара пользователя

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

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 8 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB