?? i_ugldsp.cpp
字號:
return (mode);}ZafLogicalColor ZafScreenDisplay::SetMonoBackground(ZafLogicalColor color){ if (color != ZAF_MONO_NULL && color < ZAF_MAXCOLORS) {#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Take(ZAF_WAIT_FOREVER_SEMAPHORE);#endif palette.monoBackground = color;#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Give();#endif } return (palette.monoBackground);}ZafLogicalColor ZafScreenDisplay::SetMonoForeground(ZafLogicalColor color){ if (color != ZAF_MONO_NULL && color < ZAF_MAXCOLORS) {#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Take(ZAF_WAIT_FOREVER_SEMAPHORE);#endif palette.monoBackground = color;#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Give();#endif } return (palette.monoBackground);}ZafPaletteStruct ZafScreenDisplay::SetPalette(ZafPaletteStruct palette){ SetLineStyle(palette.lineStyle); SetFillPattern(palette.fillPattern); SetForeground(palette.colorForeground); SetBackground(palette.colorBackground); SetMonoForeground(palette.monoForeground); SetMonoBackground(palette.monoBackground); SetFont(palette.font); return (palette);}// --- Draw Setup -----------------------------------------------------------ZafError ZafScreenDisplay::BeginDraw(OSDisplayContext windowRegionType, OSDrawContext dc, const ZafRegionStruct &, const ZafRegionStruct &clip){#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Take(ZAF_WAIT_FOREVER_SEMAPHORE);#endif ZafError retVal = ZAF_ERROR_NONE; if (--virtualCount == -1) { stopDevice++; UGL_RECT windowRect; if (dc == ID_ZAF_SCREEN || dc == ID_ZAF_DIRECT || dc == ID_ZAF_OFFSCREEN) { viewPort.left = viewPort.top = 0; viewPort.right = columns - 1; viewPort.bottom = lines - 1; } else { winRectGet (dc, &windowRect); UGL_WINDOW_ID parentId = winParent (dc); while (parentId != UGL_NULL_ID) { UGL_RECT parentRect; winRectGet (parentId, &parentRect); UGL_RECT_MOVE (windowRect, parentRect.left, parentRect.top); parentId = winParent (parentId); } viewPort.left = windowRect.left; viewPort.top = windowRect.top; viewPort.right = windowRect.right; viewPort.bottom = windowRect.bottom; } masterClip.left = clip.left; masterClip.top = clip.top; masterClip.right = clip.right; masterClip.bottom = clip.bottom; clipRegion = masterClip; if (dc == ID_ZAF_OFFSCREEN) { originalGC = gc; gc = uglGcCreate(devID); uglGcCopy(originalGC, gc); } uglViewPortSet(gc, viewPort.left, viewPort.top, viewPort.right, viewPort.bottom); uglClipRectSet(gc, masterClip.left, masterClip.top, masterClip.right, masterClip.bottom); uglClipRegionSet(gc, UGL_NULL); currentDC = dc; // Set the draw regions. if (dc == ID_ZAF_SCREEN) { UGL_EVENT_ROUTER_ID evtRtrID; uglDriverFind(UGL_EVENT_ROUTER_TYPE, 0, (UGL_UINT32 *)&evtRtrID); UGL_WINDOW_ID rootWinID = winRootGet(evtRtrID); uglClipRegionSet (gc, winVisibleRegionGet(rootWinID)); } else if (dc != ID_ZAF_DIRECT) { winLock (dc); oldWindowRegionType = windowRegionType; if (windowRegionType == ID_ZAF_DIRTY_REGION) { UGL_REGION_ID clipRegionId = winDirtyRegionGet(dc); if (clipRegionId) uglClipRegionSet (gc, clipRegionId); else { masterClip.left = masterClip.top = 0; masterClip.right = masterClip.bottom = -1; clipRegion = masterClip; uglClipRectSet (gc, 0, 0, -1, -1); } } else uglClipRegionSet (gc, winVisibleRegionGet(dc)); } uglBatchStart(gc); } else if (oldWindowRegionType == ID_ZAF_DIRTY_REGION) { // Only set a clip rect if already set a clip region. It's possible // to have tried to set the clip region to the window's dirty region, // but if the window didn't have a dirty region, then an empty clip rect // was set. Can't modify that or else could write over objects. UGL_REGION_ID clipReg; uglClipRegionGet(gc, &clipReg); if (clipReg) { masterClip.left = clip.left; masterClip.top = clip.top; masterClip.right = clip.right; masterClip.bottom = clip.bottom; clipRegion = masterClip; uglClipRectSet(gc, masterClip.left, masterClip.top, masterClip.right, masterClip.bottom); } } return (retVal);}ZafError ZafScreenDisplay::EndDraw(void){ if (++virtualCount == 0) { masterClip.left = -viewPort.left; masterClip.top = -viewPort.top; masterClip.right = columns - viewPort.left - 1; masterClip.bottom = lines - viewPort.top - 1; clipRegion = masterClip; oldWindowRegionType = 0xFFFF; // Restore display. coordinateType = ZAF_PIXEL; SetMode(ZAF_MODE_COPY); originX = originY = 0; scaleNumerator = scaleDenominator = 1; uglBatchEnd(gc); stopDevice--; bool finished; do { finished = true; for (int i = 0; i < ZAF_MAXIMAGES; i++) { if (devImage[i].movePending) { DeviceMove((ZafDeviceImageType)i, devImage[i].newX, devImage[i].newY, devImage[i].clip); devImage[i].movePending = false; finished = false; } } } while (!finished); if (currentDC != ID_ZAF_DIRECT && currentDC != ID_ZAF_SCREEN) winUnlock (currentDC); if (originalGC) { uglGcDestroy(gc); gc = originalGC; originalGC = UGL_NULL; } } else if (virtualCount > 0) virtualCount = 0;#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Give();#endif return (ZAF_ERROR_NONE);}OSDisplayContext ZafScreenDisplay::DisplayContext(void) const{ return (ZAF_NULLH(OSDisplayContext));}OSDisplayContext ZafScreenDisplay::RestoreDisplayContext(void){ return (ZAF_NULLH(OSDisplayContext));}OSDrawContext ZafScreenDisplay::DrawContext(void) const{ return (ZAF_NULLH(OSDrawContext));}OSDrawContext ZafScreenDisplay::RestoreDrawContext(void){ return (ZAF_NULLH(OSDrawContext));}OSDisplayContext ZafScreenDisplay::SetDisplayContext(OSDisplayContext){ // Meaningless on MSDOS. return (0);}OSDrawContext ZafScreenDisplay::SetDrawContext(OSDrawContext){ // Meaningless on MSDOS. return (0);}////////////////////////////////////////////////////////////////////////////////// ZafScreenDisplay::SetDrawBitmap - sets the default bitmap associated with// the current UGL gc.//// ZafError ZafScreenDisplay::SetDrawBitmap(ZafBitmapStruct *bitmap){#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Take(ZAF_WAIT_FOREVER_SEMAPHORE);#endif if (!bitmap || !bitmap->handle) uglDefaultBitmapSet(gc, UGL_DISPLAY_ID); else uglDefaultBitmapSet(gc, bitmap->handle);#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Give();#endif return (ZAF_ERROR_NONE);}// --- Devices --------------------------------------------------------------int ZafScreenDisplay::DeviceMove(ZafDeviceImageType imageType, int newColumn, int newLine, ZafRegionStruct &clip){#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Take(ZAF_WAIT_FOREVER_SEMAPHORE);#endif if (stopDevice++ == 0) { if (devImage[imageType].devBitmapID) { BeginDraw(0, ID_ZAF_DIRECT, devImage[imageType].clip, devImage[imageType].clip); int height = devImage[imageType].devRegion.Height(); int width = devImage[imageType].devRegion.Width(); // Replace screen image at old location. uglBitmapBlt(gc, devImage[imageType].scrBitmapID, 0, 0, width - 1, height - 1, UGL_DEFAULT_ID, devImage[imageType].devRegion.left, devImage[imageType].devRegion.top); EndDraw(); // Get new screen bitmap. uglBitmapDestroy(devID, devImage[imageType].scrBitmapID); UGL_DIB dib; dib.height = height; dib.width = dib.stride = width; devImage[imageType].scrBitmapID = uglBitmapCreate(devID, &dib, UGL_DIB_INIT_NONE, 0, UGL_DEFAULT_MEM); devImage[imageType].devRegion.left = newColumn; devImage[imageType].devRegion.top = newLine; devImage[imageType].devRegion.right = newColumn + width - 1; devImage[imageType].devRegion.bottom = newLine + height - 1; devImage[imageType].clip = clip; BeginDraw(0, ID_ZAF_DIRECT, devImage[imageType].clip, devImage[imageType].clip); uglBitmapBlt(gc, UGL_DEFAULT_ID, newColumn, newLine, newColumn + width - 1, newLine + height - 1, devImage[imageType].scrBitmapID, 0, 0); // Put device image at new location. uglBitmapBlt(gc, devImage[imageType].devBitmapID, 0, 0, width - 1, height - 1, UGL_DEFAULT_ID, newColumn, newLine); EndDraw(); } } else { devImage[imageType].newX = newColumn; devImage[imageType].newY = newLine; devImage[imageType].clip = clip; devImage[imageType].movePending = true; } stopDevice--;#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Give();#endif return (true);}int ZafScreenDisplay::DeviceSet(ZafDeviceImageType imageType, int column, int line, int width, int height, ZafLogicalColor *image, ZafRegionStruct &clip, int hotSpotX, int hotSpotY){#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Take(ZAF_WAIT_FOREVER_SEMAPHORE);#endif stopDevice++; // Replace old screen image, if any. if (devImage[imageType].scrBitmapID) { BeginDraw(0, ID_ZAF_SCREEN, devImage[imageType].clip, devImage[imageType].clip); int height = devImage[imageType].devRegion.Height(); int width = devImage[imageType].devRegion.Width(); // Replace screen image at old location. uglBitmapBlt(gc, devImage[imageType].scrBitmapID, 0, 0, width - 1, height - 1, UGL_DEFAULT_ID, devImage[imageType].devRegion.left, devImage[imageType].devRegion.top); EndDraw(); } // Create an UGL bitmap from the device image array. UGL_COLOR *bitmapData = new UGL_COLOR[width * height]; for (int index = 0; index < height * width; index++) bitmapData[index] = colorTable[image[index]]; UGL_DIB dib; dib.height = height; dib.width = width; dib.stride = width; dib.colorFormat = UGL_DEVICE_COLOR_32; dib.clutSize = 0; dib.imageFormat = UGL_DIRECT; dib.pClut = UGL_NULL; dib.pImage = bitmapData; // Delete old handle, if one existed. if (devImage[imageType].devBitmapID) uglBitmapDestroy(devID, devImage[imageType].devBitmapID); devImage[imageType].devBitmapID = uglBitmapCreate(devID, &dib, UGL_DIB_INIT_DATA, 0, UGL_DEFAULT_MEM); delete []bitmapData; // Fill in rest of devImage. devImage[imageType].devRegion.left = column; devImage[imageType].devRegion.top = line; devImage[imageType].devRegion.right = column + width - 1; devImage[imageType].devRegion.bottom = line + height - 1; devImage[imageType].devRegion.coordinateType = clip.coordinateType; devImage[imageType].clip = clip; // Get screen image at device image location. if (devImage[imageType].scrBitmapID) uglBitmapDestroy(devID, devImage[imageType].scrBitmapID); dib.height = height; dib.width = dib.stride = width; dib.pImage = UGL_NULL; devImage[imageType].scrBitmapID = uglBitmapCreate(devID, &dib, UGL_DIB_INIT_NONE, 0, UGL_DEFAULT_MEM); BeginDraw(0, ID_ZAF_SCREEN, clip, clip); uglBitmapBlt(gc, UGL_DEFAULT_ID, column, line, column + width - 1, line + height - 1, devImage[imageType].scrBitmapID, 0, 0); // Put device image at new location. uglBitmapBlt(gc, devImage[imageType].devBitmapID, 0, 0, devImage[imageType].devRegion.Width() - 1, devImage[imageType].devRegion.Height() - 1, UGL_DEFAULT_ID, devImage[imageType].devRegion.left, devImage[imageType].devRegion.top); EndDraw(); stopDevice--;#if defined(ZAF_RTOS) ZafScreenDisplay::classSem->Give();#endif return (true);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -