На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

mapPaintMapObjectToDib не рисует в буфер

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 След.
RSS
mapPaintMapObjectToDib не рисует в буфер, При отрисовки объекта карты не рисуется в память
 
Здравствуйте, при разработке под Linux использую такой код для отрисовки иконок объектов в точке на карте. На linux все нормально отрабатывает, на Windows буфер пустой, где может быть ошибка? Версия GTK FREE 13.2.1.1.

Код
QIcon ListObjectDialog::getObjectIcon(HOBJ obj)
{
    RECT ClientRect;

    int ClientHeight = 64;
    int ClientWidth = 64;
     MAPDFRAME frame;
     mapObjectFrame(obj, &frame);
     mapPlaneToPicture(map, &frame.X1, &frame.Y1);
     mapPlaneToPicture(map, &frame.X2, &frame.Y2);
     double scale = ClientWidth/(abs(frame.X2 - frame.X1)*1.000000);
     double scale2 = ClientHeight/(abs(frame.Y2 - frame.Y1)*1.000000);
     if(scale2 < scale) scale = scale2;
     double oldscale = mapGetRealShowScale(map);
     long x = 0;
     long y = 0;
     if(mapObjectLocal(obj) == LOCAL_SQUARE) {
         scale = scale/2;
     }
     mapChangeViewScale(map, &x, &y, scale);



      mapObjectFrame(obj, &frame);
      DOUBLEPOINT _Center;
      _Center.X = 0.5*(frame.X1+frame.X2);
      _Center.Y = 0.5*(frame.Y1+frame.Y2);

      mapPlaneToPicture(map, &_Center.X, &_Center.Y);

      RECT rect;
     rect.LT = _Center.X - ClientWidth/2 ;
     rect.UP = _Center.Y - ClientHeight/2 ;
     rect.RT = rect.LT + ClientWidth;
     rect.DN = rect.UP + ClientHeight;

    XIMAGEDESC desc;
    memset((void*) &desc, 0, sizeof(desc));
    desc.Width = rect.right - rect.left;
    desc.Height = rect.bottom - rect.top;
    desc.Depth = 32;
    desc.CellSize = desc.Depth / 8;
    desc.RowSize = desc.Width * desc.CellSize;
    desc.Point = (char*) malloc(desc.Height * desc.RowSize);

    memset((void*) desc.Point, 0, desc.Height * desc.RowSize);
    mapPaintMapObjectToDib(map, desc.Point, desc.Width, desc.Height,
                           &rect, nullptr, obj);
    QImage im((const uchar*) desc.Point, desc.Width, desc.Height, desc.RowSize,
              QImage::Format_ARGB32);
    im = im.scaled(48, 48);

    mapSetRealShowScale(map, oldscale);
    free(desc.Point);

    return QPixmap::fromImage(im);

}
 
Здравствуйте.

При кроссплатформенном использовании функции mapPaintMapObjectToDib, необходимо учитывать, что DIB для Windows будет заполнен построчно в обратном порядке (последняя строка области рисования будет первой строкой в выделенной памяти).
При этом для Windows в функцию необходимо передать указатель на последнюю строку в выделенной памяти.  

Изменено: Константин Ганюшин - 10.03.2021 17:28:50 (Уточнение)
 
Для функции рисования под Windows, указатель на выделенную память может быть рассчитан, например, с помощью следующего кода:
Код
 dibBitsPointerEnd = dibBitsPointer + (dibHeight - 1) * dibWidth * dibCellSize;
 
Цитата
Константин Ганюшин написал:
Для функции рисования под Windows, указатель на выделенную память может быть рассчитан, например, с помощью следующего кода:Код dibBitsPointerEnd = dibBitsPointer + (dibHeight - 1) * dibWidth * dibCellSize;
На высланном примере проверяли, пробовали так как вы написали - область остается пустой.
 
Если Вы внесли изменения в свой пример, то желательно его опубликовать. Анализировать код со слов сложно.
 
Цитата
Oleg Belenkov написал:
Если Вы внесли изменения в свой пример, то желательно его опубликовать. Анализировать код со слов сложно.
Пример выглядит так. desc.Point по прежнему ""
Код
QIcon ListObjectDialog::getObjectIcon(HOBJ obj)
{
    RECT ClientRect;

    int ClientHeight = 64;
    int ClientWidth = 64;
     MAPDFRAME frame;
     mapObjectFrame(obj, &frame);
     mapPlaneToPicture(map, &frame.X1, &frame.Y1);
     mapPlaneToPicture(map, &frame.X2, &frame.Y2);
     double scale = ClientWidth/(qMax(qAbs(frame.X2 - frame.X1), 1e-3) * 1.0);
     double scale2 = ClientHeight/(qMax(qAbs(frame.Y2 - frame.Y1), 1e-3) * 1.0);
     if(scale2 < scale) scale = scale2;
     double oldscale = mapGetRealShowScale(map);
     long x = 0;
     long y = 0;
     if(mapObjectLocal(obj) == LOCAL_SQUARE) {
         scale = scale/2;
     }
     mapChangeViewScale(map, &x, &y, scale);



      mapObjectFrame(obj, &frame);
      DOUBLEPOINT _Center;
      _Center.X = 0.5*(frame.X1+frame.X2);
      _Center.Y = 0.5*(frame.Y1+frame.Y2);

      mapPlaneToPicture(map, &_Center.X, &_Center.Y);

      RECT rect;
     rect.LT = _Center.X - ClientWidth/2 ;
     rect.UP = _Center.Y - ClientHeight/2 ;
     rect.RT = rect.LT + ClientWidth;
     rect.DN = rect.UP + ClientHeight;



    XIMAGEDESC desc;
    memset((void*) &desc, 0, sizeof(desc));
    desc.Width = rect.right - rect.left;
    desc.Height = rect.bottom - rect.top;
    desc.Depth = 32;
    desc.CellSize = desc.Depth / 8;
    desc.RowSize = desc.Width * desc.CellSize;
    desc.Point = (char*) malloc(desc.Height * desc.RowSize);
    memset((void*) desc.Point, 0, desc.Height * desc.RowSize);

    mapPaintMapObjectToDib(map, desc.Point + (desc.Height-1)*desc.RowSize, desc.Width, desc.Height,
                           &rect, nullptr, obj);

    QImage im((const uchar*) desc.Point, desc.Width, desc.Height, desc.RowSize,
#ifndef __linux__
              QImage::Format_RGB32);
#else
              QImage::Format_ARGB32);
#endif
    im = im.scaled(48, 48);

    mapSetRealShowScale(map, oldscale);
    free(desc.Point);

    return QPixmap::fromImage(im);

}
Изменено: Максим Казаровец - 15.03.2021 13:55:13
 
А что возвращает функция mapPaintMapObjectToDib ?

Судя по тексту функции комментарий не совсем корректный. Сдвигать адрес на первую строку изображения DIB не нужно.
Нужен указатель на начало выделенной области памяти. Внутри сдвиг делается автоматически.
 
Функция возвращает 1, в предыдущем примере тоже была 1.
 
Попробуйте вызвать так -

Код
 mapPaintMapObjectToDib(map, desc.Point, desc.Width, desc.Height, &rect, nullptr, obj); 
 
Цитата
Oleg Belenkov написал:
Попробуйте вызвать так -Код mapPaintMapObjectToDib(map, desc.Point, desc.Width, desc.Height, &rect, nullptr, obj);
Пробовал. На Linux так и отрисовывает, на windows возвращает 1 и ничего не рисует(пустой буфер).
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности