struct RGBA {
uint8_t b,g,r,a;
};
void restoreTransparency(TBitmap* bm, const TRect& r)
{
int w = r.Width();
if (w <= 0)
return;
for (int y = r.top; y < r.bottom; ++y) {
RGBA* p = reinterpret_cast<RGBA*>(bm->ScanLine[y]) + r.left;
RGBA* end = p + w;
for (; p != end; ++p) {
p->a = 0xFF;
}
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
enum {
FRAME_WIDTH = 15,
SIZE_DELTA = FRAME_WIDTH * 2
};
TBitmap* bmIn = new TBitmap;
bmIn->LoadFromFile("in.bmp");
TBitmap* bmOut = new TBitmap;
bmOut->PixelFormat = bmIn->PixelFormat;
bmOut->SetSize(bmIn->Width + SIZE_DELTA, bmIn->Height + SIZE_DELTA);
// Зальём, например, синим
bmOut->Canvas->Brush->Color = clBlue;
bmOut->Canvas->Brush->Style = bsSolid;
bmOut->Canvas->FillRect(Bounds(0, 0, bmOut->Width, bmOut->Height));
// У Windows.BitBlt и её обёртки CopyRect есть ошибка:
// она стирает всю прозрачность вокруг.
bmOut->Canvas->CopyRect(
Bounds(FRAME_WIDTH, FRAME_WIDTH, bmIn->Width, bmIn->Height),
bmIn->Canvas,
Bounds(0, 0, bmIn->Width, bmIn->Height));
// Поэтому придётся восстановить эту самую прозрачность
if (bmOut->PixelFormat == pf32bit) {
restoreTransparency(bmOut, Bounds(0, 0, bmOut->Width, FRAME_WIDTH));
restoreTransparency(bmOut, Bounds(0, bmOut->Height - FRAME_WIDTH, bmOut->Width, FRAME_WIDTH));
restoreTransparency(bmOut, Bounds(0, FRAME_WIDTH, FRAME_WIDTH, bmIn->Height));
restoreTransparency(bmOut, Bounds(bmOut->Width - FRAME_WIDTH, FRAME_WIDTH, FRAME_WIDTH, bmIn->Height));
}
bmOut->SaveToFile("out.bmp");
delete bmOut;
delete bmIn;
}
На множестве натуральных чисел деление тоже определено.
Вот только это не глюк - это нормальное поведение, как написано в документации.
на четвертом шаге 1101 следовало бы представить в виде кода - 0 - (-2)
#include <iostream>
class App;
void function(const char * function_name, int (App::* f)(int), App& obj)
{
(obj.*f)(5);
}
class App
{
public:
int y = 10;
int start(int x)
{
std::cout << x + y << std::endl;
return 1;
}
void exec()
{
function("111", &App::start, *this);
}
};
int main()
{
App app;
app.exec();
return 0;
}