Add(InlineCode,16579447,182,175)
{
WorkPoints=#6:doLoad|
EventPoints=#8:onBitmap|
DataPoints=#9:PNGStream|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|37:uses kol,windows,Share,Debug,BeRoPNG;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|22: fStream: PStream;|25: //fBmp: Kol.PBitmap;|9: public|26: PNGStream: THI_Event;|25: onBitmap: THI_Event;|48: procedure doLoad(var dt: TData; idx: word);|5: |5: end;|0:|14:implementation|0:|4:type|22: pLongInt = ^LongInt;|24: PCardinal = ^Cardinal;|0:|142://function LoadPNG(DataPointer:pointer;DataSize:longword;var ImageData:pointer;var ImageWidth,ImageHeight:longint;HeaderOnly:boolean):boolean;|0:|39:function Swap(inInt: LongInt): LongInt;|3:var|44: rgba: array [0..3] of byte absolute inInt;|46: argb: array [0..3] of byte absolute Result; |5:begin|22: argb[0] := rgba[2]; |21: argb[1] := rgba[1];|21: argb[2] := rgba[0];|21: argb[3] := rgba[3];|2: |27: //argb[0] := 0; //Blue|28: //argb[1] := 0; //Green|26: //argb[2] := 255; //Red|32: //argb[3] := 255; //Alpha |4:end;|0:|54:procedure ARGB2ABGR(AColor: Pointer; ACount: Integer);|3:var|35: Color: PCardinal absolute AColor;|17: Index: Integer;|5:begin|33: for Index := 0 to ACount - 1 do|7: begin|85: Color^ := Color^ and $FF00FF00 + Color^ and $FF shl 16 + (Color^ shr 16) and $FF;|15: Inc(Color);|6: end;|4:end;|0:|29:procedure THiAsmClass.doLoad;|3:var|17: w,h,i: integer;|17: ps,pb: Pointer;|19: pDWord: pLongInt;|20: fBmp: Kol.PBitmap;|5:begin|38: fStream := ToStreamEvent(PNGStream);|32: if fStream.Size = 0 then Exit;|24: fStream.Position := 0;|23: ps := fStream.Memory;|40: LoadPNG(ps,fStream.Size,pb,w,h,False);|36: fBmp := NewDIBBitmap(w,h,pf32bit);|2: |52: //fBmp.Canvas.Brush.Color := Color2RGB(clBtnFace);|44: //fBmp.Canvas.Brush.BrushStyle := bsSolid;|44: //fBmp.Canvas.FillRect(MakeRect(0,0,w,h));|2: |17: {pDWord := pb; |37: for i := 1 to fBmp.DIBSize div 4 do|7: begin|39: pLongInt(pDWord)^ := Swap(pDWord^);|17: inc(pDWord); |7: end;}|2: |35: ARGB2ABGR(pb,fBmp.DIBSize div 4);|2: |49: // блин фиг догодаешся как такой буфер крутить |50: fBmp.DIBHeader^.bmiHeader.biHeight := -h; //!!! |96: StretchDIBits(fBmp.Canvas.Handle,0,0,w,h,0,0,w,h,pb,fBmp.DIBHeader^,DIB_RGB_COLORS, SRCCOPY); |2: |29: _hi_onEvent(onBitmap,fBmp);|12: fBmp.Free;|4:end;|0:|4:end.|
}
Ответов: 5227
Рейтинг: 587
|
|||
Попробовал, всё равно фигня получается. Там до кучи формат пиксела отличается и развёртка обратная (для OpenGL пойдёт без переделки) Вот так более менее правильно отображает, но конвертирование формата пиксела и копирование буфера могут свести на нет быстродействие отрисовки, да и альфа эта чёт не работает, короче х.з
|
|||
карма: 4 |
|