ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

gdibatch.c
Go to the documentation of this file.
00001 
00002 #include <win32k.h>
00003 
00004 #define NDEBUG
00005 #include <debug.h>
00006 
00007 
00008 //
00009 // Gdi Batch Flush support functions.
00010 //
00011 
00012 //
00013 // DoDeviceSync
00014 //
00015 // based on IntEngEnter from eng/engmisc.c
00016 //
00017 VOID
00018 FASTCALL
00019 DoDeviceSync( SURFOBJ *Surface, PRECTL Rect, FLONG fl)
00020 {
00021   PPDEVOBJ Device = (PDEVOBJ*)Surface->hdev;
00022 // No punting and "Handle to a surface, provided that the surface is device-managed.
00023 // Otherwise, dhsurf is zero".
00024   if (!(Device->flFlags & PDEV_DRIVER_PUNTED_CALL) && (Surface->dhsurf))
00025   {
00026      if (Device->DriverFunctions.SynchronizeSurface)
00027      {
00028        Device->DriverFunctions.SynchronizeSurface(Surface, Rect, fl);
00029      }
00030      else
00031      {
00032        if (Device->DriverFunctions.Synchronize)
00033        {
00034          Device->DriverFunctions.Synchronize(Surface->dhpdev, Rect);
00035        }
00036      }
00037   }
00038 }
00039 
00040 VOID
00041 FASTCALL
00042 SynchonizeDriver(FLONG Flags)
00043 {
00044   SURFOBJ *SurfObj;
00045   //PPDEVOBJ Device;
00046 
00047   if (Flags & GCAPS2_SYNCFLUSH)
00048       Flags = DSS_FLUSH_EVENT;
00049   if (Flags & GCAPS2_SYNCTIMER)
00050       Flags = DSS_TIMER_EVENT;
00051 
00052   //Device = IntEnumHDev();
00053 //  UNIMPLEMENTED;
00054 //ASSERT(FALSE);
00055   SurfObj = 0;// EngLockSurface( Device->pSurface );
00056   if(!SurfObj) return;
00057   DoDeviceSync( SurfObj, NULL, Flags);
00058   EngUnlockSurface(SurfObj);
00059   return;
00060 }
00061 
00062 //
00063 // Process the batch.
00064 //
00065 ULONG
00066 FASTCALL
00067 GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
00068 {
00069   BOOL Hit = FALSE;
00070   ULONG Cmd = 0, Size = 0;
00071   PDC_ATTR pdcattr = NULL;
00072 
00073   if (dc)
00074   {
00075      pdcattr = dc->pdcattr;
00076   }
00077 
00078   _SEH2_TRY
00079   {
00080      Cmd = pHdr->Cmd;
00081      Size = pHdr->Size; // Return the full size of the structure.
00082   }
00083   _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00084   {
00085      Hit = TRUE;
00086   }
00087   _SEH2_END;
00088 
00089   if (Hit)
00090   {
00091      DPRINT1("WARNING! GdiBatch Fault!\n");
00092      return 0;
00093   }
00094 
00095   // FYI! The thread is approaching the end of sunset.
00096   switch(Cmd)
00097   {
00098      case GdiBCPatBlt: // Highest pri first!
00099         break;
00100      case GdiBCPolyPatBlt:
00101         break;
00102      case GdiBCTextOut:
00103         break;
00104      case GdiBCExtTextOut:
00105         break;
00106      case GdiBCSetBrushOrg:
00107      {
00108         PGDIBSSETBRHORG pgSBO;
00109         if (!dc) break;
00110         pgSBO = (PGDIBSSETBRHORG) pHdr;
00111         pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin;
00112         DC_vSetBrushOrigin(dc, pgSBO->ptlBrushOrigin.x, pgSBO->ptlBrushOrigin.y);
00113         break;
00114      }
00115      case GdiBCExtSelClipRgn:
00116         break;
00117      case GdiBCSelObj:
00118      {
00119         PGDIBSOBJECT pgO;
00120         PTEXTOBJ pNewFnt = NULL;
00121 
00122         if (!dc) break;
00123         pgO = (PGDIBSOBJECT) pHdr;
00124 
00125         if (NT_SUCCESS(TextIntRealizeFont((HFONT)pgO->hgdiobj,NULL)))
00126         {
00127            /* LFONTOBJ use share and locking. */
00128            pNewFnt = TEXTOBJ_LockText(pgO->hgdiobj);
00129 
00130            dc->dclevel.plfnt = pNewFnt;
00131            dc->hlfntCur = pgO->hgdiobj;
00132            pdcattr->hlfntNew = pgO->hgdiobj;
00133            pdcattr->ulDirty_ |= DIRTY_CHARSET;
00134            pdcattr->ulDirty_ &= ~SLOW_WIDTHS;
00135         }
00136         if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt);
00137         break;
00138      }
00139      case GdiBCDelRgn:
00140         DPRINT("Delete Region Object!\n");
00141      case GdiBCDelObj:
00142      {
00143         PGDIBSOBJECT pgO = (PGDIBSOBJECT) pHdr;
00144         GreDeleteObject( pgO->hgdiobj );
00145         break;
00146      }
00147      default:
00148         break;
00149   }
00150 
00151   return Size;
00152 }
00153 
00154 /*
00155  * NtGdiFlush
00156  *
00157  * Flushes the calling thread's current batch.
00158  */
00159 VOID
00160 APIENTRY
00161 NtGdiFlush(VOID)
00162 {
00163   SynchonizeDriver(GCAPS2_SYNCFLUSH);
00164 }
00165 
00166 /*
00167  * NtGdiFlushUserBatch
00168  *
00169  * Callback for thread batch flush routine.
00170  *
00171  * Think small & fast!
00172  */
00173 NTSTATUS
00174 APIENTRY
00175 NtGdiFlushUserBatch(VOID)
00176 {
00177   PTEB pTeb = NtCurrentTeb();
00178   ULONG GdiBatchCount = pTeb->GdiBatchCount;
00179 
00180   if( (GdiBatchCount > 0) && (GdiBatchCount <= (GDIBATCHBUFSIZE/4)))
00181   {
00182     HDC hDC = (HDC) pTeb->GdiTebBatch.HDC;
00183 
00184     /*  If hDC is zero and the buffer fills up with delete objects we need
00185         to run anyway.
00186      */
00187     if (hDC || GdiBatchCount)
00188     {
00189       PCHAR pHdr = (PCHAR)&pTeb->GdiTebBatch.Buffer[0];
00190       PDC pDC = NULL;
00191 
00192       if (GDI_HANDLE_GET_TYPE(hDC) == GDILoObjType_LO_DC_TYPE && GreIsHandleValid(hDC))
00193       {
00194           pDC = DC_LockDc(hDC);
00195       }
00196 
00197        // No need to init anything, just go!
00198        for (; GdiBatchCount > 0; GdiBatchCount--)
00199        {
00200            ULONG Size;
00201            // Process Gdi Batch!
00202            Size = GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr);
00203            if (!Size) break;
00204            pHdr += Size;
00205        }
00206 
00207        if (pDC)
00208        {
00209            DC_UnlockDc(pDC);
00210        }
00211 
00212        // Exit and clear out for the next round.
00213        pTeb->GdiTebBatch.Offset = 0;
00214        pTeb->GdiBatchCount = 0;
00215        pTeb->GdiTebBatch.HDC = 0;
00216     }
00217   }
00218 
00219   // FIXME: On Windows XP the function returns &pTeb->RealClientId, maybe VOID?
00220   return STATUS_SUCCESS;
00221 }
00222 
00223 

Generated on Sat May 26 2012 04:37:14 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.