Как потянуть график в кадровом буфере с помощью языка C..?

window.location.href содержит текущий URL. Можно читать из него, можно добавить к нему, и можно заменить его, который может вызвать перезагрузку страницы.

, Если, как это походит, Вы хотите записать состояние JavaScript в URL, таким образом, это может быть отмечено, не перезагружая страницу, добавьте его к текущему URL после # и имейте часть JavaScript, инициированного onload синтаксическим анализом события текущий URL, чтобы видеть, содержит ли это сохраненное состояние.

, Если Вы используете a? вместо # Вы вызовете перезагрузку страницы, но так как Вы проанализируете сохраненное состояние на загрузке, это не может на самом деле быть проблемой; и это сделает вперед, и кнопки "Назад" работают правильно также.

11
задан asveikau 2 December 2009 в 06:46
поделиться

2 ответа

Используйте open () в правом файле в / dev (например, / dev / fb0 ), затем используйте mmap () , чтобы отобразить его в памяти. Страницы управления помогут выполнить эти системные вызовы, если вы не знаете, как их использовать.

Кроме того, есть некоторые структуры и константы для некоторых ioctl () s в . Как и многие заголовки ядра, вы можете многому научиться, просто просматривая файл.

Особенно интересен ioctl FBIOGET_VSCREENINFO с struct fb_var_screeninfo . Обратите внимание, что это имеет xres , yres (разрешение) и битов на_пиксель . Затем есть FBIOGET_FSCREENINFO и struct fb_fix_screeninfo , которые содержат дополнительную информацию, такую ​​как type и line_length .

Итак, пиксель в (x, y) может быть на mmap_base_address + x * bits_per_pixel / 8 + y * line_length . Точный формат пикселей будет зависеть от структур, которые вы извлекаете с помощью ioctl; это ваша задача - решить, как их читать / записывать.

Я давно не работал с этим, поэтому я немного не уверен в деталях ..

Вот быстрый и грязный пример кода, просто чтобы проиллюстрируйте, как это делается ... Я это не тестировал.

#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/mman.h>

#include <linux/fb.h>

#include <unistd.h>
#include <fcntl.h>

#include <stdio.h>

int main()
{
   struct fb_var_screeninfo screen_info;
   struct fb_fix_screeninfo fixed_info;
   char *buffer = NULL;
   size_t buflen;
   int fd = -1;
   int r = 1;

   fd = open("/dev/fb0", O_RDWR);
   if (fd >= 0)
   {
      if (!ioctl(fd, FBIOGET_VSCREENINFO, &screen_info) &&
          !ioctl(fd, FBIOGET_FSCREENINFO, &fixed_info))
      {
         buflen = screen_info.yres_virtual * fixed_info.line_length;
         buffer = mmap(NULL,
                       buflen,
                       PROT_READ|PROT_WRITE,
                       MAP_SHARED,
                       fd,
                       0);
         if (buffer != MAP_FAILED)
         {
            /*
             * TODO: something interesting here.
             * "buffer" now points to screen pixels.
             * Each individual pixel might be at:
             *    buffer + x * screen_info.bits_per_pixel/8
             *           + y * fixed_info.line_length
             * Then you can write pixels at locations such as that.
             */

             r = 0;   /* Indicate success */
         }
         else
         {
            perror("mmap");
         }
      }
      else
      {
         perror("ioctl");
      }
   }
   else
   {
      perror("open");
   }

   /*
    * Clean up
    */
   if (buffer && buffer != MAP_FAILED)
      munmap(buffer, buflen);
   if (fd >= 0)
      close(fd);

   return r;
}
19
ответ дан 3 December 2019 в 04:52
поделиться

В качестве альтернативы ответу асвейкау вы можете использовать DirectFB , что может значительно упростить вам задачу.

4
ответ дан 3 December 2019 в 04:52
поделиться