! Copyright (C) 2009 Joe Groff, Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien.c-types kernel combinators sequences math windows.gdi32 windows.types images destructors accessors fry locals classes.struct ; IN: windows.offscreen : (bitmap-info) ( dim -- BITMAPINFO ) [ BITMAPINFO dup bmiHeader>> BITMAPINFOHEADER heap-size >>biSize ] dip [ first >>biWidth ] [ second >>biHeight ] [ first2 * 4 * >>biSizeImage ] tri 1 >>biPlanes 32 >>biBitCount BI_RGB >>biCompression 72 >>biXPelsPerMeter 72 >>biYPelsPerMeter 0 >>biClrUsed 0 >>biClrImportant drop ; : make-bitmap ( dim dc -- hBitmap bits ) [ nip ] [ swap (bitmap-info) DIB_RGB_COLORS f [ f 0 CreateDIBSection ] keep *void* ] 2bi [ [ SelectObject drop ] keep ] dip ; : make-offscreen-dc-and-bitmap ( dim -- dc hBitmap bits ) [ f CreateCompatibleDC ] dip over make-bitmap ; : bitmap>byte-array ( bits dim -- byte-array ) product 4 * memory>byte-array ; : bitmap>image ( bits dim -- image ) [ bitmap>byte-array ] keep swap >>dim swap >>bitmap BGRX >>component-order ubyte-components >>component-type t >>upside-down? ; : with-memory-dc ( quot: ( hDC -- ) -- ) [ [ f CreateCompatibleDC &DeleteDC ] dip call ] with-destructors ; inline :: make-bitmap-image ( dim dc quot -- image ) dim dc make-bitmap [ &DeleteObject drop ] dip quot dip dim bitmap>image ; inline