📄 draw.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 + -