// ©barsunduk© 11/2011

// пример использования библиотеки Lib_bitmap
// при использовании графических библиотек часто возникает мерцание
// если же картинку загнать в битмап, поиздеваться над ней,
// а потом вывести на экран - мерцания нет
// описание функций см. ниже

program Lib_bitmap_test;

uses
  bitmap;
  
var
  img: image;
  a: integer;

begin
  // устанавливаем зеленый цвет
  setcol(h2i('ff008800'));
  // помещаем в битмап иконку
  createimg(loadimage('/icon.png'));
  // растягиваем битмап
  resize(64, 64);
  // размазываем
  blur;
  // запоминаем то, что вышло
  img := getimage;
  // растягиваем битмап
  resize(150, 100);
  // общая прозрачность = 75%
  alphablend(224);
  // делаем полупрозрачную маску (функция для шрифтов)
  // превращает оттенки серого в полупрозрачный черный
  mono;
  // перекрашиваем черный в синий, не меняя прозрачность
  floodrgb(h2i('88'));
  // увеличиваем канву с выравниванием по центру
  // освобождая место для контура
  canvassize(bitmap.width + 4, bitmap.height + 4, 0);
  // обводим контур белым
  outline(h2i('ffffffff'));
  a := 0;
  while KeyToAction(getKeyClicked) = GA_NONE do
  begin
    // закрашиваем экран
    FillRect(0, 0, GetWidth, GetHeight);
    // рисуем то, что вышло
    drawImage(img, 0, 0);
    drawImage(imgrotate(a), 0, 0);
    repaint;
    delay(20);
    a := a + 1;
    a := a mod 360;
  end;
end.

//===========================================\\
//                  функции                  \\
//===========================================\\

// получить цвет экрана
getcol: integer;

// установить цвет
setcol(col);

// переменная, содержащая цвет, которым будет закрашиваться точки
// при повороте или изменении размеров канвы
getback: integer;
setback(col);

// извлечение каналов ARGB цвета
getalpha(col: integer): integer;
getred(col: integer): integer;
getgreen(col: integer): integer;
getblue(col: integer): integer;

// объединение каналов
argb2int(alpha: integer, red: integer, green: integer, blue: integer): integer;

// из 16-ричной в 10-тичную
h2i(String s): integer;

// из 10-чной в 16-ричную
i2h(i: integer): string;

// ширина битмапа
width: integer;

// высота битмапа
height: integer;

// наложение цветов с учетом альфа-каналов
pixmix(forecolor: integer, backcolor: integer): integer;

// попадает ли точка в пределы битмапа (0 - не попадает)
inrect(x: integer, y: integer): integer;

// получить цвет пиксела битмапа
// если точка вне пределов, то возвращается цвет фона
point(x: integer, y: integer): integer;

// установить цвет пиксела
setpixel(x: integer, y: integer, c: integer);

// получить цвет пиксела картинки
getpixel(img: Image, x: integer, y: integer): Image;

// установить цвет пиксела, если прозрачности цвета выше пороговой
plotpixel(x: integer, y: integer, c: integer);

// нарисовать точку (можно полупрозрачную)
plot(x: integer, y: integer, c: integer);

// убить битмап
free();

// создать пустой битмап
createwh(w: integer, h: integer);

// создать битмап из картинки
createimg(img: Image);

// создать битмап из части картинки
createimgwh(img: Image, x: integer, y: integer, w: integer, h: integer);

// возвращает картинку из битмапа
getimage(): image;

// нарисовать битмап на экране MP
imgdraw(x: integer, y: integer);

// заполнить битмап одним цветом
flood(col: integer);

// заменить цвет на новый
newcolor(col: integer, newcol: integer);

// заменить все цвета на новый
// альфа канал не учитывается и не изменяется
floodrgb(newrgb: integer);

// заменить цвет rgb на новый
// альфа канал не учитывается и не изменяется
newrgb(rgb: integer, newrgb: integer);

// заменить цвет rgb на новый argb
// альфа канал не учитывается при поиске цвета rgb, но заменяется
newargb(rgb: integer, newargb: integer);

// заменить альфа канал на новый
// (цвет rgb не учитывается)
newalpha(alpha: integer, newalpha: integer);

// обнулить альфа канал, если его значение мешьше alpha
cutalpha(alpha: integer);

// изменить значение альфа канала
// альфа = [0..255]
// учитывая прежнее значение
alphablend(n: integer);

// заменить цвета на оттенки серого
// с учетом оптических особенностей восприятия
gray();

// окружить силуэт линией
// если прозрачность одного из пикселов сверху/снизу/слева/справа > 0
// то текущий пиксел перекрашивается в цвет бордюра linecolor
outline(linecolor);

// заливка всех пикселов с альфа-каналом > alphamin
// цвет может быть полупрозрачным - заливка идет смешением каналов
// т.е. можно выделить объект на картинке полупрозрачным цветом
flooda(overcolor: integer, alphamin: integer);

// размыть битмап
blur();

// косинус, помноженный на 65535
cos(a: integer): integer;

// синус, помноженный на 65535
sin(a: integer): integer;


// возвращает большее из 2 чисел
max(a: integer, b: integer): integer;

// возвращает меньшее из 2 чисел
min(a: integer, b: integer): integer;

// возвращает большее из 4 чисел
max4(a: integer, b: integer, c: integer, d: integer): integer;

// возвращает меньшее из 4 чисел
min4(a: integer, b: integer, c: integer, d: integer): integer;

// поворот битмапа на любой угол
rotate(angle: integer);

// возвращает повернутую картинку,
// при этом текущий битмап не меняется
imgrotate(angle: integer): Image;

// изменить размер картинки
// битмап растягивается без сглаживания
resize(neww: integer, newh: integer);

// обрубить битмап, оставив только заданную область
// (можно и увеличить канву)
cut(x: integer, y: integer, w: integer, h: integer);

// нарисовать изображение на текущем битмапе по заданным координатам
// если alphaDraw = _mix (0), то пикселы смешиваются
// иначе пикселы замещаются новыми
drawimage(img: Image, x: integer, y: integer, alphadraw: integer);

// изменить размер канвы
// если a45 = 0, то выравнивание по центру
// если a45 = 1, то выравнивание по правому краю
// если a45 = 2, то выравнивание по правому верхнему углу
// если a45 = 3, то выравнивание по верхнему краю
// если a45 = 4, то выравнивание по левому верхнему углу
// и т.д.
// (a45 - 1) * 45 = угол, по которому ведется выравнивание
canvassize(w: integer, h: integer, a45: integer, backcolor: integer);

// сдвиг битмапа на dx точек по горизонтали и dy - по вертикали
scroll(dx: integer, dy: integer);

// перекрашиваем rgb битмапа в цвет c, оставляя только прежний альфа-канал
mask(c: integer);

// добавление тени
// тень цвета c создается с учетом альфа канала
shadow(dx: integer, dy: integer, c: integer);

// наклон картинки на 1/8 высоты
// для создания эффекта курсива в шрифтах
italic();

// наложение копии битмапа, сдвинутой на пиксел вправо
// (создает эффет полужирного шрифта)
bold();

// заменить все цвета на 0x00, но с альфа каналом,
// равным среднему арифметическому от каналов RGB
// для создания монохромного шрифта, но со сглаживанием по альфа каналу
// из картинки без прозрачности (черный шрифт на белом фоне,
// но по идее должно работать с любыми картинками)
mono;
