/* * BoardDraw: Draw board on given hdc. */ void BoardDraw(HDC hdc, Board *b) { int i, j, piece, color, index, mode; RECT rect; if (!b->valid) { rect.left = 0; rect.top = 0; rect.right = BOARD_WIDTH * b->square_size; rect.bottom = BOARD_HEIGHT * b->square_size; FillRect(hdc, &rect, (HBRUSH) GetStockObject(LTGRAY_BRUSH)); return; } SelectPalette(hdc, c->hPal, FALSE); // Turn off color interpolation mode = GetStretchBltMode(hdc); SetStretchBltMode(hdc, STRETCH_DELETESCANS); for (i=0; i < BOARD_HEIGHT; i++) for (j=0; j < BOARD_WIDTH; j++) { if ((i + j) % 2 == 0) index = WHITE_INDEX; else index = BLACK_INDEX; // Draw highlight if square selected if (move_started && move_pos1.x == j && move_pos1.y == i) index = select_index; rect.left = j * b->square_size; rect.top = i * b->square_size; rect.right = rect.left + b->square_size; rect.bottom = rect.top + b->square_size; piece = b->squares[i][j].piece; color = b->squares[i][j].color; if (piece == NONE) { OffscreenWindowColor(b->square_size, b->square_size, index); OffscreenCopy(hdc, rect.left, rect.top, b->square_size, b->square_size, 0, 0); } else { OffscreenWindowColor(PIECE_WIDTH, PIECE_HEIGHT, index); OffscreenStretchBlt(hdc, rect.left, rect.top, b->square_size, b->square_size, piece_bitmaps[color][piece - 1].bmap.bits, 0, 0, PIECE_WIDTH, PIECE_HEIGHT, OBB_TRANSPARENT | OBB_FLIP | OBB_COPY); } } SetStretchBltMode(hdc, mode); }
void CPreviewDC::MirrorAttributes() { ASSERT(m_hAttribDC != NULL); if (m_hDC != NULL) { // extract and re-set Pen and Brush HGDIOBJ hTemp = ::SelectObject(m_hAttribDC, ::GetStockObject(BLACK_PEN)); ::SelectObject(m_hAttribDC, hTemp); ::SelectObject(m_hDC, hTemp); hTemp = ::SelectObject(m_hAttribDC, ::GetStockObject(BLACK_BRUSH)); ::SelectObject(m_hAttribDC, hTemp); ::SelectObject(m_hDC, hTemp); SetROP2(GetROP2()); SetBkMode(GetBkMode()); SetTextAlign(GetTextAlign()); SetPolyFillMode(GetPolyFillMode()); SetStretchBltMode(GetStretchBltMode()); SetTextColor(GetNearestColor(GetTextColor())); SetBkColor(GetNearestColor(GetBkColor())); } }
void osd_display(HDC dc, int w, int h) { int i; struct osd_item *oi; wnd_w = window_w; wnd_h = window_h; if(!hdc_sheet) osd_initialize_in(dc); if(!current_frame || vdata.shared->audio.output.getplayerstate() == v_audio_playerstate_stopped) { if(wnd_w > osd_logo_w + 10 && wnd_h > osd_logo_h + 10) { BitBlt(dc, (wnd_w/2)-(osd_logo_w/2), (wnd_h/2)-(osd_logo_h/2), osd_logo_w, osd_logo_h, hdc_sheet, 269, 0, SRCCOPY); }else{ int nw, nh, stretchmode; if(wnd_w < wnd_h) { nw = max(wnd_w - 20, 0); nh = (int)(nw * ((float)osd_logo_h / (float)osd_logo_w)); }else{ nh = max(wnd_h - 20, 0); nw = (int)(nh * ((float)osd_logo_w / (float)osd_logo_h)); } stretchmode = GetStretchBltMode(dc); SetStretchBltMode(dc, STRETCH_HALFTONE); StretchBlt(dc, (wnd_w/2)-(nw/2), (wnd_h/2)-(nh/2), nw, nh, hdc_sheet, 269, 0, osd_logo_w, osd_logo_h, SRCCOPY); SetStretchBltMode(dc, stretchmode); } } seek_w = ((wnd_w - 223 - 25) * 5) / 7; volume_w = ((wnd_w - 223 - 25) * 2) / 7; if(seek_w < 0)seek_w = 0; if(volume_w < 0)volume_w = 0; /* hmm... here we go */ for(i=0; i<osd_item_count; i++) { oi = &osd_items[i]; osd_drawitem(dc, oi, 0); if(oi->moving_side == 1) { if(oi->moving_pos < 100) { oi->moving_pos += move_step; }else{ oi->moving_side = 0; oi->active = 1; } }else if(oi->moving_side == -1){ if(oi->moving_pos > 0) { if(!osd_lock_items) oi->moving_pos -= move_step; }else{ oi->moving_pos = 0; oi->moving_side = 0; } } } if(highlight_oi) osd_drawitem(dc, highlight_oi, 1); }
void KDCAttributes::DumpDC(HDC hDC) { POINT pnt; SIZE size; m_List.DeleteAll(); Add(_T("Technology"), _T("%d"), GetDeviceCaps(hDC, TECHNOLOGY)); Add(_T("width"), _T("%d"), GetDeviceCaps(hDC, HORZRES)); Add(_T("height"), _T("%d"), GetDeviceCaps(hDC, VERTRES)); GetDCOrgEx(hDC, & pnt); Add(_T("DC Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); TCHAR szTitle[MAX_PATH]; szTitle[0] = 0; GetWindowText(WindowFromDC(hDC), szTitle, MAX_PATH); Add(_T("Window"), _T("0x%X \"%s\""), WindowFromDC(hDC), szTitle); Add(_T("Bitmap"), _T("0x%X"), GetCurrentObject(hDC, OBJ_BITMAP)); Add(_T("Graphics Mode"), _T("%d"), GetGraphicsMode(hDC)); Add(_T("Mapping Mode"), _T("%d"), GetMapMode(hDC)); GetViewportExtEx(hDC, & size); Add(_T("Viewport Extent"), _T("{ %d, %d }"), size.cx, size.cy); GetViewportOrgEx(hDC, & pnt); Add(_T("Viewport Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); GetWindowExtEx(hDC, & size); Add(_T("Window Extent"), _T("{ %d, %d }"), size.cx, size.cy); GetWindowOrgEx(hDC, & pnt); Add(_T("Window Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); XFORM xform; GetWorldTransform(hDC, & xform); Add(_T("World transformation"), _T("{ %f, %f, %f, %f, %f, %f }"), xform.eM11, xform.eM12, xform.eM21, xform.eM22, xform.eDx, xform.eDy); // transformation Add(_T("Background Color"), _T("0x%X"), GetBkColor(hDC)); Add(_T("Text Color"), _T("0x%X"), GetTextColor(hDC)); Add(_T("Palette"), _T("0x%X"), GetCurrentObject(hDC, OBJ_PAL)); { COLORADJUSTMENT ca; GetColorAdjustment(hDC, & ca); Add(_T("Color Adjustment"), _T("{ %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d }"), ca.caSize, ca.caFlags, ca.caIlluminantIndex, ca.caRedGamma, ca.caGreenGamma, ca.caBlueGamma, ca.caReferenceBlack, ca.caReferenceWhite, ca.caContrast, ca.caBrightness, ca.caColorfulness, ca.caRedGreenTint); } Add(_T("Color Space"), _T("0x%X"), GetColorSpace(hDC)); Add(_T("ICM Mode"), _T("%d"), SetICMMode(hDC, ICM_QUERY)); { TCHAR szProfile[MAX_PATH]; DWORD dwSize = MAX_PATH; szProfile[0] = 0; GetICMProfile(hDC, & dwSize, szProfile); Add(_T("ICM Profile"), _T("%s"), szProfile); } GetCurrentPositionEx(hDC, & pnt); Add(_T("Current Position"), _T("{ %d, %d }"), pnt.x, pnt.y); Add(_T("ROP2"), _T("%d"), GetROP2(hDC)); Add(_T("Background Mode"), _T("%d"), GetBkMode(hDC)); Add(_T("Logical Pen"), _T("0x%X"), GetCurrentObject(hDC, OBJ_PEN)); Add(_T("DC Pen Color"), _T("0x%X"), GetDCPenColor(hDC)); Add(_T("Arc Direction"), _T("%d"), GetArcDirection(hDC)); FLOAT miter; GetMiterLimit(hDC, & miter); Add(_T("Miter Limit"), _T("%f"), miter); Add(_T("Logical Brush"), _T("0x%X"), GetCurrentObject(hDC, OBJ_BRUSH)); Add(_T("DC Brush Color"), _T("0x%X"), GetDCBrushColor(hDC)); GetBrushOrgEx(hDC, & pnt); Add(_T("Brush Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); Add(_T("Polygon Filling Mode"), _T("%d"), GetPolyFillMode(hDC)); Add(_T("Bitmap Stretching Mode"), _T("%d"), GetStretchBltMode(hDC)); Add(_T("Logical Font"), _T("0x%X"), GetCurrentObject(hDC, OBJ_FONT)); Add(_T("Inter-character spacing"), _T("%d"), GetTextCharacterExtra(hDC)); DWORD flag = SetMapperFlags(hDC, 0); SetMapperFlags(hDC, flag); Add(_T("Font Mapper Flags"), _T("0x%X"), flag); Add(_T("Text Alignment"), _T("0x%X"), GetTextAlign(hDC)); Add(_T("Text Justification"), _T("write only"), 0); Add(_T("Layout"), _T("%d"), GetLayout(hDC)); Add(_T("Path"), _T("%d bytes"), GetPath(hDC, NULL, NULL, 0)); RECT rect; int typ = GetClipBox(hDC, & rect); HRGN hRgn = CreateRectRgn(0, 0, 1, 1); GetClipRgn(hDC, hRgn); Add(_T("Clipping"), _T("type %d clip box { %d, %d, %d, %d } size %d bytes"), typ, rect.left, rect.top, rect.right, rect.bottom, GetRegionData(hRgn, 0, NULL) ); GetMetaRgn(hDC, hRgn); GetRgnBox(hRgn, & rect); Add(_T("Meta Region"), _T("size %d bytes, rgn box { %d, %d, %d, %d }"), GetRegionData(hRgn, 0, NULL), rect.left, rect.top, rect.right, rect.bottom); for (int i=1; i<=5; i++) { int rslt = GetRandomRgn(hDC, hRgn, i); if ( rslt==1 ) { GetRgnBox(hRgn, & rect); Add(_T("Random Region"), _T("size %d bytes, rgn box { %d, %d, %d, %d }"), GetRegionData(hRgn, 0, NULL), rect.left, rect.top, rect.right, rect.bottom); } else if ( rslt==0 ) Add(_T("Random Region"), _T("NULL"), 0); else Add(_T("Random Region"), _T("FAIL"), 0); } DeleteObject(hRgn); GetBoundsRect(hDC, & rect, 0); Add(_T("Bounds Rectangle"), _T("{ %d, %d, %d, %d }"), rect.left, rect.top, rect.right, rect.bottom); }
/****************************************************************************** * GdiTransparentBlt [GDI32.@] */ BOOL WINAPI GdiTransparentBlt( HDC hdcDest, int xDest, int yDest, int widthDest, int heightDest, HDC hdcSrc, int xSrc, int ySrc, int widthSrc, int heightSrc, UINT crTransparent ) { BOOL ret = FALSE; HDC hdcWork; HBITMAP bmpWork; HGDIOBJ oldWork; HDC hdcMask = NULL; HBITMAP bmpMask = NULL; HBITMAP oldMask = NULL; COLORREF oldBackground; COLORREF oldForeground; int oldStretchMode; if(widthDest < 0 || heightDest < 0 || widthSrc < 0 || heightSrc < 0) { TRACE("Cannot mirror\n"); return FALSE; } oldBackground = SetBkColor(hdcDest, RGB(255,255,255)); oldForeground = SetTextColor(hdcDest, RGB(0,0,0)); /* Stretch bitmap */ oldStretchMode = GetStretchBltMode(hdcSrc); if(oldStretchMode == BLACKONWHITE || oldStretchMode == WHITEONBLACK) SetStretchBltMode(hdcSrc, COLORONCOLOR); hdcWork = CreateCompatibleDC(hdcDest); bmpWork = CreateCompatibleBitmap(hdcDest, widthDest, heightDest); oldWork = SelectObject(hdcWork, bmpWork); if(!StretchBlt(hdcWork, 0, 0, widthDest, heightDest, hdcSrc, xSrc, ySrc, widthSrc, heightSrc, SRCCOPY)) { TRACE("Failed to stretch\n"); goto error; } SetBkColor(hdcWork, crTransparent); /* Create mask */ hdcMask = CreateCompatibleDC(hdcDest); bmpMask = CreateCompatibleBitmap(hdcMask, widthDest, heightDest); oldMask = SelectObject(hdcMask, bmpMask); if(!BitBlt(hdcMask, 0, 0, widthDest, heightDest, hdcWork, 0, 0, SRCCOPY)) { TRACE("Failed to create mask\n"); goto error; } /* Replace transparent color with black */ SetBkColor(hdcWork, RGB(0,0,0)); SetTextColor(hdcWork, RGB(255,255,255)); if(!BitBlt(hdcWork, 0, 0, widthDest, heightDest, hdcMask, 0, 0, SRCAND)) { TRACE("Failed to mask out background\n"); goto error; } /* Replace non-transparent area on destination with black */ if(!BitBlt(hdcDest, xDest, yDest, widthDest, heightDest, hdcMask, 0, 0, SRCAND)) { TRACE("Failed to clear destination area\n"); goto error; } /* Draw the image */ if(!BitBlt(hdcDest, xDest, yDest, widthDest, heightDest, hdcWork, 0, 0, SRCPAINT)) { TRACE("Failed to paint image\n"); goto error; } ret = TRUE; error: SetStretchBltMode(hdcSrc, oldStretchMode); SetBkColor(hdcDest, oldBackground); SetTextColor(hdcDest, oldForeground); if(hdcWork) { SelectObject(hdcWork, oldWork); DeleteDC(hdcWork); } if(bmpWork) DeleteObject(bmpWork); if(hdcMask) { SelectObject(hdcMask, oldMask); DeleteDC(hdcMask); } if(bmpMask) DeleteObject(bmpMask); return ret; }
BOOL nulldrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst, PHYSDEV src_dev, struct bitblt_coords *src, DWORD rop ) { DC *dc_src, *dc_dst = get_nulldrv_dc( dst_dev ); char src_buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; char dst_buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; BITMAPINFO *src_info = (BITMAPINFO *)src_buffer; BITMAPINFO *dst_info = (BITMAPINFO *)dst_buffer; DWORD err; struct gdi_image_bits bits; if (!(dc_src = get_dc_ptr( src_dev->hdc ))) return FALSE; src_dev = GET_DC_PHYSDEV( dc_src, pGetImage ); if (src_dev->funcs->pGetImage( src_dev, src_info, &bits, src )) { release_dc_ptr( dc_src ); return FALSE; } dst_dev = GET_DC_PHYSDEV( dc_dst, pPutImage ); copy_bitmapinfo( dst_info, src_info ); err = dst_dev->funcs->pPutImage( dst_dev, 0, dst_info, &bits, src, dst, rop ); if (err == ERROR_BAD_FORMAT) { DWORD dst_colors = dst_info->bmiHeader.biClrUsed; /* 1-bpp source without a color table uses the destination DC colors */ if (src_info->bmiHeader.biBitCount == 1 && !src_info->bmiHeader.biClrUsed) get_mono_dc_colors( dst_dev->hdc, src_info, 2 ); if (dst_info->bmiHeader.biBitCount == 1 && !dst_colors) { /* 1-bpp destination without a color table requires a fake 1-entry table * that contains only the background color; except with a 1-bpp source, * in which case it uses the source colors */ if (src_info->bmiHeader.biBitCount > 1) get_mono_dc_colors( src_dev->hdc, dst_info, 1 ); else get_mono_dc_colors( src_dev->hdc, dst_info, 2 ); } if (!(err = convert_bits( src_info, src, dst_info, &bits ))) { /* get rid of the fake destination table */ dst_info->bmiHeader.biClrUsed = dst_colors; err = dst_dev->funcs->pPutImage( dst_dev, 0, dst_info, &bits, src, dst, rop ); } } if (err == ERROR_TRANSFORM_NOT_SUPPORTED && ((src->width != dst->width) || (src->height != dst->height))) { copy_bitmapinfo( src_info, dst_info ); err = stretch_bits( src_info, src, dst_info, dst, &bits, GetStretchBltMode( dst_dev->hdc )); if (!err) err = dst_dev->funcs->pPutImage( dst_dev, 0, dst_info, &bits, src, dst, rop ); } if (bits.free) bits.free( &bits ); release_dc_ptr( dc_src ); return !err; }