Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2015, 16:26   #1
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию DLL Перестает работать функция

Создавал тему :
http://programmersforum.ru/showthread.php?t=284453
В итоге сам решил все свои вопросы, видимо никто с этим не сталкивался.
Длл дописана и работает, но переодически при частых вызовах, тащит изображение старое из памяти, а не то которое я ему даю подгружать.
Вродебы все локально обрабатывается и все внутри длл и достаточно быстро, но проблема есть.
Вот код ее:
Код:
//Распаковка DXT1 текстуры в BMP
procedure DecodeDXT (const Texture:TGETexture; var Buf:TMemoryStream; ctype:byte);
var
    i,j,k,n : integer;
        pix : byte;
      Color : array [0..3] of TRGB;
begin
  Buf.SetSize(BMP_FILE_SIZE);
  Buf.Position:=0;
  Buf.Write(BMP_HEAD, Length(BMP_HEAD));                                        //пишем заголовок BMP
  for i := 0 to length(Texture.DXT1)-1 do
  for j := 0 to length(Texture.DXT1[0])-1 do
  begin
    GetColors(Texture.DXT1[i,j].Color0, Texture.DXT1[i,j].Color1, Color);       //определяем опорные цвета для блока
    pix:=0;
    for k := 0 to 3 do
    for n := 0 to 3 do
    begin
      case ctype of
        0:begin
          if j>=12 then Buf.Position:=54+((4*i+k)*256+4*(j-12)+n)*3 else
          if i>=1 then Buf.Position:=54+((4*(i-1)+k)*256+4*(j+52)+n)*3
          else Buf.Position:=54+((4*(i+63)+k)*256+4*(j)+n)*3;
        end;
        else Buf.Position:=54+((4*i+k)*256+4*j+n)*3;
      end;
     Buf.Write(Color[GetColorID(Texture.DXT1[i,j].BitMask, pix)], 3);           //для каждого пикселя из блока, записываем его реальный цвет
     inc(pix);
    end;
  end;
end;

procedure DecodeDDS (const tex: PWIDECHAR; cType:byte);stdcall;
var
  Buf:TMemoryStream;
  fWidth, fHeight:integer;
  img:TBitmap;
  Texture:TMemoryStream;
  //PosCaptcha:TPoint;
begin
   if not FileExists(tex) then exit;
   Texture:=TMemoryStream.Create;
   Buf:=TMemoryStream.Create;
  try
    Texture.LoadFromFile(tex);
    Texture.Seek($0C,soFromBeginning);
    Texture.Read(fHeight,4);
    Texture.Read(fWidth,4);
    Texture.Position:=0;
    DecodeDXT(TGETexture(Texture.Memory^),Buf,cType);
    Texture.Clear;
    Texture.Position:=0;
    Buf.Position:=0;
    Texture.LoadFromStream(Buf);
    Texture.Position:=0;
    img := TBitmap.Create;
    try
      img.LoadFromStream(Texture);
      flip(img.Handle,false,true);
      img.Width:=fWidth;
      img.Height:=fHeight;
      img.SaveToFile(ChangeFileExt(tex,'.bmp'));
    finally
      img.Free;
    end;
  finally
   Buf.Free;
   Texture.Free;
  end;
end;

function EncodeDDS2BMP (const tex: PWIDECHAR; cType:integer):boolean;stdcall;
var
  Buf:TMemoryStream;
  fWidth, fHeight:integer;
  img:TBitmap;
  JPEG: TJPEGImage;
  Texture:TMemoryStream;
begin
  result:=false;
   if not FileExists(tex) then exit;
   Texture:=TMemoryStream.Create;
   Buf:=TMemoryStream.Create;
  try
    Texture.LoadFromFile(tex);
    Texture.Seek($0C,soFromBeginning);
    Texture.Read(fHeight,4);
    Texture.Read(fWidth,4);
    Texture.Position:=0;
    DecodeDXT(TGETexture(Texture.Memory^),Buf,0);
    Texture.Clear;
    Texture.Position:=0;
    Buf.Position:=0;
    Texture.LoadFromStream(Buf);
    Texture.Position:=0;
    img := TBitmap.Create;
    try
      img.LoadFromStream(Texture);
        flip(img.Handle,false,true);
        img.Width:=fWidth;
        img.Height:=fHeight;
        img.SaveToFile(ChangeFileExt(tex,'.bmp'));
        result:=true;
    finally
      img.Free;
    end;
  finally
   Buf.Free;
   Texture.Free;
  end;
end;
А возможно я вообще зря заморачиваюсь и вы меня ткнете носом на уже готовую подобную библиотеку еще и использующую ресурсы видеокарты

Последний раз редактировалось IvaniuS; 14.12.2015 в 16:28.
IvaniuS вне форума Ответить с цитированием
Старый 14.12.2015, 18:44   #2
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Видеокарты же должны сами уметь читать DDS, не?
Цитата:
Перестает работать функция
Судя по описанию не перестаёт, а не просто не всегда делает то что вы ожидали.
А зачем там вообще загрузка/сохранение через файлы? Какова цель?
ResourceSpace вне форума Ответить с цитированием
Старый 15.12.2015, 17:19   #3
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Да именно, перестает "правильно" работать функция
Работы с файлами нету по сути, только считывание DDS и сохранение в JPEG\BMP.
Хороших библиотек я не нашел к сожалению, рабочих, сейчас разбираюсь с последним вариантом это https://code.google.com/p/libsquish/
IvaniuS вне форума Ответить с цитированием
Старый 15.12.2015, 18:19   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы бы проверили на чем функция фейлится, может там закономерно все?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.12.2015, 14:08   #5
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

А подпись у вас хорошааа...
Я уже дебажил как мог даже приложение отдельное написал для этого, проблема может быть только в двух местах или в подгрузке:
Texture.LoadFromFile(tex);
Что маловероятно ну не может он тут старое изображение подгружать.
А вот в памяти почему-то хранятся последние 2-4 Изображений
И он почему-то обрабатывает не мое, а предыдущее, почему пока не смог разобраться, есть вариант сделать динамическую подгрузку длл чтобы она освобождала ресурсы, возможно тогда не будет проблем, но постоянно ее подгружать по моему - плохой тон.
IvaniuS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перестает работать процедура waka2ebawer Общие вопросы Delphi 11 23.06.2013 18:05
Перестает работать анимация. Юрий90 Visual C++ 4 15.02.2012 13:32
Автоподстановка перестает работать GekFinn Microsoft Office Access 1 19.01.2012 11:38
ПЕРЕСТАЕТ РАБОТАТЬ МАКРОС Cone Microsoft Office Excel 3 15.08.2010 13:49
ПЕРЕСТАЕТ РАБОТАТЬ СОРТИРОВЩИК Cone Microsoft Office Excel 5 10.08.2010 16:36