⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 draw.c

📁 epson公司的一个关于s1d13706的低层驱动程序
💻 C
字号:
/*
**===========================================================================
** DRAW.C - This file contains all the routines for drawing rotated image.
**---------------------------------------------------------------------------
** Copyright (c) 2000, 2001 Epson Research and Development, Inc.
** All Rights Reserved.
**===========================================================================
*/

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#include "hal.h"
#include "demo.h"

/*-------------------------------------------------------------------------*/

static const char Revision[] = "DRAW.C=$Revision: 2 $";

/*-------------------------------------------------------------------------*/

static int VariablesInitialized = FALSE;
static BYTE *SrcBuffer = NULL;
static BYTE *DestBuffer = NULL;
static unsigned SubWinWidth = 0;
static unsigned SubWinHeight = 0;
static DWORD SubWinSize = 0;
static DWORD SubWinSizeInDwords = 0;

/*-------------------------------------------------------------------------*/

//
// Allocate memory for buffers
// width and height represent the sub-window size in landscape mode
//
int InitImageTranslation(unsigned width, unsigned height)
   {
   // Bits-per-pixel must be 8
   if (seGetBitsPerPixel() != 8)
      return FALSE;


   // Ensure that width and height are multiples of 32/bpp

   if (((width / 4) * 4) != width)
      return FALSE;


   if (((height / 4) * 4) != height)
      return FALSE;


   SubWinSize = width * height;
   SubWinSizeInDwords = SubWinSize / 4;

   SubWinWidth = width;
   SubWinHeight = height;

   SrcBuffer = (BYTE *) malloc(sizeof(BYTE) * SubWinSize);
   DestBuffer = (BYTE *) malloc(sizeof(BYTE) * SubWinSize);

//   DestBuffer = (BYTE *) seGetSurfaceLinearAddress();

   if ((SrcBuffer == NULL) || (DestBuffer == NULL))
      return FALSE;
   else
      {
      VariablesInitialized = TRUE;
      return TRUE;
      }
   }

/*-------------------------------------------------------------------------*/

//
// Copy image in Sub-Window to buffer
//
int CopySubWin2Buffer(DWORD SubWinAddr)
   {
   DWORD i;
   DWORD *pSrc, *pDest;

   if (!VariablesInitialized)
      return FALSE;

   pSrc = (DWORD *) SubWinAddr;
   pDest = (DWORD *) SrcBuffer;

   for (i = 0; i < SubWinSizeInDwords; ++i, ++pSrc, ++pDest)
      *pDest = *pSrc;

   return TRUE;
   }

/*-------------------------------------------------------------------------*/

//
// Copy image in buffer to Sub-Window
//
int CopyBuffer2SubWin(DWORD SubWinAddr)
   {
   DWORD i;
   DWORD *pSrc, *pDest;

   if (!VariablesInitialized)
      return FALSE;

   pSrc = (DWORD *) DestBuffer;
   pDest = (DWORD *) SubWinAddr;

   for (i = 0; i < SubWinSizeInDwords; ++i, ++pSrc, ++pDest)
      *pDest = *pSrc;

   return TRUE;
   }

/*-------------------------------------------------------------------------*/

//
// Takes landscape image and rotates 90 degrees (but for landscape mode)
//
int TranslateLandscapeBottomToLandscapeRight(void)
   {
   unsigned x, y;
   BYTE val;
   DWORD addr;


   if (!VariablesInitialized)
      return FALSE;

   //
   // width and height of the sub-window
   // as seen from the landscape view.
   //
   for (y = 0; y < SubWinWidth; ++y)
      {
      for (x = 0; x < SubWinHeight; ++x)
         {
         addr = x + (y * SubWinHeight);
         val = SrcBuffer[addr];

         addr = ((SubWinHeight - x - 1) * SubWinWidth) + y;

         if (addr < SubWinSize)
            DestBuffer[addr] = val;
         }
      }

   return TRUE;
   }

/*-------------------------------------------------------------------------*/

//
// Rotates image in SrcBuffer 90 degrees counterclockwise and puts result
// in DestBuffer.
//
int TranslateToRotate90(void)
   {
   unsigned x, y;
   BYTE val;
   DWORD addr;


   if (!VariablesInitialized)
      return FALSE;

   //
   // width and height of the sub-window
   // as seen from the landscape view.
   //
   for (y = 0; y < SubWinHeight; ++y)
      {
      for (x = 0; x < SubWinWidth; ++x)
         {
         addr = x + (y * SubWinWidth);
         val = SrcBuffer[addr];

         addr = (x * SubWinHeight) + (SubWinHeight - y) - 1;

         if (addr < SubWinSize)
            DestBuffer[addr] = val;
         }
      }

   return TRUE;
   }

/*-------------------------------------------------------------------------*/

//
// Rotates image in SrcBuffer 90 degrees counterclockwise and puts result
// in DestBuffer.
//
int TranslateToRotate180(void)
   {
   unsigned x, y;
   BYTE val;
   DWORD addr;


   if (!VariablesInitialized)
      return FALSE;

   //
   // width and height of the sub-window
   // as seen from the landscape view.
   //
   for (y = 0; y < SubWinWidth; ++y)
      {
      for (x = 0; x < SubWinHeight; ++x)
         {
         addr = x + (y * SubWinHeight);
         val = SrcBuffer[addr];

         addr = (x * SubWinWidth) + (SubWinWidth - y - 1);

         if (addr < SubWinSize)
            DestBuffer[addr] = val;
         }
      }

   return TRUE;
   }

/*-------------------------------------------------------------------------*/

void SetRotateLandscape(DWORD StartAddr)
   {
   DWORD addr;
   unsigned bpp;
   unsigned val;
   unsigned MainWinWidth, MainWinHeight;
   unsigned side;

   val = seReadRegByte(REG_SPECIAL_EFFECTS) & ~0x03;
   seWriteRegByte(REG_SPECIAL_EFFECTS, val);   // Landscape

   bpp = seGetBitsPerPixel();

   seGetMainWinResolution(&MainWinWidth, &MainWinHeight);

   if (MainWinWidth > MainWinHeight)
      side = MainWinHeight;
   else
      side = MainWinWidth;

   // Adjust Main-Window Display Start Address Register
   seWriteRegDword(REG_MAIN_WIN_DISP_START_ADDR0, 0);


   // Adjust Sub-Window Display Start Address Register
   addr = StartAddr / 4;
   seWriteRegDword(REG_SUB_WIN_DISP_START_ADDR0, addr);

   // Adjust Sub-Window Line Address Offset Register
   seWriteRegWord(REG_SUB_WIN_ADDR_OFFSET0, SubWinWidth / (32 / bpp));

   // Adjust Sub-Window X Start Position Register
   seWriteRegWord(REG_SUB_WIN_X_START_POS0, side / (32 / bpp));

   // Adjust Sub-Window Y Start Position Register
   seWriteRegWord(REG_SUB_WIN_Y_START_POS0, 0);

   // Adjust Sub-Window X End Position Register
   seWriteRegWord(REG_SUB_WIN_X_END_POS0, (MainWinWidth / (32 / bpp)) - 1);

   // Adjust Sub-Window Y End Position Register
   seWriteRegWord(REG_SUB_WIN_Y_END_POS0, MainWinHeight - 1);
   }

/*-------------------------------------------------------------------------*/

void SetRotate90(DWORD StartAddr)
   {
   DWORD addr;
   unsigned bpp;
   unsigned val;
   unsigned MainWinWidth, MainWinHeight;
   unsigned side;

   val = seReadRegByte(REG_SPECIAL_EFFECTS) & ~0x03;
   seWriteRegByte(REG_SPECIAL_EFFECTS, val | 0x01);   // SwivelView 90

   bpp = seGetBitsPerPixel();

   seGetMainWinResolution(&MainWinWidth, &MainWinHeight);

   if (MainWinWidth > MainWinHeight)
      side = MainWinHeight;
   else
      side = MainWinWidth;

   // Adjust Main-Window Display Start Address Register
   addr = (((side * bpp / 8)) / 4) - 1;
   seWriteRegDword(REG_MAIN_WIN_DISP_START_ADDR0, addr);


   // Adjust Sub-Window Display Start Address Register
   addr = ((StartAddr + (SubWinHeight * bpp / 8)) / 4) - 1;
   seWriteRegDword(REG_SUB_WIN_DISP_START_ADDR0, addr);

   // Adjust Sub-Window Line Address Offset Register
   seWriteRegWord(REG_SUB_WIN_ADDR_OFFSET0, SubWinHeight / (32 / bpp));

   // Adjust Sub-Window X Start Position Register
   seWriteRegWord(REG_SUB_WIN_X_START_POS0, side);

   // Adjust Sub-Window Y Start Position Register
   seWriteRegWord(REG_SUB_WIN_Y_START_POS0, 0);

   // Adjust Sub-Window X End Position Register
   seWriteRegWord(REG_SUB_WIN_X_END_POS0, MainWinHeight - 1);

   // Adjust Sub-Window Y End Position Register
   seWriteRegWord(REG_SUB_WIN_Y_END_POS0, (MainWinWidth / (32 / bpp)) - 1);
   }

/*-------------------------------------------------------------------------*/

void SetRotate180(DWORD StartAddr)
   {
   DWORD addr;
   unsigned bpp;
   unsigned val;
   unsigned MainWinWidth, MainWinHeight;
   unsigned side;

   val = seReadRegByte(REG_SPECIAL_EFFECTS) & ~0x03;
   seWriteRegByte(REG_SPECIAL_EFFECTS, val | 0x02);   // SwivelView 180

   bpp = seGetBitsPerPixel();

   seGetMainWinResolution(&MainWinWidth, &MainWinHeight);

   if (MainWinWidth > MainWinHeight)
      side = MainWinHeight;
   else
      side = MainWinWidth;

   // Adjust Main-Window Display Start Address Register
   addr = (((side * side * bpp / 8)) / 4) - 1;
   seWriteRegDword(REG_MAIN_WIN_DISP_START_ADDR0, addr);


   // Adjust Sub-Window Display Start Address Register
   addr = ((StartAddr + (SubWinWidth * SubWinHeight * bpp / 8)) / 4) - 1;
   seWriteRegDword(REG_SUB_WIN_DISP_START_ADDR0, addr);

   // Adjust Sub-Window Line Address Offset Register
   seWriteRegWord(REG_SUB_WIN_ADDR_OFFSET0, (MainWinWidth - side) / (32 / bpp));

   // Adjust Sub-Window X Start Position Register
   seWriteRegWord(REG_SUB_WIN_X_START_POS0, side / (32 / bpp));

   // Adjust Sub-Window Y Start Position Register
   seWriteRegWord(REG_SUB_WIN_Y_START_POS0, 0);

   // Adjust Sub-Window X End Position Register
   seWriteRegWord(REG_SUB_WIN_X_END_POS0, (MainWinWidth / (32 / bpp)) - 1);

   // Adjust Sub-Window Y End Position Register
   seWriteRegWord(REG_SUB_WIN_Y_END_POS0, MainWinHeight - 1);
   }

/*-------------------------------------------------------------------------*/

void SetRotate270(DWORD StartAddr)
   {
   DWORD addr;
   unsigned bpp;
   unsigned val;
   unsigned MainWinWidth, MainWinHeight;
   unsigned side;

   val = seReadRegByte(REG_SPECIAL_EFFECTS) & ~0x03;
   seWriteRegByte(REG_SPECIAL_EFFECTS, val | 0x03);   // SwivelView 270

   bpp = seGetBitsPerPixel();

   seGetMainWinResolution(&MainWinWidth, &MainWinHeight);

   if (MainWinWidth > MainWinHeight)
      side = MainWinHeight;
   else
      side = MainWinWidth;

   // Adjust Main-Window Display Start Address Register
   addr = ((side - 1) * side * bpp / 8) / 4;
   seWriteRegDword(REG_MAIN_WIN_DISP_START_ADDR0, addr);


   // Adjust Sub-Window Display Start Address Register
   addr = (StartAddr + (SubWinHeight * (SubWinWidth - 1) * bpp / 8)) / 4;
   seWriteRegDword(REG_SUB_WIN_DISP_START_ADDR0, addr);

   // Adjust Sub-Window Line Address Offset Register
   seWriteRegWord(REG_SUB_WIN_ADDR_OFFSET0, SubWinHeight / (32 / bpp));

   // Adjust Sub-Window X Start Position Register
   seWriteRegWord(REG_SUB_WIN_X_START_POS0, side);

   // Adjust Sub-Window Y Start Position Register
   seWriteRegWord(REG_SUB_WIN_Y_START_POS0, 0);

   // Adjust Sub-Window X End Position Register
   seWriteRegWord(REG_SUB_WIN_X_END_POS0, MainWinHeight - 1);

   // Adjust Sub-Window Y End Position Register
   seWriteRegWord(REG_SUB_WIN_Y_END_POS0, (MainWinWidth / (32 / bpp)) - 1);
   }

/*-------------------------------------------------------------------------*/

⌨️ 快捷键说明

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