pen.c

来自「一个类似windows」· C语言 代码 · 共 169 行

C
169
字号
/*
 * ReactOS Win32 Subsystem
 *
 * Copyright (C) 1998 - 2004 ReactOS Team
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * $Id: pen.c 21292 2006-03-11 23:50:04Z jimtabor $
 */

#include <w32k.h>

#define NDEBUG
#include <debug.h>

/* PRIVATE FUNCTIONS **********************************************************/

HPEN FASTCALL
IntGdiCreatePenIndirect(PLOGPEN LogPen)
{
   HPEN hPen;
   PGDIBRUSHOBJ PenObject;
   static const WORD wPatternAlternate[] = {0x5555};
   static const WORD wPatternDash[] = {0x0F0F};
   static const WORD wPatternDot[] = {0x3333};

   if (LogPen->lopnStyle > PS_INSIDEFRAME)
      return 0;

   hPen = PENOBJ_AllocPen();
   if (!hPen)
   {
      SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
      DPRINT("Can't allocate pen\n");
      return 0;
   }

   PenObject = PENOBJ_LockPen(hPen);
   /* FIXME - Handle PenObject == NULL!!! */
   PenObject->ptPenWidth = LogPen->lopnWidth;
   PenObject->ulPenStyle = LogPen->lopnStyle;
   PenObject->BrushAttr.lbColor = LogPen->lopnColor;
   PenObject->flAttrs = GDIBRUSH_IS_OLDSTYLEPEN;
   switch (LogPen->lopnStyle)
   {
      case PS_NULL:
         PenObject->flAttrs |= GDIBRUSH_IS_NULL;
         break;

      case PS_SOLID:
         PenObject->flAttrs |= GDIBRUSH_IS_SOLID;
         break;

      case PS_ALTERNATE:
         PenObject->flAttrs |= GDIBRUSH_IS_BITMAP;
         PenObject->hbmPattern = NtGdiCreateBitmap(8, 1, 1, 1, (LPBYTE)wPatternAlternate);
         break;

      case PS_DOT:
         PenObject->flAttrs |= GDIBRUSH_IS_BITMAP;
         PenObject->hbmPattern = NtGdiCreateBitmap(8, 1, 1, 1, (LPBYTE)wPatternDot);
         break;

      case PS_DASH:
         PenObject->flAttrs |= GDIBRUSH_IS_BITMAP;
         PenObject->hbmPattern = NtGdiCreateBitmap(8, 1, 1, 1, (LPBYTE)wPatternDash);
         break;

      case PS_INSIDEFRAME:
         /* FIXME: does it need some additional work? */
         PenObject->flAttrs |= GDIBRUSH_IS_SOLID;
         break;

      default:
         DPRINT1("FIXME: IntGdiCreatePenIndirect is UNIMPLEMENTED\n");
   }

   PENOBJ_UnlockPen(PenObject);

   return hPen;
}

/* PUBLIC FUNCTIONS ***********************************************************/

HPEN STDCALL
NtGdiCreatePen(
   INT PenStyle,
   INT Width,
   COLORREF Color,
   IN HBRUSH hbr)
{
  LOGPEN LogPen;

  LogPen.lopnStyle = PenStyle;
  LogPen.lopnWidth.x = Width;
  LogPen.lopnWidth.y = 0;
  LogPen.lopnColor = Color;

  return IntGdiCreatePenIndirect(&LogPen);
}

HPEN STDCALL
NtGdiCreatePenIndirect(CONST PLOGPEN LogPen)
{
   LOGPEN SafeLogPen;
   NTSTATUS Status = STATUS_SUCCESS;

   _SEH_TRY
   {
     ProbeForRead(LogPen,
                  sizeof(LOGPEN),
                  1);
     SafeLogPen = *LogPen;
   }
   _SEH_HANDLE
   {
     Status = _SEH_GetExceptionCode();
   }
   _SEH_END;

   if (!NT_SUCCESS(Status))
   {
      SetLastNtError(Status);
      return 0;
   }

   return IntGdiCreatePenIndirect(&SafeLogPen);
}

HPEN STDCALL
NtGdiExtCreatePen(
   DWORD PenStyle,
   DWORD Width,
   IN ULONG iBrushStyle,
   IN ULONG ulColor,
   IN ULONG_PTR lClientHatch,
   IN ULONG_PTR lHatch,
   DWORD StyleCount,
   PULONG Style,
   IN ULONG cjDIB,
   IN BOOL bOldStylePen,
   IN OPTIONAL HBRUSH hbrush)
{
    LOGPEN LogPen;

   if (PenStyle & PS_USERSTYLE)
      PenStyle = (PenStyle & ~PS_STYLE_MASK) | PS_SOLID;

   LogPen.lopnStyle = PenStyle & PS_STYLE_MASK;
   LogPen.lopnWidth.x = Width;
   LogPen.lopnColor = ulColor;

   return IntGdiCreatePenIndirect(&LogPen);
}

/* EOF */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?