TempleOSCD_140715.ISO
This commit is contained in:
1 parent
7ef616a20e
commit
64f679eeb9
1095 files changed
+24814
-221011
No files matched your search
+55
-41
@@ -1,48 +1,55 @@
|
||||
#help_index "Graphics"
|
||||
U0 GrInit1()
|
||||
{
|
||||
DefineLstLoad("ST_SPRITE_TYPES",
|
||||
"End\0Color 8Bit\0Dither Color 8Bit\0"
|
||||
DefineLstLoad("ST_SPRITE_ELEM_TYPES",
|
||||
"End\0Color\0Dither Color\0"
|
||||
"Width\0Planar Symmetry\0Transform On\0Transform Off\0Shift\0"
|
||||
"Point\0PolyPoint\0Line\0PolyLine\0Rect\0Rotated Rect\0"
|
||||
"Circle\0Ellipse\0Polygon\0BSpline2\0BSpline2 Closed\0BSpline3\0BSpline3 Closed\0"
|
||||
"Flood Fill\0Flood Fill Not Color\0BitMap 8Bit\0Mesh\0Shiftable Mesh\0"
|
||||
"Flood Fill\0Flood Fill Not Color\0BitMap\0Mesh\0Shiftable Mesh\0"
|
||||
"Arrow\0Text\0Text Box\0Text Diamond\0");
|
||||
DefineLstLoad("ST_SPRITE_ELEM_CODES",
|
||||
"End\0Color\0Color\0"
|
||||
"Width\0PlanarSymmetry\0Transform\0Transform\0Shift\0"
|
||||
"Pt\0PolyPt\0Line\0PolyLine\0Rect\0Rect\0"
|
||||
"Circle\0Ellipse\0Polygon\0BSpline2\0BSpline2\0BSpline3\0BSpline3\0"
|
||||
"FloodFill\0FloodFill\0BitMap\0Mesh\0Mesh\0"
|
||||
"Arrow\0Text\0TextBox\0TextDiamond\0");
|
||||
}
|
||||
GrInit1;
|
||||
|
||||
#help_index "Graphics/Sprite"
|
||||
#define GRST_END 0
|
||||
#define GRST_COLOR8 1
|
||||
#define GRST_DITHER_COLOR8 2
|
||||
#define GRST_WIDTH 3
|
||||
#define GRST_PLANAR_SYMMETRY 4
|
||||
#define GRST_TRANSFORM_ON 5
|
||||
#define GRST_TRANSFORM_OFF 6
|
||||
#define GRST_SHIFT 7
|
||||
#define GRST_PT 8
|
||||
#define GRST_POLYPT 9
|
||||
#define GRST_LINE 10
|
||||
#define GRST_POLYLINE 11
|
||||
#define GRST_RECT 12
|
||||
#define GRST_ROTATED_RECT 13
|
||||
#define GRST_CIRCLE 14
|
||||
#define GRST_ELLIPSE 15
|
||||
#define GRST_POLYGON 16
|
||||
#define GRST_BSPLINE2 17
|
||||
#define GRST_BSPLINE2_CLOSED 18
|
||||
#define GRST_BSPLINE3 19
|
||||
#define GRST_BSPLINE3_CLOSED 20
|
||||
#define GRST_FLOOD_FILL 21
|
||||
#define GRST_FLOOD_FILL_NOT 22
|
||||
#define GRST_BITMAP8 23
|
||||
#define GRST_MESH 24
|
||||
#define GRST_SHIFTABLE_MESH 25
|
||||
#define GRST_ARROW 26
|
||||
#define GRST_TEXT 27
|
||||
#define GRST_TEXT_BOX 28
|
||||
#define GRST_TEXT_DIAMOND 29
|
||||
#define GRST_NUM_TYPES 30
|
||||
#define SPT_END 0
|
||||
#define SPT_COLOR 1
|
||||
#define SPT_DITHER_COLOR 2
|
||||
#define SPT_WIDTH 3
|
||||
#define SPT_PLANAR_SYMMETRY 4
|
||||
#define SPT_TRANSFORM_ON 5
|
||||
#define SPT_TRANSFORM_OFF 6
|
||||
#define SPT_SHIFT 7
|
||||
#define SPT_PT 8
|
||||
#define SPT_POLYPT 9
|
||||
#define SPT_LINE 10
|
||||
#define SPT_POLYLINE 11
|
||||
#define SPT_RECT 12
|
||||
#define SPT_ROTATED_RECT 13
|
||||
#define SPT_CIRCLE 14
|
||||
#define SPT_ELLIPSE 15
|
||||
#define SPT_POLYGON 16
|
||||
#define SPT_BSPLINE2 17
|
||||
#define SPT_BSPLINE2_CLOSED 18
|
||||
#define SPT_BSPLINE3 19
|
||||
#define SPT_BSPLINE3_CLOSED 20
|
||||
#define SPT_FLOOD_FILL 21
|
||||
#define SPT_FLOOD_FILL_NOT 22
|
||||
#define SPT_BITMAP 23
|
||||
#define SPT_MESH 24
|
||||
#define SPT_SHIFTABLE_MESH 25
|
||||
#define SPT_ARROW 26
|
||||
#define SPT_TEXT 27
|
||||
#define SPT_TEXT_BOX 28
|
||||
#define SPT_TEXT_DIAMOND 29
|
||||
#define SPT_NUM_TYPES 30
|
||||
|
||||
class CMeshTri
|
||||
{
|
||||
@@ -50,17 +57,24 @@ class CMeshTri
|
||||
I32 nums[3]; //Vertex number
|
||||
};
|
||||
|
||||
public class CSprite
|
||||
class CQueMeshTri
|
||||
{
|
||||
//See $LK,"Graphics/Sprite",A="HI:Graphics/Sprite"$
|
||||
CQueMeshTri *next,*last;
|
||||
U0 start;
|
||||
I32 color;
|
||||
I32 nums[3];
|
||||
};
|
||||
|
||||
public class CSprite
|
||||
{//See $LK,"Graphics/Sprite",A="HI:Graphics/Sprite"$
|
||||
//See $LK,"::/Adam/Gr/GrSpritePlot.CPP",A="FL:::/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored.
|
||||
CSprite *next,*last;
|
||||
|
||||
U0 start;
|
||||
U8 type;
|
||||
union {
|
||||
U8 color8;
|
||||
U16 dither_color8;
|
||||
U8 color;
|
||||
U16 dither_color;
|
||||
I32 x1;
|
||||
I32 num;
|
||||
I32 width;
|
||||
@@ -92,8 +106,10 @@ public class CSprite
|
||||
|
||||
extern I64 GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img);
|
||||
extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor);
|
||||
extern U8 *SpriteQue2Sprite(CSprite *root,I64 *_size=NULL);
|
||||
|
||||
#include "GrGlbls"
|
||||
#include "GrTextBase"
|
||||
#include "GrAsm"
|
||||
#include "GrDC"
|
||||
#include "GrPalette"
|
||||
@@ -103,7 +119,6 @@ extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor);
|
||||
#include "GrBitMap"
|
||||
#include "GrPrimatives"
|
||||
#include "GrComposites"
|
||||
#include "GrChar"
|
||||
|
||||
#define GE_ABORT (-1)
|
||||
#define GE_EXIT 0
|
||||
@@ -112,9 +127,8 @@ extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor);
|
||||
#include "GrSpritePlot"
|
||||
#include "SpriteMesh"
|
||||
#include "SpriteBitMap"
|
||||
#include "SpriteCode"
|
||||
#include "SpriteEd"
|
||||
#include "SpriteMain"
|
||||
|
||||
#include "GrEnd"
|
||||
|
||||
#help_index ""
|
||||
+62
-427
@@ -1,405 +1,46 @@
|
||||
#help_index "Graphics"
|
||||
I64 *gr_1_to_8_bits,*gr_1_to_8_colors;
|
||||
|
||||
#help_index "Graphics/Char;Char/Graphics"
|
||||
U32 *gr_text_base;
|
||||
U16 *gr_win_z_buf;
|
||||
|
||||
#help_index "Graphics/Misc"
|
||||
asm {
|
||||
USE64
|
||||
// ************************************
|
||||
_PLOT_SCREEN_U8::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
MOV RBX,U64 SF_ARG2[RBP]
|
||||
MOV RAX,U64 SF_ARG3[RBP]
|
||||
TEST RBX,RBX
|
||||
JS @@05
|
||||
TEST RAX,RAX
|
||||
JS @@05
|
||||
CMP RBX,TEXT_COLS
|
||||
JGE @@05
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@05
|
||||
IMUL2 RAX,TEXT_COLS
|
||||
ADD RBX,RAX
|
||||
SHL RBX,2
|
||||
ADD RBX,U64 [&gr_text_base]
|
||||
MOV RAX,U64 SF_ARG1[RBP]
|
||||
MOV U32 [RBX],EAX
|
||||
|
||||
MOV RAX,1
|
||||
POP RBP
|
||||
RET1 24
|
||||
@@05: XOR RAX,RAX
|
||||
POP RBP
|
||||
RET1 24
|
||||
// ************************************
|
||||
_PLOT_WIN_U8::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
MOV RCX,U64 SF_ARG1[RBP]
|
||||
MOV RBX,U64 CTask.scroll_x[RCX]
|
||||
SAR RBX,3
|
||||
ADD RBX,U64 SF_ARG3[RBP]
|
||||
MOV RAX,U64 CTask.scroll_y[RCX]
|
||||
SAR RAX,3
|
||||
ADD RAX,U64 SF_ARG4[RBP]
|
||||
|
||||
TEST RBX,RBX
|
||||
JS @@05
|
||||
ADD RBX,U64 CTask.win_left[RCX]
|
||||
CMP RBX,U64 CTask.win_right[RCX]
|
||||
JG @@05
|
||||
TEST RBX,RBX
|
||||
JS @@05
|
||||
CMP RBX,TEXT_COLS
|
||||
JGE @@05
|
||||
|
||||
TEST RAX,RAX
|
||||
JS @@05
|
||||
ADD RAX,U64 CTask.win_top[RCX]
|
||||
CMP RAX,U64 CTask.win_bottom[RCX]
|
||||
JG @@05
|
||||
TEST RAX,RAX
|
||||
JS @@05
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@05
|
||||
|
||||
IMUL2 RAX,TEXT_COLS
|
||||
ADD RBX,RAX
|
||||
SHL RBX,2
|
||||
ADD RBX,U64 [&gr_text_base]
|
||||
MOV RAX,U64 SF_ARG2[RBP]
|
||||
MOV U32 [RBX],EAX
|
||||
|
||||
MOV RAX,1
|
||||
POP RBP
|
||||
RET1 32
|
||||
@@05: XOR RAX,RAX
|
||||
POP RBP
|
||||
RET1 32
|
||||
// ************************************
|
||||
/*
|
||||
Bool PlotWinStr2(CTask *task,U8 *s,I64 len,
|
||||
I64 attr,I64 x,I64 y)
|
||||
*/
|
||||
_PLOT_WIN_STR2::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
MOV R9,U64 [&gr_text_base]
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
MOV RBX,U64 SF_ARG1[RBP]
|
||||
MOV RSI,U64 SF_ARG2[RBP]
|
||||
MOV RDI,U64 CTask.scroll_x[RBX]
|
||||
SAR RDI,3
|
||||
ADD RDI,U64 SF_ARG5[RBP]
|
||||
MOV RCX,U64 SF_ARG3[RBP]
|
||||
|
||||
TEST RDI,RDI
|
||||
JNS @@05
|
||||
ADD RCX,RDI
|
||||
SUB RSI,RDI
|
||||
XOR RDI,RDI
|
||||
@@05: ADD RDI,U64 CTask.win_left[RBX]
|
||||
MOV RDX,RCX
|
||||
ADD RDX,RDI
|
||||
DEC RDX
|
||||
CMP RDX,U64 CTask.win_right[RBX]
|
||||
JLE @@10
|
||||
MOV RAX,RDX
|
||||
SUB RAX,U64 CTask.win_right[RBX]
|
||||
SUB RDX,RAX
|
||||
SUB RCX,RAX
|
||||
@@10: TEST RDI,RDI
|
||||
JNS @@15
|
||||
ADD RCX,RDI
|
||||
SUB RSI,RDI
|
||||
XOR RDI,RDI
|
||||
@@15: INC RDX
|
||||
SUB RDX,TEXT_COLS
|
||||
JLE @@20
|
||||
SUB RCX,RDX
|
||||
@@20: CMP RCX,1
|
||||
JL @@30
|
||||
|
||||
MOV RAX,U64 CTask.scroll_y[RBX]
|
||||
SAR RAX,3
|
||||
ADD RAX,U64 SF_ARG6[RBP]
|
||||
TEST RAX,RAX
|
||||
JS @@30
|
||||
ADD RAX,U64 CTask.win_top[RBX]
|
||||
CMP RAX,U64 CTask.win_bottom[RBX]
|
||||
JG @@30
|
||||
TEST RAX,RAX
|
||||
JS @@30
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@30
|
||||
|
||||
IMUL2 RAX,TEXT_COLS
|
||||
ADD RDI,RAX
|
||||
SHL RDI,2
|
||||
ADD RDI,R9
|
||||
MOV RAX,U64 SF_ARG4[RBP]
|
||||
@@25: LODSB
|
||||
STOSD
|
||||
DEC RCX
|
||||
JNZ @@25
|
||||
|
||||
POP RDI
|
||||
POP RSI
|
||||
MOV RAX,TRUE
|
||||
POP RBP
|
||||
RET1 48
|
||||
|
||||
@@30: POP RDI
|
||||
POP RSI
|
||||
XOR RAX,RAX
|
||||
POP RBP
|
||||
RET1 48
|
||||
// ************************************
|
||||
/*
|
||||
Bool PlotAttrStr2(CTask *task,U32 *hl,I64 len,I64 x,I64 y)
|
||||
*/
|
||||
_PLOT_ATTR_STR2::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
MOV R9,U64 [&gr_text_base]
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
MOV RBX,U64 SF_ARG1[RBP]
|
||||
MOV RSI,U64 SF_ARG2[RBP]
|
||||
MOV RDI,U64 CTask.scroll_x[RBX]
|
||||
SAR RDI,3
|
||||
ADD RDI,U64 SF_ARG4[RBP]
|
||||
MOV RCX,U64 SF_ARG3[RBP]
|
||||
|
||||
TEST RDI,RDI
|
||||
JNS @@05
|
||||
ADD RCX,RDI
|
||||
SHL RDI,2
|
||||
SUB RSI,RDI
|
||||
XOR RDI,RDI
|
||||
@@05: ADD RDI,U64 CTask.win_left[RBX]
|
||||
MOV RDX,RCX
|
||||
ADD RDX,RDI
|
||||
DEC RDX
|
||||
CMP RDX,U64 CTask.win_right[RBX]
|
||||
JLE @@10
|
||||
MOV RAX,RDX
|
||||
SUB RAX,U64 CTask.win_right[RBX]
|
||||
SUB RDX,RAX
|
||||
SUB RCX,RAX
|
||||
@@10: TEST RDI,RDI
|
||||
JNS @@15
|
||||
ADD RCX,RDI
|
||||
SHL RDI,2
|
||||
SUB RSI,RDI
|
||||
XOR RDI,RDI
|
||||
@@15: INC RDX
|
||||
SUB RDX,TEXT_COLS
|
||||
JLE @@20
|
||||
SUB RCX,RDX
|
||||
@@20: CMP RCX,1
|
||||
JL @@30
|
||||
|
||||
MOV RAX,U64 CTask.scroll_y[RBX]
|
||||
SAR RAX,3
|
||||
ADD RAX,U64 SF_ARG5[RBP]
|
||||
TEST RAX,RAX
|
||||
JS @@30
|
||||
ADD RAX,U64 CTask.win_top[RBX]
|
||||
CMP RAX,U64 CTask.win_bottom[RBX]
|
||||
JG @@30
|
||||
TEST RAX,RAX
|
||||
JS @@30
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@30
|
||||
|
||||
IMUL2 RAX,TEXT_COLS
|
||||
ADD RDI,RAX
|
||||
SHL RDI,2
|
||||
ADD RDI,R9
|
||||
@@25: MOVSD
|
||||
DEC RCX
|
||||
JNZ @@25
|
||||
|
||||
POP RDI
|
||||
POP RSI
|
||||
MOV RAX,TRUE
|
||||
POP RBP
|
||||
RET1 40
|
||||
|
||||
@@30: POP RDI
|
||||
POP RSI
|
||||
XOR RAX,RAX
|
||||
POP RBP
|
||||
RET1 40
|
||||
// ************************************
|
||||
/*
|
||||
Bool PlotAttr(CTask *task,I64 len,
|
||||
I64 attr,I64 x,I64 y)
|
||||
*/
|
||||
_PLOT_ATTR::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
MOV R9,U64 [&gr_text_base]
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
MOV RBX,U64 SF_ARG1[RBP]
|
||||
MOV RDI,U64 CTask.scroll_x[RBX]
|
||||
SAR RDI,3
|
||||
ADD RDI,U64 SF_ARG4[RBP]
|
||||
MOV RCX,U64 SF_ARG2[RBP]
|
||||
|
||||
TEST RDI,RDI
|
||||
JNS @@05
|
||||
ADD RCX,RDI
|
||||
XOR RDI,RDI
|
||||
@@05: ADD RDI,U64 CTask.win_left[RBX]
|
||||
MOV RDX,RCX
|
||||
ADD RDX,RDI
|
||||
DEC RDX
|
||||
CMP RDX,U64 CTask.win_right[RBX]
|
||||
JLE @@10
|
||||
MOV RAX,RDX
|
||||
SUB RAX,U64 CTask.win_right[RBX]
|
||||
SUB RDX,RAX
|
||||
SUB RCX,RAX
|
||||
@@10: TEST RDI,RDI
|
||||
JNS @@15
|
||||
ADD RCX,RDI
|
||||
XOR RDI,RDI
|
||||
@@15: INC RDX
|
||||
SUB RDX,TEXT_COLS
|
||||
JLE @@20
|
||||
SUB RCX,RDX
|
||||
@@20: CMP RCX,1
|
||||
JL @@35
|
||||
|
||||
MOV RAX,U64 CTask.scroll_y[RBX]
|
||||
SAR RAX,3
|
||||
ADD RAX,U64 SF_ARG5[RBP]
|
||||
TEST RAX,RAX
|
||||
JS @@35
|
||||
ADD RAX,U64 CTask.win_top[RBX]
|
||||
CMP RAX,U64 CTask.win_bottom[RBX]
|
||||
JG @@35
|
||||
TEST RAX,RAX
|
||||
JS @@35
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@35
|
||||
|
||||
IMUL2 RAX,TEXT_COLS
|
||||
ADD RDI,RAX
|
||||
SHL RDI,2
|
||||
ADD RDI,R9
|
||||
MOV RBX,U64 SF_ARG3[RBP]
|
||||
MOV RSI,RDI
|
||||
@@25: LODSD
|
||||
TEST AL,AL
|
||||
JNZ @@30
|
||||
MOV RAX,RBX
|
||||
STOSD
|
||||
DEC RCX
|
||||
JNZ @@25
|
||||
|
||||
@@30: POP RDI
|
||||
POP RSI
|
||||
MOV RAX,TRUE
|
||||
POP RBP
|
||||
RET1 40
|
||||
|
||||
@@35: POP RDI
|
||||
POP RSI
|
||||
XOR RAX,RAX
|
||||
POP RBP
|
||||
RET1 40
|
||||
// ************************************
|
||||
_PLOT_BORDER_U8::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
MOV R9,U64 [&gr_text_base]
|
||||
MOV RCX,U64 SF_ARG1[RBP]
|
||||
MOV RBX,U64 CTask.scroll_x[RCX]
|
||||
SAR RBX,3
|
||||
ADD RBX,U64 SF_ARG3[RBP]
|
||||
MOV RAX,U64 CTask.scroll_y[RCX]
|
||||
SAR RAX,3
|
||||
ADD RAX,U64 SF_ARG4[RBP]
|
||||
|
||||
MOV RDX,-1
|
||||
CMP RBX,RDX
|
||||
JL @@05
|
||||
ADD RBX,U64 CTask.win_left[RCX]
|
||||
MOV RDX,U64 CTask.win_right[RCX]
|
||||
INC RDX
|
||||
CMP RBX,RDX
|
||||
JG @@05
|
||||
TEST RBX,RBX
|
||||
JS @@05
|
||||
CMP RBX,TEXT_COLS
|
||||
JGE @@05
|
||||
|
||||
MOV RDX,-1
|
||||
CMP RAX,RDX
|
||||
JL @@05
|
||||
ADD RAX,U64 CTask.win_top[RCX]
|
||||
MOV RDX,U64 CTask.win_bottom[RCX]
|
||||
INC RDX
|
||||
CMP RAX,RDX
|
||||
JG @@05
|
||||
TEST RAX,RAX
|
||||
JS @@05
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@05
|
||||
|
||||
IMUL2 RAX,TEXT_COLS
|
||||
ADD RBX,RAX
|
||||
SHL RBX,2
|
||||
ADD RBX,R9
|
||||
MOV RAX,U64 SF_ARG2[RBP]
|
||||
MOV U32 [RBX],EAX
|
||||
|
||||
MOV RAX,TRUE
|
||||
POP RBP
|
||||
RET1 32
|
||||
@@05: XOR RAX,RAX
|
||||
POP RBP
|
||||
RET1 32
|
||||
// ************************************
|
||||
_GR_UPDATE_LINE32::
|
||||
//************************************
|
||||
_GR_UPDATE_LINE64::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
|
||||
MOV RAX,U64 SF_ARG2[RBP]
|
||||
MOV RSI,U64 [RAX] //rsi=src2
|
||||
MOV RSI,U64 [RAX] //rsi=src
|
||||
MOV RBX,U64 [&reverse_bits_table]
|
||||
MOV RCX,U64 SF_ARG3[RBP] //rcx=d5
|
||||
MOV RCX,U64 SF_ARG3[RBP] //rcx=d
|
||||
MOV RAX,U64 SF_ARG4[RBP]
|
||||
MOV RDI,U64 [RAX] //rdi=vga image
|
||||
MOV RDI,U64 [RAX] //rdi=image
|
||||
|
||||
MOV RAX,U64 SF_ARG1[RBP]
|
||||
MOV R8,U64 [RAX] //rbp=vga dst
|
||||
MOV R8,U64 [RAX] //rbp=vga dst
|
||||
|
||||
@@05: LODSD
|
||||
CMP U32 [RDI],EAX
|
||||
@@05: LODSQ
|
||||
CMP U64 [RDI],RAX
|
||||
JE @@10
|
||||
MOV U32 [RDI],EAX
|
||||
MOV U64 [RDI],RAX
|
||||
XLATB
|
||||
ROR EAX,8
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR EAX,8
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR EAX,8
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR EAX,8
|
||||
MOV U32 [R8],EAX
|
||||
@@10: ADD RDI,4
|
||||
ADD R8,4
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR RAX,8
|
||||
MOV U64 [R8],RAX
|
||||
@@10: ADD RDI,8
|
||||
ADD R8,8
|
||||
DEC RCX
|
||||
JNZ @@05
|
||||
|
||||
@@ -413,36 +54,44 @@ _GR_UPDATE_LINE32::
|
||||
POP RSI
|
||||
POP RBP
|
||||
RET1 32
|
||||
// ************************************
|
||||
_GR_UPDATE_LINE32_FLUSH_CACHE::
|
||||
//************************************
|
||||
_GR_UPDATE_LINE64_FLUSH_CACHE::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
|
||||
MOV RAX,U64 SF_ARG2[RBP]
|
||||
MOV RSI,U64 [RAX] //rsi=src2
|
||||
MOV RSI,U64 [RAX] //rsi=src
|
||||
MOV RBX,U64 [&reverse_bits_table]
|
||||
MOV RCX,U64 SF_ARG3[RBP] //rcx=d5
|
||||
MOV RCX,U64 SF_ARG3[RBP] //rcx=d
|
||||
MOV RAX,U64 SF_ARG4[RBP]
|
||||
MOV RDI,U64 [RAX] //rdi=vga image
|
||||
MOV RDI,U64 [RAX] //rdi=image
|
||||
|
||||
MOV RAX,U64 SF_ARG1[RBP]
|
||||
MOV R8,U64 [RAX] //rbp=vga dst
|
||||
MOV R8,U64 [RAX] //rbp=vga dst
|
||||
|
||||
@@05: LODSD
|
||||
MOV U32 [RDI],EAX
|
||||
@@05: LODSQ
|
||||
MOV U64 [RDI],RAX
|
||||
XLATB
|
||||
ROR EAX,8
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR EAX,8
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR EAX,8
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR EAX,8
|
||||
MOV U32 [R8],EAX
|
||||
ADD RDI,4
|
||||
ADD R8,4
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR RAX,8
|
||||
XLATB
|
||||
ROR RAX,8
|
||||
MOV U64 [R8],RAX
|
||||
ADD RDI,8
|
||||
ADD R8,8
|
||||
DEC RCX
|
||||
JNZ @@05
|
||||
|
||||
@@ -456,7 +105,7 @@ _GR_UPDATE_LINE32_FLUSH_CACHE::
|
||||
POP RSI
|
||||
POP RBP
|
||||
RET1 32
|
||||
// ************************************
|
||||
//************************************
|
||||
_DC_BLOT_COLOR4::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
@@ -601,7 +250,7 @@ _DC_BLOT_COLOR4::
|
||||
POP RSI
|
||||
POP RBP
|
||||
RET1 32
|
||||
// ************************************
|
||||
//************************************
|
||||
_IS_PIX_COVERED0::
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
@@ -612,7 +261,7 @@ _IS_PIX_COVERED0::
|
||||
SAR RAX,3
|
||||
MOV RDX,U64 SF_ARG1[RBP]
|
||||
IMUL2 RCX,TEXT_COLS
|
||||
MOV RBX,U64 [&gr_win_z_buf]
|
||||
MOV RBX,U64 [&gr.win_z_buf]
|
||||
MOV DX,U16 CTask.win_z_num[RDX]
|
||||
ADD RCX,RAX
|
||||
XOR RAX,RAX
|
||||
@@ -621,17 +270,17 @@ _IS_PIX_COVERED0::
|
||||
INC RAX
|
||||
@@05: POP RBP
|
||||
RET1 24
|
||||
// ************************************
|
||||
//************************************
|
||||
_GR_ROP_EQU_U8_NO_CLIPPING::
|
||||
//Puts foreground char shape onto gr_dc2.
|
||||
//Puts foreground char shape onto gr.dc2.
|
||||
//ch.u8[1] is color as a whole byte
|
||||
//ch DOCEt_UNDERLINE attr flag is used.
|
||||
//ch ATTRf_UNDERLINE attr flag is used.
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
MOVZX RAX,U8 SF_ARG1[RBP]
|
||||
MOV RDX,U64 [&gr_font]
|
||||
MOV RDX,U64 [&text.font]
|
||||
MOV RAX,U64 [RDX+RAX*8] //RAX is 8x8 char font data, 64-bits
|
||||
BT U64 SF_ARG1[RBP],DOCEt_UNDERLINE
|
||||
BT U64 SF_ARG1[RBP],ATTRf_UNDERLINE
|
||||
JNC @@05
|
||||
MOV RBX,0xFF00000000000000
|
||||
OR RAX,RBX
|
||||
@@ -641,11 +290,11 @@ _GR_ROP_EQU_U8_NO_CLIPPING::
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
MOVZX RBX,U8 SF_ARG1+1[RBP] //Warning color is 8-bit
|
||||
MOV RDX,U64 [&gr_1_to_8_colors]
|
||||
MOV RDX,U64 [&gr.to_8_colors]
|
||||
MOV R8,U64 [RDX+RBX*8] //R8 is color repeated 8 times.
|
||||
MOV R9,U64 SF_ARG3[RBP] //R9 is width_internal
|
||||
MOV RDI,U64 SF_ARG2[RBP]
|
||||
MOV RSI,U64 [&gr_1_to_8_bits] //RSI is gr_1_to_8_bits
|
||||
MOV RSI,U64 [&gr.to_8_bits] //RSI is gr.to_8_bits
|
||||
|
||||
// m=my_1_to_8_bits[ch&255];ch>>=8;
|
||||
// *dst=*dst&~m|c&m;
|
||||
@@ -749,27 +398,13 @@ _GR_ROP_EQU_U8_NO_CLIPPING::
|
||||
@@10: POP RBP
|
||||
RET1 24
|
||||
}
|
||||
|
||||
#help_index "Graphics/Char;Char/Graphics"
|
||||
public _extern _PLOT_SCREEN_U8 Bool PlotScreenU8(I64 w,I64 x,I64 y);
|
||||
public _extern _PLOT_WIN_U8 Bool PlotWinU8(CTask *task,I64 w,I64 x,I64 y);
|
||||
public _extern _PLOT_WIN_STR2 Bool PlotWinStr2(
|
||||
CTask *task,U8 *s,I64 len,I64 attr,I64 x,I64 y);
|
||||
public _extern _PLOT_ATTR_STR2 Bool PlotAttrStr2(
|
||||
CTask *task,U32 *hl,I64 len,I64 x,I64 y);
|
||||
|
||||
public _extern _PLOT_ATTR Bool PlotWinAttr(
|
||||
CTask *task,I64 len,I64 attr,I64 x,I64 y);
|
||||
public _extern _PLOT_BORDER_U8 Bool PlotBorderU8(CTask *task,I64 w,I64 x,I64 y);
|
||||
_extern _GR_ROP_EQU_U8_NO_CLIPPING U0 GrRopEquU8NoClipping(I64 ch,U8 *dst,I64 width_internal);
|
||||
|
||||
#help_index "Graphics/Misc"
|
||||
//No clipping
|
||||
public _extern _IS_PIX_COVERED0 Bool IsPixCovered0(CTask *task,I64 x,I64 y);
|
||||
|
||||
_extern _GR_UPDATE_LINE32 U0 GrUpdateLine32(
|
||||
U32 **_dst3,U32 **_src2,I64 w,U8 **_vga);
|
||||
_extern _GR_UPDATE_LINE32_FLUSH_CACHE U0 GrUpdateLine32FlushCache(
|
||||
U32 **_dst3,U32 **_src2,I64 w,U8 **_vga);
|
||||
_extern _GR_UPDATE_LINE64 U0 GrUpdateLine64(
|
||||
U64 **_vga,U64 **_src,I64 d,U8 **_dst);
|
||||
_extern _GR_UPDATE_LINE64_FLUSH_CACHE U0 GrUpdateLine64FlushCache(
|
||||
U64 **_vga,U64 **_src,I64 d,U8 **_dst);
|
||||
_extern _DC_BLOT_COLOR4 U0 DCBlotColor4(
|
||||
U8 *dst,I64 *img,I64 *img_cache,I64 cnt);
|
||||
+92
-93
@@ -1,14 +1,14 @@
|
||||
#help_index "Graphics"
|
||||
|
||||
public Bool GrPlot0(CDC *dc=gr_dc,I64 x,I64 y)
|
||||
{ //No clipping or transformation or pen width
|
||||
public Bool GrPlot0(CDC *dc=gr.dc,I64 x,I64 y)
|
||||
{//2D. No clipping or transformation or pen width.
|
||||
U8 *dst;
|
||||
I32 *db;
|
||||
I64 d,dist;
|
||||
CColorROPU32 c,color=dc->color,bkcolor=dc->bkcolor;
|
||||
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) {
|
||||
dist=DistI64(x,y,dc->cur_x,dc->cur_y);
|
||||
dist=DistSqrI64(x,y,dc->cur_x,dc->cur_y);
|
||||
if (dist<=dc->nearest_dist) {
|
||||
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
|
||||
dc->nearest_dist=dist;
|
||||
@@ -51,7 +51,7 @@ public Bool GrPlot0(CDC *dc=gr_dc,I64 x,I64 y)
|
||||
break;
|
||||
case ROPB_COLLISION:
|
||||
c=*dst;
|
||||
if (c!=COLOR_TRANSPARENT&&c!=bkcolor.c0.color)
|
||||
if (c!=TRANSPARENT&&c!=bkcolor.c0.color)
|
||||
dc->collision_cnt++;
|
||||
break;
|
||||
case ROPB_XOR:
|
||||
@@ -61,15 +61,15 @@ public Bool GrPlot0(CDC *dc=gr_dc,I64 x,I64 y)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public I64 GrPeek0(CDC *dc=gr_dc,I64 x,I64 y)
|
||||
{ //No clipping or transformation
|
||||
public I64 GrPeek0(CDC *dc=gr.dc,I64 x,I64 y)
|
||||
{//2D. No clipping or transformation.
|
||||
return dc->body[dc->width_internal*y+x];
|
||||
}
|
||||
|
||||
#help_index "Graphics;Graphics/Device Contexts"
|
||||
|
||||
public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
|
||||
{ //Clipping but not transformation
|
||||
public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img)
|
||||
{//2D. Clipping but not transformation..
|
||||
I64 i,j,k,k1,kk,kk1,w1,h1,w2,h2,
|
||||
leading_bits,leading_bit_mask,whole_bytes,trailing_bits,trailing_bit_mask,
|
||||
reg bit_shift,dist,win_z_buf_line_inc,win_z_buf_line_dec,win_z_num,
|
||||
@@ -99,8 +99,8 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
|
||||
x+=win_task->pix_left;
|
||||
y+=win_task->pix_top;
|
||||
}
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) { //TODO:Untested
|
||||
dist=DistI64(x+img->width>>1,y+img->height>>1,dc->cur_x,dc->cur_y);
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) {//TODO:Untested
|
||||
dist=DistSqrI64(x+img->width>>1,y+img->height>>1,dc->cur_x,dc->cur_y);
|
||||
if (dist<=dc->nearest_dist) {
|
||||
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
|
||||
dc->nearest_dist=dist;
|
||||
@@ -134,12 +134,12 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
|
||||
dc->color&=~ROPF_DITHER;
|
||||
color=dc->color;
|
||||
leading_bits=-(w1+x)&7;
|
||||
leading_bit_mask=gr_1_to_8_bits[0xFF>>leading_bits];
|
||||
leading_bit_mask=gr.to_8_bits[0xFF>>leading_bits];
|
||||
bit_shift=-x&7;
|
||||
whole_bytes=(w2-w1-leading_bits)>>3;
|
||||
if (whole_bytes<0) whole_bytes=0;
|
||||
trailing_bits=(x+w2)&7;
|
||||
trailing_bit_mask=gr_1_to_8_bits[0xFF<<trailing_bits&0xFF];
|
||||
trailing_bit_mask=gr.to_8_bits[0xFF<<trailing_bits&0xFF];
|
||||
if (leading_bits+trailing_bits>w2-w1) {
|
||||
leading_bit_mask|=trailing_bit_mask;
|
||||
trailing_bits=0;
|
||||
@@ -152,7 +152,7 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
|
||||
for (j=h2-h1;j;j--) {
|
||||
for (i=w1;i<w2;i++) {
|
||||
c=dc->body[k1+i];
|
||||
if (c!=COLOR_TRANSPARENT&&c!=color&&img->body[k+i]!=COLOR_TRANSPARENT)
|
||||
if (c!=TRANSPARENT&&c!=color&&img->body[k+i]!=TRANSPARENT)
|
||||
dc->collision_cnt++;
|
||||
}
|
||||
k+=img->width_internal;
|
||||
@@ -160,13 +160,13 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
|
||||
}
|
||||
break;
|
||||
case ROPB_MONO:
|
||||
color_mask=gr_1_to_8_colors[color.c0.color];
|
||||
color_mask=gr.to_8_colors[color.c0.color];
|
||||
if (img->flags&DCF_NO_TRANSPARENTS) {
|
||||
if (!(dc->flags & DCF_SCREEN_BITMAP) || dc->flags&DCF_ON_TOP)
|
||||
win_z_buf_ptr=NULL;
|
||||
else {
|
||||
win_z_num=win_task->win_z_num;
|
||||
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
@@ -268,7 +268,7 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
|
||||
}
|
||||
} else {
|
||||
win_z_num =win_task->win_z_num;
|
||||
win_z_buf_ptr =gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_ptr =gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
@@ -307,7 +307,7 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
|
||||
win_z_buf_ptr=NULL;
|
||||
else {
|
||||
win_z_num=win_task->win_z_num;
|
||||
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
@@ -405,7 +405,7 @@ here1a:
|
||||
for (j=h1;j<h2;j++) {
|
||||
for (i=w1;i<w2;i++) {
|
||||
c=img->body[k+i];
|
||||
if (c!=COLOR_TRANSPARENT) {
|
||||
if (c!=TRANSPARENT) {
|
||||
dc->color.c0.color=c;
|
||||
GrPlot0(dc,x+i,y+j);
|
||||
}
|
||||
@@ -414,7 +414,7 @@ here1a:
|
||||
}
|
||||
} else {
|
||||
win_z_num =win_task->win_z_num;
|
||||
win_z_buf_ptr =gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_ptr =gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
@@ -430,7 +430,7 @@ here1a:
|
||||
for (i=w1;i<w2;) {
|
||||
if (color_mask) {
|
||||
c=img->body[k+i];
|
||||
if (c!=COLOR_TRANSPARENT) {
|
||||
if (c!=TRANSPARENT) {
|
||||
dc->color.c0.color=c;
|
||||
GrPlot0(dc,x+i,y+j);
|
||||
}
|
||||
@@ -458,7 +458,7 @@ here1a:
|
||||
win_z_buf_ptr=NULL;
|
||||
else {
|
||||
win_z_num=win_task->win_z_num;
|
||||
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
@@ -570,7 +570,7 @@ U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor)
|
||||
if (Bt(src+i1 ,k)) c|=2;
|
||||
if (Bt(src+i1*2,k)) c|=4;
|
||||
if (Bt(src+i1*3,k)) c|=8;
|
||||
if (c==bkcolor) c=COLOR_TRANSPARENT;
|
||||
if (c==bkcolor) c=TRANSPARENT;
|
||||
*dst++=c;
|
||||
}
|
||||
return dst;
|
||||
@@ -582,18 +582,18 @@ U8 *GrBitMap1ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor)
|
||||
for (k=0;k<i;k++) {
|
||||
c=0;
|
||||
if (Bt(src,k)) c=COLOR_MONO;
|
||||
if (c==bkcolor) c=COLOR_TRANSPARENT;
|
||||
if (c==bkcolor) c=TRANSPARENT;
|
||||
*dst++=c;
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
public CDC *DCExtract(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,CTask *task=NULL)
|
||||
{
|
||||
public CDC *DCExtract(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2,CTask *task=NULL)
|
||||
{//Extract new device context rect from device context.
|
||||
CDC *result;
|
||||
CTask *win_task;
|
||||
if (x1>x2) SwapU64(&x1,&x2);
|
||||
if (y1>y2) SwapU64(&y1,&y2);
|
||||
if (x1>x2) SwapI64(&x1,&x2);
|
||||
if (y1>y2) SwapI64(&y1,&y2);
|
||||
if (dc->flags & DCF_SCREEN_BITMAP) {
|
||||
win_task=dc->win_task;
|
||||
x1+=win_task->pix_left+win_task->scroll_x;
|
||||
@@ -609,8 +609,8 @@ public CDC *DCExtract(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,CTask *task=NULL
|
||||
|
||||
#help_index "Graphics/Char;Char/Graphics"
|
||||
|
||||
public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
{ //Clipping but not transformation
|
||||
public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch)
|
||||
{//2D. Clipping but not transformation.
|
||||
U8 reg *src,reg *dst,*font_ptr;
|
||||
I64 i,m,leading_bits,trailing_bits,leading_bit_mask,trailing_bit_mask,
|
||||
j,k1,kk1,w1,h1,w2,h2,reg bit_shift,dist,reg color_mask;
|
||||
@@ -638,8 +638,8 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
x+=win_task->pix_left;
|
||||
y+=win_task->pix_top;
|
||||
}
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) { //TODO:Untested
|
||||
dist=DistI64(x+w2>>1,y+h2>>1,dc->cur_x,dc->cur_y);
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) {//TODO:Untested
|
||||
dist=DistSqrI64(x+w2>>1,y+h2>>1,dc->cur_x,dc->cur_y);
|
||||
if (dist<=dc->nearest_dist) {
|
||||
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
|
||||
dc->nearest_dist=dist;
|
||||
@@ -670,15 +670,15 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
color=dc->color;
|
||||
leading_bits=-(w1+x)&7;
|
||||
if (!leading_bits) leading_bits=8;
|
||||
leading_bit_mask=gr_1_to_8_bits[0xFF>>leading_bits];
|
||||
leading_bit_mask=gr.to_8_bits[0xFF>>leading_bits];
|
||||
bit_shift=-x&7;
|
||||
trailing_bits=(x+w2)&7;
|
||||
trailing_bit_mask=gr_1_to_8_bits[0xFF<<trailing_bits&0xFF];
|
||||
trailing_bit_mask=gr.to_8_bits[0xFF<<trailing_bits&0xFF];
|
||||
if (leading_bits+trailing_bits>w2-w1) {
|
||||
leading_bit_mask|=trailing_bit_mask;
|
||||
trailing_bits=0;
|
||||
}
|
||||
font_ptr=&gr_font[(FONT_WIDTH*(FONT_HEIGHT*ch+h1))>>3];
|
||||
font_ptr=&text.font[(FONT_WIDTH*(FONT_HEIGHT*ch+h1))>>3];
|
||||
if (color.c0.rop==ROPB_COLLISION) {
|
||||
m=w1&(FONT_WIDTH-1);
|
||||
#assert FONT_WIDTH==8
|
||||
@@ -688,14 +688,14 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
src=font_ptr;
|
||||
for (j=h2-h1;j;j--) {
|
||||
c=dc->body[k1+i];
|
||||
if (c!=COLOR_TRANSPARENT && c!=color && Bt(src,m))
|
||||
if (c!=TRANSPARENT && c!=color && Bt(src,m))
|
||||
dc->collision_cnt++;
|
||||
k1+=dc->width_internal;
|
||||
src++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
color_mask=gr_1_to_8_colors[color.c0.color];
|
||||
color_mask=gr.to_8_colors[color.c0.color];
|
||||
k1=x+w1;
|
||||
kk1=(h1+y)*dc->width_internal+k1;
|
||||
if (!(dc->flags & DCF_SCREEN_BITMAP) || dc->flags&DCF_ON_TOP) {
|
||||
@@ -708,7 +708,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
case ROPB_EQU:
|
||||
case ROPB_MONO:
|
||||
for (j=h2-h1;j;j--) {
|
||||
m=gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF];
|
||||
m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF];
|
||||
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~leading_bit_mask;
|
||||
src++;
|
||||
dst+=dc->width_internal;
|
||||
@@ -717,7 +717,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
case ROPB_XOR:
|
||||
if (color_mask) {
|
||||
for (j=h2-h1;j;j--) {
|
||||
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(*dst(I64 *)^gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_bit_mask;
|
||||
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_bit_mask;
|
||||
src++;
|
||||
dst+=dc->width_internal;
|
||||
}
|
||||
@@ -735,7 +735,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
case ROPB_EQU:
|
||||
case ROPB_MONO:
|
||||
for (j=h2-h1;j;j--) {
|
||||
m=gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF];
|
||||
m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF];
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~trailing_bit_mask;
|
||||
src++;
|
||||
dst+=dc->width_internal;
|
||||
@@ -744,7 +744,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
case ROPB_XOR:
|
||||
if (color_mask) {
|
||||
for (j=h2-h1;j;j--) {
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(*dst(I64 *)^gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_bit_mask;
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_bit_mask;
|
||||
src++;
|
||||
dst+=dc->width_internal;
|
||||
}
|
||||
@@ -763,7 +763,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
case ROPB_MONO:
|
||||
for (j=h1;j<h2;j++) {
|
||||
if (!IsPixCovered0(win_task,k1,y+j)) {
|
||||
m=gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF];
|
||||
m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF];
|
||||
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~leading_bit_mask;
|
||||
}
|
||||
src++;
|
||||
@@ -774,7 +774,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
if (color_mask) {
|
||||
for (j=h1;j<h2;j++) {
|
||||
if (!IsPixCovered0(win_task,k1,y+j))
|
||||
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(*dst(I64 *)^gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_bit_mask;
|
||||
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_bit_mask;
|
||||
src++;
|
||||
dst+=dc->width_internal;
|
||||
}
|
||||
@@ -794,7 +794,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
case ROPB_MONO:
|
||||
for (j=h1;j<h2;j++) {
|
||||
if (!IsPixCovered0(win_task,k1,y+j)) {
|
||||
m=gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF];
|
||||
m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF];
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~trailing_bit_mask;
|
||||
}
|
||||
src++;
|
||||
@@ -805,7 +805,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
if (color_mask) {
|
||||
for (j=h1;j<h2;j++) {
|
||||
if (!IsPixCovered0(win_task,k1,y+j))
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(*dst(I64 *)^gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_bit_mask;
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_bit_mask;
|
||||
src++;
|
||||
dst+=dc->width_internal;
|
||||
}
|
||||
@@ -820,8 +820,8 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
|
||||
return 0;
|
||||
}
|
||||
|
||||
I64 GrPutS(CDC *dc=gr_dc,I64 x,I64 y,U8 *_s)
|
||||
{ //Use $LK,"GrPrint",A="MN:GrPrint"$()
|
||||
I64 GrPutS(CDC *dc=gr.dc,I64 x,I64 y,U8 *_s)
|
||||
{//Use $LK,"GrPrint",A="MN:GrPrint"$()
|
||||
I64 x0,ch,result;
|
||||
if (!_s) return 0;
|
||||
x0=x;
|
||||
@@ -840,8 +840,8 @@ I64 GrPutS(CDC *dc=gr_dc,I64 x,I64 y,U8 *_s)
|
||||
return result;
|
||||
}
|
||||
|
||||
I64 GrVPutS(CDC *dc=gr_dc,I64 x,I64 y,U8 *_s)
|
||||
{ //Vertical Text. Use $LK,"GrVPrint",A="MN:GrVPrint"$()
|
||||
I64 GrVPutS(CDC *dc=gr.dc,I64 x,I64 y,U8 *_s)
|
||||
{//Vertical Text. Use $LK,"GrVPrint",A="MN:GrVPrint"$()
|
||||
I64 y0,result;
|
||||
U8 buf[2];
|
||||
if (!_s) return 0;
|
||||
@@ -863,30 +863,30 @@ I64 GrVPutS(CDC *dc=gr_dc,I64 x,I64 y,U8 *_s)
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 GrPrint(CDC *dc=gr_dc,I64 x,I64 y,U8 *fmt,...)
|
||||
{
|
||||
public I64 GrPrint(CDC *dc=gr.dc,I64 x,I64 y,U8 *fmt,...)
|
||||
{//2D. Clipping but not transformation.
|
||||
I64 result;
|
||||
U8 *buf=SPrintJoin(NULL,fmt,argc,argv);
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
result=GrPutS(dc,x,y,buf);
|
||||
Free(buf);
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 GrVPrint(CDC *dc=gr_dc,I64 x,I64 y,U8 *fmt,...)
|
||||
{ //Vertical text
|
||||
public I64 GrVPrint(CDC *dc=gr.dc,I64 x,I64 y,U8 *fmt,...)
|
||||
{//2D. Vertical text. Clipping but not transformation.
|
||||
I64 result;
|
||||
U8 *buf=SPrintJoin(NULL,fmt,argc,argv);
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
result=GrVPutS(dc,x,y,buf);
|
||||
Free(buf);
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics"
|
||||
public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
{ //Clipping but not transformation
|
||||
//Returns cnt of pixs changed
|
||||
public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h)
|
||||
{//2D. Width Height. Clipping but not transformation.
|
||||
//Returns cnt of pixs changed.
|
||||
I64 i,result=0,j,k1,kk1,w1,h1,w2,h2,dist,
|
||||
leading_bits,whole_bytes,trailing_bits,leading_bit_mask,trailing_bit_mask,
|
||||
leading_bits,original_leading_bits,whole_bytes,trailing_bits,leading_bit_mask,trailing_bit_mask,
|
||||
win_z_buf_line_inc,win_z_buf_line_dec,win_z_num,color_mask;
|
||||
U8 reg *dst;
|
||||
U16 reg *win_z_buf_ptr;
|
||||
@@ -915,13 +915,13 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
x+=win_task->pix_left;
|
||||
y+=win_task->pix_top;
|
||||
}
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) { //TODO:Untested
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) {//TODO:Untested
|
||||
if (dc->cur_x>=x && dc->cur_y>=y &&
|
||||
dc->cur_x<=x+w && dc->cur_y<=y+h) {
|
||||
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
|
||||
dc->nearest_dist=0;
|
||||
} else {
|
||||
dist=DistI64(x+w>>1,y+h>>1,dc->cur_x,dc->cur_y);
|
||||
dist=DistSqrI64(x+w>>1,y+h>>1,dc->cur_x,dc->cur_y);
|
||||
if (dist<=dc->nearest_dist) {
|
||||
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
|
||||
dc->nearest_dist=dist;
|
||||
@@ -963,25 +963,25 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
}
|
||||
} else
|
||||
dither=FALSE;
|
||||
leading_bits=-(w1+x)&7;
|
||||
leading_bit_mask=gr_1_to_8_bits[0xFF>>leading_bits];
|
||||
original_leading_bits=leading_bits=-(w1+x)&7;
|
||||
leading_bit_mask=gr.to_8_bits[0xFF>>leading_bits];
|
||||
whole_bytes=(w2-w1-leading_bits)>>3;
|
||||
if (whole_bytes<0) whole_bytes=0;
|
||||
trailing_bits=(x+w2)&7;
|
||||
trailing_bit_mask=gr_1_to_8_bits[0xFF<<trailing_bits&0xFF];
|
||||
trailing_bit_mask=gr.to_8_bits[0xFF<<trailing_bits&0xFF];
|
||||
if (leading_bits+trailing_bits>w2-w1) {
|
||||
leading_bit_mask|=trailing_bit_mask;
|
||||
leading_bits=w2-w1; //Correct so it's right for result.
|
||||
trailing_bits=0;
|
||||
}
|
||||
if (color.c0.rop==ROPB_COLLISION) { //TODO: Might want to check win_z_buf
|
||||
if (color.c0.rop==ROPB_COLLISION) {//TODO: Might want to check win_z_buf
|
||||
color =dc->bkcolor.c0.color;
|
||||
k1=(h1+y)*dc->width_internal+x;
|
||||
result=-dc->collision_cnt;
|
||||
for (j=h2-h1;j;j--) {
|
||||
for (i=w1;i<w2;i++) {
|
||||
c=dc->body[k1+i];
|
||||
if (c!=COLOR_TRANSPARENT && c!=color)
|
||||
if (c!=TRANSPARENT && c!=color)
|
||||
dc->collision_cnt++;
|
||||
}
|
||||
k1+=dc->width_internal;
|
||||
@@ -992,7 +992,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
win_z_buf_ptr=NULL;
|
||||
else {
|
||||
win_z_num=win_task->win_z_num;
|
||||
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
@@ -1014,7 +1014,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
if (win_z_buf_ptr) {
|
||||
result=0;
|
||||
for (j=h1;j<h2;j++) {
|
||||
color_mask=gr_1_to_8_colors[color.c0.color];
|
||||
color_mask=gr.to_8_colors[color.c0.color];
|
||||
dst=dc->body+kk1&~7;
|
||||
if (leading_bits) {
|
||||
if (win_z_num>=*win_z_buf_ptr++) {
|
||||
@@ -1044,7 +1044,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
}
|
||||
} else {
|
||||
for (j=h2-h1;j;j--) {
|
||||
color_mask=gr_1_to_8_colors[color.c0.color];
|
||||
color_mask=gr.to_8_colors[color.c0.color];
|
||||
dst=dc->body+kk1&~7;
|
||||
if (leading_bits)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask;
|
||||
@@ -1065,7 +1065,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
if (win_z_buf_ptr) {
|
||||
result=0;
|
||||
for (j=h1;j<h2;j++) {
|
||||
color_mask=gr_1_to_8_colors[color.c0.color];
|
||||
color_mask=gr.to_8_colors[color.c0.color];
|
||||
dst=dc->body+kk1&~7;
|
||||
if (leading_bits) {
|
||||
if (win_z_num>=*win_z_buf_ptr++) {
|
||||
@@ -1095,7 +1095,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
}
|
||||
} else {
|
||||
for (j=h2-h1;j;j--) {
|
||||
color_mask=gr_1_to_8_colors[color.c0.color];
|
||||
color_mask=gr.to_8_colors[color.c0.color];
|
||||
dst=dc->body+kk1&~7;
|
||||
if (leading_bits)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask;
|
||||
@@ -1114,7 +1114,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (((x+w1)^(y+h1))&1)
|
||||
if (((x+w1-original_leading_bits)^(y+h1))&1)
|
||||
SwapU16(&color.c0,&color.c1);
|
||||
nobound_switch (color.c0.rop) {
|
||||
case ROPB_EQU:
|
||||
@@ -1122,8 +1122,8 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
if (win_z_buf_ptr) {
|
||||
result=0;
|
||||
for (j=h1;j<h2;j++) {
|
||||
color_mask=gr_1_to_8_bits[0x55]&gr_1_to_8_colors[color.c0.color]|
|
||||
gr_1_to_8_bits[0xAA]&gr_1_to_8_colors[color.c1.color];
|
||||
color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]|
|
||||
gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color];
|
||||
dst=dc->body+kk1&~7;
|
||||
if (leading_bits) {
|
||||
if (win_z_num>=*win_z_buf_ptr++) {
|
||||
@@ -1150,8 +1150,8 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
}
|
||||
} else {
|
||||
for (j=h2-h1;j;j--) {
|
||||
color_mask=gr_1_to_8_bits[0x55]&gr_1_to_8_colors[color.c0.color]|
|
||||
gr_1_to_8_bits[0xAA]&gr_1_to_8_colors[color.c1.color];
|
||||
color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]|
|
||||
gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color];
|
||||
dst=dc->body+kk1&~7;
|
||||
if (leading_bits)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask;
|
||||
@@ -1169,8 +1169,8 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
if (win_z_buf_ptr) {
|
||||
result=0;
|
||||
for (j=h1;j<h2;j++) {
|
||||
color_mask=gr_1_to_8_bits[0x55]&gr_1_to_8_colors[color.c0.color]|
|
||||
gr_1_to_8_bits[0xAA]&gr_1_to_8_colors[color.c1.color];
|
||||
color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]|
|
||||
gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color];
|
||||
dst=dc->body+kk1&~7;
|
||||
if (leading_bits) {
|
||||
if (win_z_num>=*win_z_buf_ptr++) {
|
||||
@@ -1197,8 +1197,8 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
}
|
||||
} else {
|
||||
for (j=h2-h1;j;j--) {
|
||||
color_mask=gr_1_to_8_bits[0x55]&gr_1_to_8_colors[color.c0.color]|
|
||||
gr_1_to_8_bits[0xAA]&gr_1_to_8_colors[color.c1.color];
|
||||
color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]|
|
||||
gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color];
|
||||
dst=dc->body+kk1&~7;
|
||||
if (leading_bits)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask;
|
||||
@@ -1215,7 +1215,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
color_mask=gr_1_to_8_colors[color.c0.color];
|
||||
color_mask=gr.to_8_colors[color.c0.color];
|
||||
nobound_switch (color.c0.rop) {
|
||||
case ROPB_EQU:
|
||||
case ROPB_MONO:
|
||||
@@ -1307,7 +1307,6 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
I64 GrRayLenMinus(CDC *dc,I64 x,I64 y)
|
||||
{
|
||||
//Returns cnt of pixs changed
|
||||
@@ -1461,7 +1460,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
|
||||
if ((not_color && c!=dc->color2 ||
|
||||
!not_color && c==dc->color2) && plot) {
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) {
|
||||
dist=DistI64(x3,y3,dc->cur_x,dc->cur_y);
|
||||
dist=DistSqrI64(x3,y3,dc->cur_x,dc->cur_y);
|
||||
if (dist<=dc->nearest_dist) {
|
||||
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
|
||||
dc->nearest_dist=dist;
|
||||
@@ -1491,7 +1490,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
|
||||
break;
|
||||
case ROPB_COLLISION:
|
||||
c2=*dst;
|
||||
if (c2!=COLOR_TRANSPARENT && c2!=bkcolor.c0.color)
|
||||
if (c2!=TRANSPARENT && c2!=bkcolor.c0.color)
|
||||
dc->collision_cnt++;
|
||||
break;
|
||||
case ROPB_XOR:
|
||||
@@ -1540,7 +1539,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
|
||||
if ((not_color && c!=dc->color2 ||
|
||||
!not_color && c==dc->color2) && plot) {
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) {
|
||||
dist=DistI64(x3,y3,dc->cur_x,dc->cur_y);
|
||||
dist=DistSqrI64(x3,y3,dc->cur_x,dc->cur_y);
|
||||
if (dist<=dc->nearest_dist) {
|
||||
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
|
||||
dc->nearest_dist=dist;
|
||||
@@ -1570,7 +1569,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
|
||||
break;
|
||||
case ROPB_COLLISION:
|
||||
c2=*dst;
|
||||
if (c2!=COLOR_TRANSPARENT && c2!=bkcolor.c0.color)
|
||||
if (c2!=TRANSPARENT && c2!=bkcolor.c0.color)
|
||||
dc->collision_cnt++;
|
||||
break;
|
||||
case ROPB_XOR:
|
||||
@@ -1587,10 +1586,10 @@ gr_done:
|
||||
return 0;
|
||||
}
|
||||
|
||||
public I64 GrHLine(CDC *dc=gr_dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
|
||||
{ //No transformation or pen width
|
||||
//returns cnt of pixs changed
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
public I64 GrHLine(CDC *dc=gr.dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
|
||||
{//3D. No transformation or pen width.
|
||||
//Returns cnt of pixs changed
|
||||
//Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
I64 dx,dz,z,result=0,i,j,d,dist;
|
||||
U8 *dst;
|
||||
CColorROPU32 c,c2,color=dc->color,bkcolor=dc->bkcolor,dither_colors;
|
||||
@@ -1599,7 +1598,7 @@ public I64 GrHLine(CDC *dc=gr_dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
|
||||
CTask *win_task;
|
||||
|
||||
if (!dc->depth_buf) {
|
||||
if (x2<x1) SwapU64(&x1,&x2);
|
||||
if (x2<x1) SwapI64(&x1,&x2);
|
||||
return GrRect(dc,x1,y,x2-x1+1,1);
|
||||
}
|
||||
|
||||
@@ -1621,8 +1620,8 @@ public I64 GrHLine(CDC *dc=gr_dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
|
||||
}
|
||||
if (y<0) goto gr_done;
|
||||
if (x2<x1) {
|
||||
SwapU64(&x1,&x2);
|
||||
SwapU64(&z1,&z2);
|
||||
SwapI64(&x1,&x2);
|
||||
SwapI64(&z1,&z2);
|
||||
}
|
||||
if (x2<0)
|
||||
goto gr_done;
|
||||
@@ -1724,7 +1723,7 @@ public I64 GrHLine(CDC *dc=gr_dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
|
||||
break;
|
||||
case ROPB_COLLISION:
|
||||
c2=*dst;
|
||||
if (c2!=COLOR_TRANSPARENT && c2!=bkcolor.c0.color)
|
||||
if (c2!=TRANSPARENT && c2!=bkcolor.c0.color)
|
||||
dc->collision_cnt++;
|
||||
break;
|
||||
case ROPB_XOR:
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
#help_index "Graphics/Char;Char/Graphics"
|
||||
public U0 PlotScreenStr(U8 *s,I64 attr,I64 x,I64 y)
|
||||
{
|
||||
I64 ch;
|
||||
attr<<=8;
|
||||
while (ch=*s++) {
|
||||
PlotScreenU8(ch+attr,x,y);
|
||||
x++;
|
||||
}
|
||||
}
|
||||
|
||||
public U0 PlotWinStr(CTask *task,U8 *s,I64 attr,I64 x,I64 y)
|
||||
{
|
||||
I64 ch;
|
||||
attr<<=8;
|
||||
while (ch=*s++) {
|
||||
PlotWinU8(task,ch+attr,x,y);
|
||||
x++;
|
||||
}
|
||||
}
|
||||
|
||||
public U0 PlotBorderStr(CTask *task,U8 *s,I64 attr,I64 x,I64 y)
|
||||
{
|
||||
I64 ch;
|
||||
attr<<=8;
|
||||
while (ch=*s++) {
|
||||
PlotBorderU8(task,ch+attr,x,y);
|
||||
x++;
|
||||
}
|
||||
}
|
||||
|
||||
public U0 DrawBorder(CTask *task,Bool solid,I64 l,I64 r,I64 t,I64 b,I64 attr,Bool clip_to_win)
|
||||
{
|
||||
I64 i;
|
||||
attr<<=8;
|
||||
if (clip_to_win) {
|
||||
if (solid) {
|
||||
PlotWinU8(task,'É'+attr,l-1,t-1);
|
||||
PlotWinU8(task,'»'+attr,r+1,t-1);
|
||||
PlotWinU8(task,'È'+attr,l-1,b+1);
|
||||
PlotWinU8(task,'¼'+attr,r+1,b+1);
|
||||
for (i=l;i<=r;i++) {
|
||||
PlotWinU8(task,'Í'+attr,i,t-1);
|
||||
PlotWinU8(task,'Í'+attr,i,b+1);
|
||||
}
|
||||
for (i=t;i<=b;i++) {
|
||||
PlotWinU8(task,'º'+attr,l-1,i);
|
||||
PlotWinU8(task,'º'+attr,r+1,i);
|
||||
}
|
||||
} else {
|
||||
PlotWinU8(task,'Ú'+attr,l-1,t-1);
|
||||
PlotWinU8(task,'¿'+attr,r+1,t-1);
|
||||
PlotWinU8(task,'À'+attr,l-1,b+1);
|
||||
PlotWinU8(task,'Ù'+attr,r+1,b+1);
|
||||
for (i=l;i<=r;i++) {
|
||||
PlotWinU8(task,'Ä'+attr,i,t-1);
|
||||
PlotWinU8(task,'Ä'+attr,i,b+1);
|
||||
}
|
||||
for (i=t;i<=b;i++) {
|
||||
PlotWinU8(task,'³'+attr,l-1,i);
|
||||
PlotWinU8(task,'³'+attr,r+1,i);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (solid) {
|
||||
PlotScreenU8('É'+attr,l-1,t-1);
|
||||
PlotScreenU8('»'+attr,r+1,t-1);
|
||||
PlotScreenU8('È'+attr,l-1,b+1);
|
||||
PlotScreenU8('¼'+attr,r+1,b+1);
|
||||
for (i=l;i<=r;i++) {
|
||||
PlotScreenU8('Í'+attr,i,t-1);
|
||||
PlotScreenU8('Í'+attr,i,b+1);
|
||||
}
|
||||
for (i=t;i<=b;i++) {
|
||||
PlotScreenU8('º'+attr,l-1,i);
|
||||
PlotScreenU8('º'+attr,r+1,i);
|
||||
}
|
||||
} else {
|
||||
PlotScreenU8('Ú'+attr,l-1,t-1);
|
||||
PlotScreenU8('¿'+attr,r+1,t-1);
|
||||
PlotScreenU8('À'+attr,l-1,b+1);
|
||||
PlotScreenU8('Ù'+attr,r+1,b+1);
|
||||
for (i=l;i<=r;i++) {
|
||||
PlotScreenU8('Ä'+attr,i,t-1);
|
||||
PlotScreenU8('Ä'+attr,i,b+1);
|
||||
}
|
||||
for (i=t;i<=b;i++) {
|
||||
PlotScreenU8('³'+attr,l-1,i);
|
||||
PlotScreenU8('³'+attr,r+1,i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 DrawTaskBorder(CTask *task)
|
||||
{
|
||||
PUSHFD
|
||||
CLI
|
||||
DrawBorder(task,task==sys_focus_task,
|
||||
task->win_left,task->win_right,
|
||||
task->win_top,task->win_bottom,
|
||||
task->border_attr,FALSE);
|
||||
POPFD
|
||||
}
|
||||
+129
-24
@@ -1,13 +1,79 @@
|
||||
#help_index "Graphics"
|
||||
public I64 GrRectB(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2)
|
||||
{
|
||||
if (x2<x1) SwapU64(&x1,&x2);
|
||||
if (y2<y1) SwapU64(&y1,&y2);
|
||||
public I64 GrFillPoly3(CDC *dc=gr.dc,I64 n,CD3I32 *poly)
|
||||
{//3D. Must be convex.
|
||||
//Returns cnt of pixs changed
|
||||
CD3I32 tri[3];
|
||||
I64 i,j,x,y,z,result=0;
|
||||
if (n<3) return 0;
|
||||
if (dc->flags & DCF_SYMMETRY) {
|
||||
for (i=1;i<n-1;i++) {
|
||||
j=i-1;
|
||||
if (i==1) {
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
tri[0].x=x; tri[0].y=y; tri[0].z=z;
|
||||
}
|
||||
|
||||
j++;
|
||||
if (i==1) {
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
}
|
||||
tri[1].x=x; tri[1].y=y; tri[1].z=z;
|
||||
|
||||
j++;
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
tri[2].x=x; tri[2].y=y; tri[2].z=z;
|
||||
|
||||
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
|
||||
}
|
||||
}
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
return result;
|
||||
for (i=1;i<n-1;i++) {
|
||||
j=i-1;
|
||||
if (i==1) {
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
tri[0].x=x; tri[0].y=y; tri[0].z=z;
|
||||
}
|
||||
|
||||
j++;
|
||||
if (i==1) {
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
}
|
||||
tri[1].x=x; tri[1].y=y; tri[1].z=z;
|
||||
|
||||
j++;
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
tri[2].x=x; tri[2].y=y; tri[2].z=z;
|
||||
|
||||
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 GrRectB(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2)
|
||||
{//2D. Two point. Clipping but not transformation.
|
||||
if (x2<x1) SwapI64(&x1,&x2);
|
||||
if (y2<y1) SwapI64(&y1,&y2);
|
||||
return GrRect(dc,x1,y1,x2-x1+1,y2-y1+1);
|
||||
}
|
||||
|
||||
public I64 GrRect3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,I64 w,I64 h)
|
||||
{ //Clipping and transformation
|
||||
public I64 GrRect3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,I64 w,I64 h)
|
||||
{//3D. Width Height. Clipping and transformation.
|
||||
CD3I32 poly[4];
|
||||
poly[0].x=x;
|
||||
poly[0].y=y;
|
||||
@@ -24,18 +90,17 @@ public I64 GrRect3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,I64 w,I64 h)
|
||||
return GrFillPoly3(dc,4,poly);
|
||||
}
|
||||
|
||||
public U0 GrLineRect4(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
|
||||
{
|
||||
//Can be used with ROPF_DITHER+WHITE<<16+BLACK
|
||||
//for dotted rect.
|
||||
public U0 GrBorder(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
|
||||
{//2D. Transformation with pen width.
|
||||
//Can be used with ROPF_DITHER+WHITE<<16+BLACK for dotted rect.
|
||||
GrLine3(dc,x1,y1,0,x2,y1,0,step,start);
|
||||
GrLine3(dc,x2,y1,0,x2,y2,0,step,start);
|
||||
GrLine3(dc,x2,y2,0,x1,y2,0,step,start);
|
||||
GrLine3(dc,x1,y2,0,x1,y1,0,step,start);
|
||||
}
|
||||
|
||||
public Bool GrArrow3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75,I64 step=1,I64 start=0)
|
||||
{ //transformation with pen width
|
||||
public Bool GrArrow3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75,I64 step=1,I64 start=0)
|
||||
{//3D. Transformation with pen width.
|
||||
I64 _x1,_y1,_z1,_x2,_y2,_z2,dx,dy;
|
||||
F64 d;
|
||||
Bool result=FALSE,was_transform=FALSE,was_symmetry=FALSE;
|
||||
@@ -78,10 +143,8 @@ gr_done:
|
||||
}
|
||||
|
||||
#help_index "Graphics/Char;Char/Graphics"
|
||||
|
||||
public Bool GrTextBox3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)
|
||||
{ //transformation
|
||||
//DCF_SYMMETRY is silly.
|
||||
public Bool GrTextBox3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)
|
||||
{//3D. Transformation. DCF_SYMMETRY is silly.
|
||||
U8 *ptr;
|
||||
I64 ch,result,w,w_max,h;
|
||||
if (!s) return FALSE;
|
||||
@@ -111,9 +174,8 @@ public Bool GrTextBox3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)
|
||||
|
||||
#define MAX_DIAMOND_SLOPE 2.75
|
||||
|
||||
public Bool GrTextDiamond3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)
|
||||
{ //transformation
|
||||
//DCF_SYMMETRY is silly.
|
||||
public Bool GrTextDiamond3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)
|
||||
{//3D. Transformation. DCF_SYMMETRY is silly.
|
||||
Bool first=TRUE;
|
||||
U8 ch,*ptr,*ptr_end,*st,*s;
|
||||
I64 result=0,y,dx,dy,dx_old,dy_old,w,h=FONT_HEIGHT;
|
||||
@@ -176,19 +238,62 @@ public Bool GrTextDiamond3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=
|
||||
return ToBool(result);
|
||||
}
|
||||
|
||||
#help_index "Graphics/Mesh"
|
||||
public I64 Gr3Mesh(CDC *dc=gr.dc,I64 vertex_cnt,CD3I32 *p,I64 tri_cnt,CMeshTri *tri)
|
||||
{//Returns cnt of pixs changed.
|
||||
CColorROPU32 old_color=dc->color;
|
||||
I64 i,x,y,z,result=0;
|
||||
CD3I32 *pt,*pt_sym,*p_sym,*dst;
|
||||
CMeshTri *tri_sym=tri;
|
||||
if (dc->flags&DCF_TRANSFORMATION) {
|
||||
dst=pt=MAlloc(sizeof(CD3I32)*vertex_cnt);
|
||||
for (i=0;i<vertex_cnt;i++,p++,dst++) {
|
||||
x=p->x; y=p->y; z=p->z;
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
dst->x=x; dst->y=y; dst->z=z;
|
||||
}
|
||||
p=pt;
|
||||
} else
|
||||
pt=NULL;
|
||||
|
||||
if (dc->flags & DCF_SYMMETRY) {
|
||||
dst=pt_sym=MAlloc(sizeof(CD3I32)*vertex_cnt);
|
||||
p_sym=p;
|
||||
for (i=0;i<vertex_cnt;i++,p_sym++,dst++) {
|
||||
x=p_sym->x; y=p_sym->y; z=p_sym->z;
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
dst->x=x; dst->y=y; dst->z=z;
|
||||
}
|
||||
p_sym=pt_sym;
|
||||
for (i=0;i<tri_cnt;i++,tri_sym++) {
|
||||
(*dc->lighting)(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]],tri_sym->color);
|
||||
result+=GrFillTri0(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]]);
|
||||
}
|
||||
Free(pt_sym);
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
goto mesh_done;
|
||||
}
|
||||
for (i=0;i<tri_cnt;i++,tri++) {
|
||||
(*dc->lighting)(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]],tri->color);
|
||||
result+=GrFillTri0(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]]);
|
||||
}
|
||||
mesh_done:
|
||||
dc->color=old_color;
|
||||
Free(pt);
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Misc;Input Pointer/Displayed Image"
|
||||
//Called by $LK,"DrawInputPtr",A="MN:DrawInputPtr"$() which is
|
||||
//called by $LK,"WinFinalUpdate",A="MN:WinFinalUpdate"$().
|
||||
public U0 DrawStdInputPtr(CDC *dc,I64 x,I64 y)
|
||||
{//This is a callback.
|
||||
//Called by $LK,"DrawInputPtr",A="MN:DrawInputPtr"$() which is
|
||||
//called by $LK,"WinFinalUpdate",A="MN:WinFinalUpdate"$().
|
||||
dc->pen_width=1;
|
||||
dc->flags&=~(DCF_TRANSFORMATION|DCF_SYMMETRY);
|
||||
GrArrow3(dc,x+8,y+8,0,x,y,0);
|
||||
}
|
||||
|
||||
public U0 (*fp_draw_input_ptr)(CDC *dc,I64 x,I64 y)=&DrawStdInputPtr;
|
||||
public U0 (*fp_draw_grab_input_ptr)(CDC *dc,I64 x,I64 y,Bool closed)=NULL;
|
||||
public U8 *gr_empty_sprite=NULL; //Gets assigned $LK,"gr_empty_sprite",A="FI:::/Adam/WallPaper.CPP"$
|
||||
gr.fp_draw_input_ptr=&DrawStdInputPtr;
|
||||
|
||||
public U0 DrawWaitInputPtr(CDC *dc,I64 x,I64 y)
|
||||
{//This is a callback.
|
||||
|
||||
+46
-44
@@ -1,11 +1,10 @@
|
||||
#help_index "Graphics/Math/3D Transformation"
|
||||
#help_file "::/Doc/Transform"
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
I64 gr_scale=1<<32;
|
||||
|
||||
#define GR_SCALE (1<<32)
|
||||
|
||||
public U0 GrRot(I64 r[4][4],I64 *_x,I64 *_y,I64 *_z)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
{//Rotate 3D point using 4x4 matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
I64 x1,y1,z1,xx=*_x,yy=*_y,zz=*_z;
|
||||
x1=(r[0][0]*xx+r[0][1]*yy+r[0][2]*zz+r[0][3])>>32;
|
||||
y1=(r[1][0]*xx+r[1][1]*yy+r[1][2]*zz+r[1][3])>>32;
|
||||
@@ -15,7 +14,7 @@ public U0 GrRot(I64 r[4][4],I64 *_x,I64 *_y,I64 *_z)
|
||||
|
||||
public U0 GrTransform(CDC *dc,I64 *_x,I64 *_y,I64 *_z)
|
||||
{//This is a callback.
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
//Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
GrRot(dc->r,_x,_y,_z);
|
||||
*_x+=dc->x;
|
||||
*_y+=dc->y;
|
||||
@@ -23,8 +22,7 @@ public U0 GrTransform(CDC *dc,I64 *_x,I64 *_y,I64 *_z)
|
||||
}
|
||||
|
||||
public I64 *GrIdentNew(CTask *mem_task=NULL)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
{//MAlloc an identity matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
I64 *r=CAlloc(sizeof(I64)*16,mem_task);
|
||||
r[0] .i32[1]=1;
|
||||
r[5] .i32[1]=1;
|
||||
@@ -34,8 +32,7 @@ public I64 *GrIdentNew(CTask *mem_task=NULL)
|
||||
}
|
||||
|
||||
public I64 *GrIdentEqu(I64 r[4][4])
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
{//Set matrix to identity. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
MemSet(r,0,sizeof(I64)*16);
|
||||
r[0][0].i32[1]=1;
|
||||
r[1][1].i32[1]=1;
|
||||
@@ -45,11 +42,12 @@ public I64 *GrIdentEqu(I64 r[4][4])
|
||||
}
|
||||
|
||||
public U0 GrSetRotMat(CDC *dc=NULL,I64 r[4][4])
|
||||
{//NULL means gr_dc
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
// (1.0/Sqrt(3))*65536=37837.22
|
||||
{//Set device context's rot matrix. Will be $LK,"Free",A="MN:Free"$d() in $LK,"DCDel",A="MN:DCDel"$(). Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
//The main purpose is to set matrix norm for pen width scaling.
|
||||
//NULL as dc means gr.dc
|
||||
//Note: (1.0/Sqrt(3))*65536=37837.22
|
||||
I64 xx=37838,yy=37837,zz=37837;
|
||||
if (!dc) dc=gr_dc;
|
||||
if (!dc) dc=gr.dc;
|
||||
dc->r=r;
|
||||
GrRot(r,&xx,&yy,&zz);
|
||||
//scaled 32 bits
|
||||
@@ -121,20 +119,20 @@ public U0 GrLighting(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3,CColorROPU32 color
|
||||
}
|
||||
|
||||
#help_index "Graphics/Device Contexts"
|
||||
public U0 DCFill(CDC *dc=NULL,CColorROPU32 val=COLOR_TRANSPARENT)
|
||||
{
|
||||
if (!dc) dc=gr_dc;
|
||||
public U0 DCFill(CDC *dc=NULL,CColorROPU32 val=TRANSPARENT)
|
||||
{//Fill entire device context with color.
|
||||
if (!dc) dc=gr.dc;
|
||||
MemSet(dc->body,val,dc->width_internal*dc->height);
|
||||
}
|
||||
|
||||
public U0 DCClear(CDC *dc=NULL)
|
||||
{
|
||||
if (!dc) dc=gr_dc;
|
||||
{//Set entire device context image body to 0 (BLACK).
|
||||
if (!dc) dc=gr.dc;
|
||||
DCFill(dc,0);
|
||||
}
|
||||
|
||||
public U0 DCRst(CDC *dc)
|
||||
{
|
||||
{//Reset $LK,"CDC",A="MN:CDC"$ structure members but not image body, itself.
|
||||
dc->color=BLACK;
|
||||
dc->color2=BLACK;
|
||||
dc->bkcolor=BLACK;
|
||||
@@ -149,15 +147,16 @@ public U0 DCRst(CDC *dc)
|
||||
dc->transform=&GrTransform;
|
||||
dc->lighting =&GrLighting;
|
||||
GrIdentEqu(dc->r);
|
||||
dc->r_norm=gr_scale;
|
||||
dc->r_norm=GR_SCALE;
|
||||
dc->flags&=~(DCF_SYMMETRY|DCF_TRANSFORMATION|DCF_JUST_MIRROR);
|
||||
}
|
||||
|
||||
public U0 DCExtentsInit(CDC *dc=NULL)
|
||||
{//NULL means gr_dc
|
||||
{//Init markers for extent of next newly drawn graphics.
|
||||
//NULL means gr.dc
|
||||
//See $LK,"::/Demo/Graphics/Extents.CPP"$
|
||||
//You should clear the record flag yourself
|
||||
if (!dc) dc=gr_dc;
|
||||
if (!dc) dc=gr.dc;
|
||||
dc->flags|=DCF_RECORD_EXTENTS;
|
||||
dc->min_x=MAX_I64;
|
||||
dc->max_x=MIN_I64;
|
||||
@@ -166,9 +165,10 @@ public U0 DCExtentsInit(CDC *dc=NULL)
|
||||
}
|
||||
|
||||
public CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL)
|
||||
{//NULL means gr_dc
|
||||
{//Create alias of dc, so can change pen, color, etc.
|
||||
//NULL means gr.dc
|
||||
CDC *result;
|
||||
if (!dc) dc=gr_dc;
|
||||
if (!dc) dc=gr.dc;
|
||||
if (!task) task=Fs;
|
||||
if (dc->dc_signature!=DCS_SIGNATURE_VAL)
|
||||
Dbg;
|
||||
@@ -182,10 +182,10 @@ public CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL)
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public CDC *DCNew(I64 width,I64 height,CTask *task=NULL,Bool null_bitmap=FALSE)
|
||||
{//This internally only allows widths which are divisible by 8
|
||||
//Don't forget these $MA-X+PU,"sizeof(CDC)",LM="Grep(\"sizeof(CDC)\",\"/*\");View;"$.
|
||||
{//Create new width x height device context.
|
||||
//Internally only allows widths which are divisible by 8.
|
||||
//Don't forget these $MA-X+PU,"sizeof(CDC)",LM="Grep(\"sizeof(CDC)\",\"/*\");View;"$.
|
||||
CDC *result;
|
||||
if (!task) task=Fs;
|
||||
result=CAlloc(sizeof(CDC),task);
|
||||
@@ -206,7 +206,7 @@ public CDC *DCNew(I64 width,I64 height,CTask *task=NULL,Bool null_bitmap=FALSE)
|
||||
}
|
||||
|
||||
public U0 DCDel(CDC *dc)
|
||||
{
|
||||
{//Free dc, image body, rot mat and depth buf.
|
||||
if (!dc) return;
|
||||
if (dc->dc_signature!=DCS_SIGNATURE_VAL)
|
||||
Dbg;
|
||||
@@ -219,7 +219,7 @@ public U0 DCDel(CDC *dc)
|
||||
}
|
||||
|
||||
public I64 DCSize(CDC *dc)
|
||||
{
|
||||
{//Mem size of header, image body and depth buffer.
|
||||
if (dc)
|
||||
return MSize2(dc)+MSize2(dc->body)+MSize2(dc->depth_buf);
|
||||
else
|
||||
@@ -227,20 +227,20 @@ public I64 DCSize(CDC *dc)
|
||||
}
|
||||
|
||||
public U0 DCDepthBufRst(CDC *dc)
|
||||
{
|
||||
{//Reset device context depth buf to far away.
|
||||
if (dc->depth_buf)
|
||||
MemSetU32(dc->depth_buf,MAX_I32,dc->width_internal*dc->height);
|
||||
}
|
||||
|
||||
public U0 DCAllocDepthBuf(CDC *dc)
|
||||
{
|
||||
{//Allocate a 32-bit depth buffer for device context.
|
||||
Free(dc->depth_buf);
|
||||
dc->depth_buf=MAlloc(dc->width_internal*dc->height*sizeof(I32),dc->mem_task);
|
||||
DCDepthBufRst(dc);
|
||||
}
|
||||
|
||||
public CDC *DCCopy(CDC *dc,CTask *task=NULL)
|
||||
{
|
||||
{//Alloc copy of dc, including image body, rot mat and depth buf.
|
||||
CDC *result;
|
||||
if (!dc) return NULL;
|
||||
if (dc->dc_signature!=DCS_SIGNATURE_VAL)
|
||||
@@ -249,12 +249,13 @@ public CDC *DCCopy(CDC *dc,CTask *task=NULL)
|
||||
GrSetRotMat(result,MAllocIdentical(dc->r,task));
|
||||
result->mem_task=task;
|
||||
result->body=MAllocIdentical(dc->body,task);
|
||||
result->depth_buf=MAllocIdentical(dc->depth_buf,task);
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 DCMono(CDC *dc,
|
||||
I64 quest=COLOR_TRANSPARENT,I64 true_color=0,I64 false_color=COLOR_MONO)
|
||||
{
|
||||
I64 quest=TRANSPARENT,I64 true_color=0,I64 false_color=COLOR_MONO)
|
||||
{//Set entire device context to one of two colors.
|
||||
I64 i;
|
||||
U8 *dst;
|
||||
dst=dc->body;
|
||||
@@ -266,8 +267,8 @@ public U0 DCMono(CDC *dc,
|
||||
*dst++=false_color;
|
||||
}
|
||||
|
||||
public I64 DCColorChg(CDC *dc,I64 src_color,I64 dst_color=COLOR_TRANSPARENT)
|
||||
{
|
||||
public I64 DCColorChg(CDC *dc,I64 src_color,I64 dst_color=TRANSPARENT)
|
||||
{//Find and replace src color with dst in device context.
|
||||
I64 i,result=0;
|
||||
U8 *dst;
|
||||
dst=dc->body;
|
||||
@@ -282,7 +283,7 @@ public I64 DCColorChg(CDC *dc,I64 src_color,I64 dst_color=COLOR_TRANSPARENT)
|
||||
}
|
||||
|
||||
public U8 *DCSave(CDC *dc,I64 *_size=NULL,Bool compressed=TRUE)
|
||||
{ //stores to mem
|
||||
{//Stores device context to mem, perhaps, with compression.
|
||||
U8 *result,*ptr,*body;
|
||||
Bool old_preempt;
|
||||
CArcCompress *ac;
|
||||
@@ -321,7 +322,7 @@ public U8 *DCSave(CDC *dc,I64 *_size=NULL,Bool compressed=TRUE)
|
||||
}
|
||||
|
||||
public CDC *DCLoad(U8 *src,I64 *_size=NULL,CTask *task=NULL)
|
||||
{ //loads from mem
|
||||
{//Loads device context from mem.
|
||||
CDC *result;
|
||||
U8 *ptr=src;
|
||||
CArcCompress *ac;
|
||||
@@ -352,7 +353,7 @@ public CDC *DCLoad(U8 *src,I64 *_size=NULL,CTask *task=NULL)
|
||||
|
||||
#help_index "Graphics/Device Contexts;Graphics/GRA Files"
|
||||
public I64 GRAWrite(U8 *filename,CDC *dc)
|
||||
{ // TempleOS GRA File
|
||||
{//TempleOS GRA File.
|
||||
I64 size;
|
||||
U8 *st=DftExt(filename,"GRA.Z"),
|
||||
*src=DCSave(dc,&size);
|
||||
@@ -363,7 +364,7 @@ public I64 GRAWrite(U8 *filename,CDC *dc)
|
||||
}
|
||||
|
||||
public CDC *GRARead(U8 *filename,CTask *task=NULL)
|
||||
{ // TempleOS GRA File
|
||||
{//TempleOS GRA File.
|
||||
CDC *dc=NULL;
|
||||
U8 *st=DftExt(filename,"GRA.Z"),
|
||||
*src=FileRead(st);
|
||||
@@ -374,7 +375,7 @@ public CDC *GRARead(U8 *filename,CTask *task=NULL)
|
||||
return dc;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Sprite;Graphics/GRA Files;Doc/Output"
|
||||
#help_index "Graphics/Sprite;Graphics/GRA Files;DolDoc/Output"
|
||||
public U0 DocGRAFile(CDoc *doc=NULL,U8 *filename)
|
||||
{//Put a GRA file into a document as a sprite.
|
||||
CDC *dc=GRARead(filename);
|
||||
@@ -386,12 +387,13 @@ public U0 DocGRAFile(CDoc *doc=NULL,U8 *filename)
|
||||
|
||||
#help_index "Graphics/Device Contexts;Graphics/Screen"
|
||||
public CDC *DCCaptureScreen(CTask *task=NULL)
|
||||
{
|
||||
{//Capture screen to a device context.
|
||||
CDC *dc;
|
||||
U8 *dst;
|
||||
WinMgrSync(2,TRUE);
|
||||
dc=DCCopy(gr_screen_image,task);
|
||||
dc=DCCopy(gr.screen_image,task);
|
||||
dst=MAlloc(dc->body_size,task);
|
||||
//Pick background color that never occurs. COLOR_INVALID
|
||||
GrBitMap4ToBitMap8(dst,dc->body,dc->body_size/2,COLOR_INVALID);
|
||||
Free(dc->body);
|
||||
dc->body=dst;
|
||||
@@ -400,7 +402,7 @@ public CDC *DCCaptureScreen(CTask *task=NULL)
|
||||
|
||||
#help_index "Graphics/GRA Files;Graphics/Screen"
|
||||
public I64 GRACaptureScreen(U8 *filename)
|
||||
{ // TempleOS GRA File
|
||||
{//Capture screen to a TempleOS GRA File.
|
||||
I64 size;
|
||||
CDC *dc=DCCaptureScreen;
|
||||
size=GRAWrite(filename,dc);
|
||||
|
||||
+46
-39
@@ -1,49 +1,56 @@
|
||||
#help_index "Graphics/Device Contexts;Graphics/Screen"
|
||||
public CDC *gr_screen_image, //This is read only.
|
||||
*gr_dc=NULL; //Persistent
|
||||
CDC *gr_dc1=NULL,
|
||||
*gr_dc2=NULL, //Updated every refresh
|
||||
*gr_dc_cache,
|
||||
*gr_zoomed_dc;
|
||||
#help_index "Graphics"
|
||||
|
||||
#help_index "Graphics/Screen"
|
||||
U16 *gr_win_uncovered_bitmap=NULL,gr_highest_uncovered;
|
||||
U16 *gr_vga_text_cache;
|
||||
public I64 gr_pan_text_x=0,gr_pan_text_y=0; // [-7,7]
|
||||
public U0 (*fp_final_screen_update)(CDC *dc)=NULL;
|
||||
public U0 (*fp_wall_paper)(CTask *task)=NULL;
|
||||
public class CGrGlbls
|
||||
{
|
||||
I64 *to_8_bits,*to_8_colors;
|
||||
CDC *screen_image, //Read only.
|
||||
*dc, //Persistent
|
||||
*dc1,
|
||||
*dc2, //Updated every refresh
|
||||
*dc_cache,
|
||||
*zoomed_dc;
|
||||
U32 *text_base; //See $LK,"TextBase Layer",A="HI:TextBase Layer"$.
|
||||
U16 *win_z_buf;
|
||||
|
||||
#define SPHT_ELEM_CODE 1
|
||||
CHashTable *sprite_hash;
|
||||
|
||||
U16 *win_uncovered_bitmap;
|
||||
I64 highest_uncovered;
|
||||
U16 *vga_text_cache;
|
||||
I64 pan_text_x,pan_text_y; //[-7,7]
|
||||
U0 (*fp_final_screen_update)(CDC *dc);
|
||||
U0 (*fp_wall_paper)(CTask *task);
|
||||
U0 (*fp_draw_input_ptr)(CDC *dc,I64 x,I64 y);
|
||||
U0 (*fp_draw_grab_input_ptr)(CDC *dc,I64 x,I64 y,Bool closed);
|
||||
U8 *empty_sprite; //Gets assigned $LK,"gr.empty_sprite",A="FF:::/Adam/WallPaper.CPP,empty_sprite"$
|
||||
|
||||
#define GR_NUM_PEN_BRUSHES 64
|
||||
CDC *gr_pen_brushes[GR_NUM_PEN_BRUSHES],
|
||||
*gr_collision_pen_brushes[GR_NUM_PEN_BRUSHES],
|
||||
*gr_even_pen_brushes[GR_NUM_PEN_BRUSHES],
|
||||
*gr_odd_pen_brushes[GR_NUM_PEN_BRUSHES];
|
||||
|
||||
|
||||
#define GR_MAX_SCREEN_ZOOM 8
|
||||
U8 *gr_screen_zoom_tables[GR_MAX_SCREEN_ZOOM+1];
|
||||
I64 gr_screen_zoom=1,grsx=0,grsy=0;
|
||||
|
||||
//When zoomed, this keeps the mouse centered.
|
||||
public Bool gr_continuous_scroll=FALSE;
|
||||
CDC *pen_brushes[GR_NUM_PEN_BRUSHES],
|
||||
*collision_pen_brushes[GR_NUM_PEN_BRUSHES],
|
||||
*even_pen_brushes[GR_NUM_PEN_BRUSHES],
|
||||
*odd_pen_brushes[GR_NUM_PEN_BRUSHES];
|
||||
|
||||
#define GR_REFRESH_LOG_CNT 16
|
||||
F64 gr_refresh_time_stamps[GR_REFRESH_LOG_CNT];
|
||||
I64 gr_refresh_ts_ptr=0;
|
||||
F64 refresh_time_stamps[GR_REFRESH_LOG_CNT];
|
||||
I64 refresh_ts_ptr;
|
||||
|
||||
#define GR_MAX_SCREEN_ZOOM 8
|
||||
U8 *screen_zoom_tables[GR_MAX_SCREEN_ZOOM+1];
|
||||
I64 screen_zoom,sx,sy;
|
||||
|
||||
//When zoomed, this keeps the mouse centered.
|
||||
Bool continuous_scroll;
|
||||
} gr;
|
||||
|
||||
//See $LK,"SYS_BIOS_GR_MODE",A="FF:D:/Kernel/KStart.CPP,SYS_BIOS_GR_MODE:2"$
|
||||
//See $LK,"SysGrInit",A="MN:SysGrInit"$()
|
||||
//This allows consts to be used
|
||||
//instead of vars.
|
||||
DefinePrint("GR_WIDTH","%d",gr_width);
|
||||
HashPublic("GR_WIDTH",HTT_DEFINE_STR);
|
||||
DefinePrint("GR_HEIGHT","%d",gr_height);
|
||||
HashPublic("GR_HEIGHT",HTT_DEFINE_STR);
|
||||
;
|
||||
//Allows consts to be used instead of vars.
|
||||
HashPublic("GR_WIDTH",HTT_DEFINE_STR);;
|
||||
HashPublic("GR_HEIGHT",HTT_DEFINE_STR);;
|
||||
|
||||
#help_index "Char"
|
||||
DefinePrint("TEXT_ROWS","%d",text_rows);
|
||||
HashPublic("TEXT_ROWS",HTT_DEFINE_STR);
|
||||
DefinePrint("TEXT_COLS","%d",text_cols);
|
||||
HashPublic("TEXT_COLS",HTT_DEFINE_STR);
|
||||
;
|
||||
DefinePrint("TEXT_ROWS","%d",text.rows);;;
|
||||
HashPublic("TEXT_ROWS",HTT_DEFINE_STR);;;
|
||||
DefinePrint("TEXT_COLS","%d",text.cols);;;
|
||||
HashPublic("TEXT_COLS",HTT_DEFINE_STR);;;
|
||||
+46
-68
@@ -9,18 +9,18 @@ U0 GrSetUpTables()
|
||||
for (i=0;i<256;i++)
|
||||
for (j=0;j<8;j++)
|
||||
if (Bt(&i,j))
|
||||
gr_1_to_8_bits(U8 *)[k++]=0xFF;
|
||||
gr.to_8_bits(U8 *)[k++]=0xFF;
|
||||
else
|
||||
gr_1_to_8_bits(U8 *)[k++]=0x00;
|
||||
gr.to_8_bits(U8 *)[k++]=0x00;
|
||||
k=0;
|
||||
for (i=0;i<256;i++)
|
||||
for (j=0;j<8;j++)
|
||||
gr_1_to_8_colors(U8 *)[k++]=i;
|
||||
gr.to_8_colors(U8 *)[k++]=i;
|
||||
|
||||
for (i=0;i<GR_NUM_PEN_BRUSHES;i++) {
|
||||
k=i+1;
|
||||
dc=DCNew(i,i);
|
||||
gr_pen_brushes[i]=dc;
|
||||
gr.pen_brushes[i]=dc;
|
||||
dc->color=COLOR_MONO;
|
||||
rr=k*k;
|
||||
for (y=1;y<k;y++)
|
||||
@@ -29,8 +29,8 @@ U0 GrSetUpTables()
|
||||
GrPlot0(dc,x-1,y-1);
|
||||
|
||||
dc=DCNew(i,i);
|
||||
gr_collision_pen_brushes[i]=dc;
|
||||
dc->color=COLOR_INVALID;
|
||||
gr.collision_pen_brushes[i]=dc;
|
||||
dc->color=COLOR_INVALID;//Want color that never occurs.
|
||||
rr=k*k;
|
||||
for (y=1;y<k;y++)
|
||||
for (x=1;x<k;x++)
|
||||
@@ -38,7 +38,7 @@ U0 GrSetUpTables()
|
||||
GrPlot0(dc,x-1,y-1);
|
||||
|
||||
dc=DCNew(i,i);
|
||||
gr_even_pen_brushes[i]=dc;
|
||||
gr.even_pen_brushes[i]=dc;
|
||||
dc->color=COLOR_MONO;
|
||||
rr=k*k;
|
||||
for (y=1;y<k;y++)
|
||||
@@ -47,7 +47,7 @@ U0 GrSetUpTables()
|
||||
GrPlot0(dc,x-1,y-1);
|
||||
|
||||
dc=DCNew(i,i);
|
||||
gr_odd_pen_brushes[i]=dc;
|
||||
gr.odd_pen_brushes[i]=dc;
|
||||
dc->color=COLOR_MONO;
|
||||
rr=k*k;
|
||||
for (y=1;y<k;y++)
|
||||
@@ -55,18 +55,18 @@ U0 GrSetUpTables()
|
||||
if (((x-1)^(y-1))&1 && SqrI64(y*2-k)+SqrI64(x*2-k)<rr)
|
||||
GrPlot0(dc,x-1,y-1);
|
||||
}
|
||||
if (text_mode) {
|
||||
if (!sys_bios_gr_mode) { //if text mode
|
||||
MemSet(VGA_TEXT_MEM_BASE,0,TEXT_ROWS*TEXT_COLS*sizeof(U16));
|
||||
MemSet(gr_vga_text_cache,0,TEXT_ROWS*TEXT_COLS*sizeof(U16));
|
||||
MemSet(gr.vga_text_cache,0,TEXT_ROWS*TEXT_COLS*sizeof(U16));
|
||||
} else {
|
||||
OutU8(VGA_SC_INDEX,VGA_MAP_MASK);
|
||||
OutU8(VGA_SC_DATA,0x0F);
|
||||
//Virtual Box crashes on the following for some reason.
|
||||
// MemSet(VGA_GRAPHIC_MEM_BASE,0,GR_HEIGHT*GR_WIDTH>>3);
|
||||
MemSet(gr_screen_image->body,0,GR_WIDTH*GR_HEIGHT>>1);
|
||||
MemSet(gr.screen_image->body,0,GR_WIDTH*GR_HEIGHT>>1);
|
||||
}
|
||||
for (i=1;i<=GR_MAX_SCREEN_ZOOM;i++) {
|
||||
dst=gr_screen_zoom_tables[i]=MAlloc(256*i);
|
||||
dst=gr.screen_zoom_tables[i]=MAlloc(256*i);
|
||||
for (j=0;j<256;j++) {
|
||||
m=0;
|
||||
for (k=0;k<8;k++) {
|
||||
@@ -80,13 +80,13 @@ U0 GrSetUpTables()
|
||||
}
|
||||
}
|
||||
for (i=0;i<GR_REFRESH_LOG_CNT;i++)
|
||||
gr_refresh_time_stamps[i]=tS;
|
||||
gr.refresh_time_stamps[i]=tS;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Screen;Windows"
|
||||
|
||||
U0 WinZBufFill(CTask *task)
|
||||
{ //Not public
|
||||
{//Not public
|
||||
I64 y,t,b,l,r,w;
|
||||
if (!Bt(&task->display_flags,DISPLAYf_NO_BORDER)) {
|
||||
if (task->win_top-1>0)
|
||||
@@ -129,19 +129,19 @@ U0 WinZBufFill(CTask *task)
|
||||
r=ClampI64(r,l,TEXT_COLS-1);
|
||||
if (w=r-l+1)
|
||||
for (y=t;y<=b;y++)
|
||||
MemSetU16(gr_win_z_buf(U8 *)+(y*TEXT_COLS+l)*sizeof(U16),
|
||||
MemSetU16(gr.win_z_buf(U8 *)+(y*TEXT_COLS+l)*sizeof(U16),
|
||||
task->win_z_num,w);
|
||||
}
|
||||
|
||||
public U0 WinZBufUpdate()
|
||||
{ //You might have to call this if you are doing graphics outside
|
||||
//the window mgr callback routines. Call it if, for example,
|
||||
//a pop-up window closes and you need to refresh before graphics.
|
||||
{//Might have to call this if you are doing graphics outside winmgr callback routines.
|
||||
//Call it if, for example, when a pop-up window closes and you need to refresh
|
||||
//before graphics.
|
||||
I64 i,z=1;
|
||||
U16 *ptr;
|
||||
CTask *task,*task1;
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
if (gr_win_z_buf) {
|
||||
if (gr.win_z_buf) {
|
||||
LBtr(&sys_semas[SYS_SEMA_UPDATE_WIN_Z_BUF],0);
|
||||
task1=task=sys_winmgr_task;
|
||||
do {
|
||||
@@ -153,71 +153,49 @@ public U0 WinZBufUpdate()
|
||||
task=task->next_task;
|
||||
} while (task!=task1 && z<0x10000);
|
||||
|
||||
MemSet(gr_win_uncovered_bitmap,0,(gr_highest_uncovered+7)>>3+1);
|
||||
gr_highest_uncovered=z-1;
|
||||
for (ptr=gr_win_z_buf,i=TEXT_ROWS*TEXT_COLS;i;i--)
|
||||
Bts(gr_win_uncovered_bitmap,*ptr++);
|
||||
MemSet(gr.win_uncovered_bitmap,0,(gr.highest_uncovered+7)>>3+1);
|
||||
gr.highest_uncovered=z-1;
|
||||
for (ptr=gr.win_z_buf,i=TEXT_ROWS*TEXT_COLS;i;i--)
|
||||
Bts(gr.win_uncovered_bitmap,*ptr++);
|
||||
}
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
|
||||
#help_index "Graphics/Char;Char"
|
||||
public U0 WinTextFill(I64 d,CTask *task=NULL)
|
||||
{//You probably don't want this.
|
||||
I64 y,w,t,b,l,r;
|
||||
if (!task) task=Fs;
|
||||
if (!TaskValidate(task)) return;
|
||||
if (task->win_top>0)
|
||||
t=task->win_top;
|
||||
else
|
||||
t=0;
|
||||
if (task->win_bottom<TEXT_ROWS)
|
||||
b=task->win_bottom;
|
||||
else
|
||||
b=TEXT_ROWS-1;
|
||||
if (task->win_left>0)
|
||||
l=task->win_left;
|
||||
else
|
||||
l=0;
|
||||
if (task->win_right<TEXT_COLS)
|
||||
r=task->win_right;
|
||||
else
|
||||
r=TEXT_COLS-1;
|
||||
if (w=r-l+1)
|
||||
for (y=t;y<=b;y++)
|
||||
MemSetU32(gr_text_base(U8 *)+(y*TEXT_COLS+l)*sizeof(U32),
|
||||
d,w);
|
||||
}
|
||||
|
||||
#help_index "Graphics"
|
||||
U0 GrInit2()
|
||||
{
|
||||
MemSet(&gr,0,sizeof(CGrGlbls));
|
||||
gr.sprite_hash=HashTableNew(512);
|
||||
HashDefineLstAdd("ST_SPRITE_ELEM_CODES",SPHT_ELEM_CODE,gr.sprite_hash);
|
||||
gr.screen_zoom=1;
|
||||
|
||||
SetStdPalette;
|
||||
fp_set_std_palette=&SetStdPalette;
|
||||
SetVGAPalette4Indices;
|
||||
|
||||
gr_1_to_8_bits =MAlloc(256*sizeof(I64));
|
||||
gr_1_to_8_colors=MAlloc(256*sizeof(I64));
|
||||
gr.to_8_bits =MAlloc(256*sizeof(I64));
|
||||
gr.to_8_colors=MAlloc(256*sizeof(I64));
|
||||
|
||||
gr_text_base=CAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U32));
|
||||
gr_vga_text_cache=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16));
|
||||
gr_win_uncovered_bitmap=CAlloc(65536/8);
|
||||
gr_highest_uncovered=0;
|
||||
gr_win_z_buf=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16));
|
||||
gr.text_base=CAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U32));
|
||||
gr.vga_text_cache=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16));
|
||||
gr.win_uncovered_bitmap=CAlloc(65536/8);
|
||||
gr.highest_uncovered=0;
|
||||
gr.win_z_buf=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16));
|
||||
|
||||
gr_dc2=DCNew(GR_WIDTH,GR_HEIGHT);
|
||||
gr_dc2->flags|=DCF_SCREEN_BITMAP;
|
||||
gr_dc_cache=DCNew(GR_WIDTH,GR_HEIGHT);
|
||||
gr.dc2=DCNew(GR_WIDTH,GR_HEIGHT);
|
||||
gr.dc2->flags|=DCF_SCREEN_BITMAP;
|
||||
gr.dc_cache=DCNew(GR_WIDTH,GR_HEIGHT);
|
||||
|
||||
gr_dc=DCNew(GR_WIDTH,GR_HEIGHT);
|
||||
gr_dc->flags|=DCF_SCREEN_BITMAP|DCF_ON_TOP;
|
||||
gr.dc=DCNew(GR_WIDTH,GR_HEIGHT);
|
||||
gr.dc->flags|=DCF_SCREEN_BITMAP|DCF_ON_TOP;
|
||||
DCFill;
|
||||
|
||||
gr_dc1=DCNew(GR_WIDTH,GR_HEIGHT);
|
||||
gr_dc1->flags|=DCF_SCREEN_BITMAP;
|
||||
gr.dc1=DCNew(GR_WIDTH,GR_HEIGHT);
|
||||
gr.dc1->flags|=DCF_SCREEN_BITMAP;
|
||||
|
||||
gr_screen_image=DCNew(GR_WIDTH,GR_HEIGHT); //4-bit
|
||||
gr_zoomed_dc =DCNew(GR_WIDTH,GR_HEIGHT); //4-bit
|
||||
gr_zoomed_dc->flags|=DCF_SCREEN_BITMAP;
|
||||
gr.screen_image=DCNew(GR_WIDTH,GR_HEIGHT); //4-bit
|
||||
gr.zoomed_dc =DCNew(GR_WIDTH,GR_HEIGHT); //4-bit
|
||||
gr.zoomed_dc->flags|=DCF_SCREEN_BITMAP;
|
||||
}
|
||||
|
||||
GrInit2;
|
||||
@@ -10,15 +10,15 @@ DefineLstLoad("ST_RAINBOW_10",
|
||||
"GREEN\0BLUE\0PURPLE\0LTGRAY\0WHITE\0");
|
||||
|
||||
U0 SetVGAPalette4Indices()
|
||||
{//4-bit (16 color)
|
||||
/*There is a level of indirection we wish to identity map.
|
||||
{/*4-bit (16 color)
|
||||
There is a level of indirection we wish to identity map.
|
||||
This sets the 16-colors to use
|
||||
the first 16 DAC rgb entries, so
|
||||
we never need to worry about indexes,
|
||||
just DAC palette settings.
|
||||
*/
|
||||
I64 i;
|
||||
if (text_mode) return;
|
||||
if (!sys_bios_gr_mode) return;
|
||||
PUSHFD
|
||||
CLI
|
||||
while (LBts(&sys_semas[SYS_SEMA_VGA],0))
|
||||
@@ -36,8 +36,8 @@ just DAC palette settings.
|
||||
}
|
||||
|
||||
public U0 SetVGAPaletteColor(I64 color_num,CBGR bgr)
|
||||
{ //6-bits per r,dc and g
|
||||
if (text_mode) return;
|
||||
{//6-bits per b, g and r.
|
||||
if (!sys_bios_gr_mode) return;
|
||||
PUSHFD
|
||||
CLI
|
||||
while (LBts(&sys_semas[SYS_SEMA_VGA],0))
|
||||
@@ -52,9 +52,9 @@ public U0 SetVGAPaletteColor(I64 color_num,CBGR bgr)
|
||||
}
|
||||
|
||||
public CBGR GetVGAPaletteColor(I64 color_num)
|
||||
{ //6-bits per r,dc and g
|
||||
{//6-bits per b, g and r.
|
||||
CBGR result=0;
|
||||
if (text_mode) return 0;
|
||||
if (!sys_bios_gr_mode) return 0;
|
||||
PUSHFD
|
||||
CLI
|
||||
while (LBts(&sys_semas[SYS_SEMA_VGA],0))
|
||||
@@ -96,6 +96,6 @@ public U0 SetVGAPalette4(CBGR *bgr)
|
||||
}
|
||||
|
||||
public U0 SetStdPalette()
|
||||
{
|
||||
{//Activate std palette.
|
||||
SetVGAPalette4(vga_palette4_std);
|
||||
}
|
||||
+85
-208
@@ -1,7 +1,7 @@
|
||||
#help_index "Graphics"
|
||||
|
||||
public Bool GrClamp(CDC *dc=gr_dc,I64 *left,I64 *top,I64 *right,I64 *bottom,I64 width=0,I64 height=0)
|
||||
{ //returns screen, not window coordinates
|
||||
public Bool GrClamp(CDC *dc=gr.dc,I64 *left,I64 *top,I64 *right,I64 *bottom,I64 width=0,I64 height=0)
|
||||
{//Returns screen, not window coordinates.
|
||||
CTask *win_task;
|
||||
*left=0;
|
||||
*top=0;
|
||||
@@ -29,8 +29,8 @@ public Bool GrClamp(CDC *dc=gr_dc,I64 *left,I64 *top,I64 *right,I64 *bottom,I64
|
||||
return *left<=*right && *top<=*bottom;
|
||||
}
|
||||
|
||||
Bool DCClipLine(CDC *dc=gr_dc,I64 *x1,I64 *y1,I64 *x2,I64 *y2,I64 width=0,I64 height=0)
|
||||
{ //also converts window to screen coordinates
|
||||
Bool DCClipLine(CDC *dc=gr.dc,I64 *x1,I64 *y1,I64 *x2,I64 *y2,I64 width=0,I64 height=0)
|
||||
{//Also converts window to screen coordinates
|
||||
I64 left,top,right,bottom;
|
||||
CTask *win_task;
|
||||
if (GrClamp(dc,&left,&top,&right,&bottom,width,height)) {
|
||||
@@ -46,8 +46,8 @@ Bool DCClipLine(CDC *dc=gr_dc,I64 *x1,I64 *y1,I64 *x2,I64 *y2,I64 width=0,I64 he
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
public Bool GrPlot(CDC *dc=gr_dc,I64 x,I64 y)
|
||||
{ //Clipping but No transformation or pen width
|
||||
public Bool GrPlot(CDC *dc=gr.dc,I64 x,I64 y)
|
||||
{//2D. Clipping but No transformation or pen width.
|
||||
I32 *db=dc->depth_buf;
|
||||
CTask *win_task;
|
||||
CColorROPU32 old_color;
|
||||
@@ -76,8 +76,8 @@ public Bool GrPlot(CDC *dc=gr_dc,I64 x,I64 y)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool GrPlot1(CDC *dc=gr_dc,I64 x,I64 y)
|
||||
{ //Clipping but No transformation or pen width, called with db_z set
|
||||
Bool GrPlot1(CDC *dc=gr.dc,I64 x,I64 y)
|
||||
{//Clipping but No transformation or pen width, called with db_z set
|
||||
CTask *win_task;
|
||||
CColorROPU32 old_color;
|
||||
if (dc->brush) {
|
||||
@@ -106,9 +106,9 @@ Bool GrPlot1(CDC *dc=gr_dc,I64 x,I64 y)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public I64 GrPeek(CDC *dc=gr_dc,I64 x,I64 y)
|
||||
public I64 GrPeek(CDC *dc=gr.dc,I64 x,I64 y)
|
||||
{//2D. Clipping but no transformation.
|
||||
//Returns pix color or -1 if off-screen or covered.
|
||||
{ //Clipping but No transformation
|
||||
CTask *win_task;
|
||||
if (dc->flags & DCF_SCREEN_BITMAP) {
|
||||
win_task=dc->win_task;
|
||||
@@ -234,10 +234,8 @@ I64 GrFloodFillRay(CDC *dc,I64 x,I64 y,I64 z,I32 *db)
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public I64 GrFloodFill(CDC *dc=gr_dc,I64 x,I64 y,Bool not_color=FALSE,I64 z=0,I32 *db=NULL)
|
||||
{
|
||||
//Ignore z and db.
|
||||
public I64 GrFloodFill(CDC *dc=gr.dc,I64 x,I64 y,Bool not_color=FALSE,I64 z=0,I32 *db=NULL)
|
||||
{//3D. Ignore z and db.
|
||||
//not_color=TRUE means fill up to everything which is not the current color.
|
||||
//not_color=FALSE means fill all parts equal to the color under the point.
|
||||
//Returns cnt of pixs changed
|
||||
@@ -273,8 +271,8 @@ ff_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool GrPlot3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
|
||||
{ //Clipping and transformation but no pen_width
|
||||
public Bool GrPlot3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z)
|
||||
{//3D. Clipping and transformation but no pen_width.
|
||||
I64 _x,_y,_z;
|
||||
Bool was_transform=FALSE,was_symmetry=FALSE;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
@@ -302,9 +300,8 @@ gr_done:
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public Bool GrPlot3(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
|
||||
{ //clipping and transformation and pen width
|
||||
|
||||
public Bool GrPlot3(CDC *dc=gr.dc,I64 x,I64 y,I64 z)
|
||||
{//3D. Clipping and transformation and pen width.
|
||||
I64 _x,_y,_z,i,j,w,dist;
|
||||
CColorROPU32 old_color=dc->color;
|
||||
Bool record,was_transform=FALSE,was_symmetry=FALSE;
|
||||
@@ -334,43 +331,43 @@ public Bool GrPlot3(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
|
||||
if (dc->color.c1.rop&ROPBF_DITHER) {
|
||||
dc->color.c1.rop=dc->color.c0.rop;
|
||||
if (((x-w)^(y-w))&1) {
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr_odd_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr.odd_pen_brushes[dc->pen_width]);
|
||||
dc->color.c0=dc->color.c1;
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr_even_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr.even_pen_brushes[dc->pen_width]);
|
||||
} else {
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr_even_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr.even_pen_brushes[dc->pen_width]);
|
||||
dc->color.c0=dc->color.c1;
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr_odd_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr.odd_pen_brushes[dc->pen_width]);
|
||||
}
|
||||
} else {
|
||||
if (dc->color.c0.rop==ROPB_COLLISION) {
|
||||
if (dc->color.c0.color!=dc->bkcolor.c0.color && dc->color.c0.color!=COLOR_TRANSPARENT)
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr_collision_pen_brushes[dc->pen_width]);
|
||||
if (dc->color.c0.color!=dc->bkcolor.c0.color && dc->color.c0.color!=TRANSPARENT)
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr.collision_pen_brushes[dc->pen_width]);
|
||||
else
|
||||
record=FALSE;
|
||||
} else
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot3(dc,x-w,y-w,z,gr.pen_brushes[dc->pen_width]);
|
||||
}
|
||||
} else {
|
||||
if (dc->color.c1.rop&ROPBF_DITHER) {
|
||||
dc->color.c1.rop=dc->color.c0.rop;
|
||||
if (((x-w)^(y-w))&1) {
|
||||
record=GrBlot(dc,x-w,y-w,gr_odd_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot(dc,x-w,y-w,gr.odd_pen_brushes[dc->pen_width]);
|
||||
dc->color.c0=dc->color.c1;
|
||||
record=GrBlot(dc,x-w,y-w,gr_even_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot(dc,x-w,y-w,gr.even_pen_brushes[dc->pen_width]);
|
||||
} else {
|
||||
record=GrBlot(dc,x-w,y-w,gr_even_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot(dc,x-w,y-w,gr.even_pen_brushes[dc->pen_width]);
|
||||
dc->color.c0=dc->color.c1;
|
||||
record=GrBlot(dc,x-w,y-w,gr_odd_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot(dc,x-w,y-w,gr.odd_pen_brushes[dc->pen_width]);
|
||||
}
|
||||
} else {
|
||||
if (dc->color.c0.rop==ROPB_COLLISION) {
|
||||
if (dc->color.c0.color!=dc->bkcolor.c0.color && dc->color.c0.color!=COLOR_TRANSPARENT)
|
||||
record=GrBlot(dc,x-w,y-w,gr_collision_pen_brushes[dc->pen_width]);
|
||||
if (dc->color.c0.color!=dc->bkcolor.c0.color && dc->color.c0.color!=TRANSPARENT)
|
||||
record=GrBlot(dc,x-w,y-w,gr.collision_pen_brushes[dc->pen_width]);
|
||||
else
|
||||
record=FALSE;
|
||||
} else
|
||||
record=GrBlot(dc,x-w,y-w,gr_pen_brushes[dc->pen_width]);
|
||||
record=GrBlot(dc,x-w,y-w,gr.pen_brushes[dc->pen_width]);
|
||||
}
|
||||
}
|
||||
if (record) {
|
||||
@@ -380,7 +377,7 @@ public Bool GrPlot3(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
|
||||
y+=win_task->pix_top+win_task->scroll_y;
|
||||
}
|
||||
if (dc->flags & DCF_LOCATE_NEAREST) {
|
||||
dist=DistI64(x,y,dc->cur_x,dc->cur_y);
|
||||
dist=DistSqrI64(x,y,dc->cur_x,dc->cur_y);
|
||||
if (dist<dc->nearest_dist) {
|
||||
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
|
||||
dc->nearest_dist=dist;
|
||||
@@ -398,7 +395,7 @@ public Bool GrPlot3(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (dc->pen_width & 1) { //TODO Dither
|
||||
} else if (dc->pen_width & 1) {//TODO Dither
|
||||
for (i=-w;i<=w;i++)
|
||||
for (j=-w;j<=w;j++)
|
||||
GrPlot1(dc,x+i,y+j);
|
||||
@@ -436,8 +433,8 @@ Bool GrLinePlot(CDC *dc,I64 x,I64 y,I64 z)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public Bool GrLine(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
|
||||
{
|
||||
public Bool GrLine(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
|
||||
{//2D. Clipping but not transformation.
|
||||
Bool result=FALSE;
|
||||
I32 *db=dc->depth_buf;
|
||||
dc->depth_buf=NULL;
|
||||
@@ -450,9 +447,9 @@ public Bool GrLine(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 star
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool GrCircle(CDC *dc=gr_dc,I64 cx,I64 cy,I64 radius,
|
||||
public Bool GrCircle(CDC *dc=gr.dc,I64 cx,I64 cy,I64 radius,
|
||||
I64 step=1,F64 start_radians=0,F64 len_radians=2*ã)
|
||||
{
|
||||
{//2D. Clipping but not transformation.
|
||||
Bool result;
|
||||
I32 *db=dc->depth_buf;
|
||||
dc->depth_buf=NULL;
|
||||
@@ -461,14 +458,14 @@ public Bool GrCircle(CDC *dc=gr_dc,I64 cx,I64 cy,I64 radius,
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool GrEllipse(CDC *dc=gr_dc,
|
||||
public Bool GrEllipse(CDC *dc=gr.dc,
|
||||
I64 cx,I64 cy,
|
||||
I64 x_radius,I64 y_radius,
|
||||
F64 rot_angle=0,
|
||||
I64 step=1,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
{//2D. Clipping but not transformation.
|
||||
Bool result;
|
||||
I32 *db=dc->depth_buf;
|
||||
dc->depth_buf=NULL;
|
||||
@@ -477,14 +474,14 @@ public Bool GrEllipse(CDC *dc=gr_dc,
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool GrRegPoly(CDC *dc=gr_dc,
|
||||
public Bool GrRegPoly(CDC *dc=gr.dc,
|
||||
I64 cx,I64 cy,
|
||||
I64 x_radius,I64 y_radius,I64 sides,
|
||||
F64 rot_angle=0,
|
||||
I64 step=1,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
{//2D. Clipping but no transform or pen width.
|
||||
Bool result;
|
||||
I32 *db=dc->depth_buf;
|
||||
dc->depth_buf=NULL;
|
||||
@@ -494,28 +491,28 @@ public Bool GrRegPoly(CDC *dc=gr_dc,
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool Gr2Bezier(CDC *dc=gr_dc,CD3I32 *ctrl)
|
||||
{
|
||||
public Bool Gr2Bezier(CDC *dc=gr.dc,CD3I32 *ctrl)
|
||||
{//2nd order. Clipping but no transform or pen width.
|
||||
return Bezier2(dc,ctrl,&GrLinePlot);
|
||||
}
|
||||
|
||||
public Bool Gr3Bezier(CDC *dc=gr_dc,CD3I32 *ctrl)
|
||||
{
|
||||
public Bool Gr3Bezier(CDC *dc=gr.dc,CD3I32 *ctrl)
|
||||
{//3rd order. Clipping but no transform or pen width.
|
||||
return Bezier3(dc,ctrl,&GrLinePlot);
|
||||
}
|
||||
|
||||
public Bool Gr2BSpline(CDC *dc=gr_dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{
|
||||
public Bool Gr2BSpline(CDC *dc=gr.dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{//2nd order. Clipping but no transform or pen width.
|
||||
return BSpline2(dc,ctrl,cnt,&GrLinePlot,closed);
|
||||
}
|
||||
|
||||
public Bool Gr3BSpline(CDC *dc=gr_dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{
|
||||
public Bool Gr3BSpline(CDC *dc=gr.dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{//3rd order. Clipping but no transform or pen width.
|
||||
return BSpline3(dc,ctrl,cnt,&GrLinePlot,closed);
|
||||
}
|
||||
|
||||
public Bool GrLine3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I64 start=0)
|
||||
{
|
||||
public Bool GrLine3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I64 start=0)
|
||||
{//3D. Transformation with pen width.
|
||||
I64 _x1,_y1,_z1,_x2,_y2,_z2;
|
||||
Bool result=FALSE,was_transform=FALSE,was_symmetry=FALSE;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
@@ -530,7 +527,7 @@ public Bool GrLine3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64
|
||||
_x2=x2; _y2=y2; _z2=z2;
|
||||
GrReflect(dc,&_x2,&_y2,&_z2);
|
||||
dc->flags&=~DCF_SYMMETRY;
|
||||
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) { //TODO: clip z for depth buf
|
||||
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) {//TODO: clip z for depth buf
|
||||
if (DCClipLine(dc,&_x1,&_y1,&_x2,&_y2))
|
||||
result=Line(dc,_x1,_y1,0,_x2,_y2,0,&GrLinePlot0,step,start);
|
||||
} else
|
||||
@@ -539,7 +536,7 @@ public Bool GrLine3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
goto gr_done;
|
||||
}
|
||||
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) { //TODO: clip z for depth buf
|
||||
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) {//TODO: clip z for depth buf
|
||||
if (DCClipLine(dc,&x1,&y1,&x2,&y2))
|
||||
result|=Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start);
|
||||
} else
|
||||
@@ -554,18 +551,16 @@ gr_done:
|
||||
|
||||
#help_index "Graphics/Char;Char/Graphics"
|
||||
|
||||
public Bool GrPutChar3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 ch)
|
||||
{ //transformation
|
||||
//DCF_SYMMETRY is silly.
|
||||
public Bool GrPutChar3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 ch)
|
||||
{//3D. Transformation. DCF_SYMMETRY is silly.
|
||||
if (dc->flags & DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
return GrPutChar(dc,x,y,ch);
|
||||
}
|
||||
|
||||
public I64 GrPrint3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *fmt,...)
|
||||
{ //transformation
|
||||
//DCF_SYMMETRY is silly.
|
||||
U8 *buf=SPrintJoin(NULL,fmt,argc,argv);
|
||||
public I64 GrPrint3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *fmt,...)
|
||||
{//3D. Transformation. DCF_SYMMETRY is silly.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
I64 result;
|
||||
if (dc->flags & DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
@@ -574,11 +569,9 @@ public I64 GrPrint3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *fmt,...)
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 GrVPrint3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *fmt,...)
|
||||
{ //Vertical text
|
||||
//transformation
|
||||
//DCF_SYMMETRY is silly.
|
||||
U8 *buf=SPrintJoin(NULL,fmt,argc,argv);
|
||||
public I64 GrVPrint3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *fmt,...)
|
||||
{//3D. Vertical text. Transformation. DCF_SYMMETRY is silly.
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
I64 result;
|
||||
if (dc->flags & DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
@@ -589,14 +582,14 @@ public I64 GrVPrint3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *fmt,...)
|
||||
|
||||
#help_index "Graphics"
|
||||
|
||||
public Bool GrEllipse3(CDC *dc=gr_dc,
|
||||
public Bool GrEllipse3(CDC *dc=gr.dc,
|
||||
I64 cx,I64 cy,I64 cz,
|
||||
I64 x_radius,I64 y_radius,
|
||||
F64 rot_angle=0,
|
||||
I64 step=1,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
{//3D. Transformation with pen width.
|
||||
Bool result;
|
||||
I64 x,y,z,xx,yy,zz;
|
||||
F64 m1,a1,m2,a2,s,c;
|
||||
@@ -642,23 +635,23 @@ public Bool GrEllipse3(CDC *dc=gr_dc,
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool GrCircle3(CDC *dc=gr_dc,I64 cx,I64 cy,I64 cz,I64 radius,
|
||||
public Bool GrCircle3(CDC *dc=gr.dc,I64 cx,I64 cy,I64 cz,I64 radius,
|
||||
I64 step=1,F64 start_radians=0,F64 len_radians=2*ã)
|
||||
{ //transformation with pen width
|
||||
{//3D. Transformation with pen width.
|
||||
if (dc->flags & DCF_TRANSFORMATION)
|
||||
return GrEllipse3(dc,cx,cy,cz,radius,radius,0,step,start_radians,len_radians);
|
||||
else
|
||||
return Circle(dc,cx,cy,cz,radius,&GrPlot3,step,start_radians,len_radians);
|
||||
}
|
||||
|
||||
public Bool GrRegPoly3(CDC *dc=gr_dc,
|
||||
public Bool GrRegPoly3(CDC *dc=gr.dc,
|
||||
I64 cx,I64 cy,I64 cz,
|
||||
I64 x_radius,I64 y_radius,I64 sides,
|
||||
F64 rot_angle=0,
|
||||
I64 step=1,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
{//3D. Clipping and transform and pen width.
|
||||
Bool result;
|
||||
I64 x,y,z,xx,yy,zz;
|
||||
F64 m1,a1,m2,a2,s,c;
|
||||
@@ -704,8 +697,8 @@ public Bool GrRegPoly3(CDC *dc=gr_dc,
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 GrFloodFill3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,Bool not_color=FALSE)
|
||||
{ //transformation
|
||||
public I64 GrFloodFill3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,Bool not_color=FALSE)
|
||||
{//3D. Transformation.
|
||||
//not_color=TRUE means fill up to everything which is not the current color.
|
||||
//not_color=FALSE means fill all parts equal to the color under the point.
|
||||
//Returns cnt of pixs changed
|
||||
@@ -731,9 +724,8 @@ gr_done:
|
||||
|
||||
#help_index "Graphics;Graphics/Device Contexts"
|
||||
|
||||
public I64 GrBlot3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,CDC *img)
|
||||
{ //Clipping and transformation
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
public I64 GrBlot3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,CDC *img)
|
||||
{//3D. Clipping and transformation. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
CColorROPU32 old_color=dc->color;
|
||||
I64 color,reg i,j,w=img->width,h=img->height,
|
||||
d1,dx1,dy1,dz1,
|
||||
@@ -828,7 +820,7 @@ public I64 GrBlot3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,CDC *img)
|
||||
GrPlot(dc,_x2.i32[1],_y2.i32[1]);
|
||||
}
|
||||
} else {
|
||||
if (color!=COLOR_TRANSPARENT) {
|
||||
if (color!=TRANSPARENT) {
|
||||
dc->color=old_color&~COLORROP_NO_ROP0_MASK|color;
|
||||
if (dc->depth_buf) {
|
||||
dc->db_z=_z2.i32[1];
|
||||
@@ -918,7 +910,7 @@ normal_image:
|
||||
GrPlot(dc,x2.i32[1],y2.i32[1]);
|
||||
}
|
||||
} else {
|
||||
if (color!=COLOR_TRANSPARENT) {
|
||||
if (color!=TRANSPARENT) {
|
||||
dc->color=old_color&~COLORROP_NO_ROP0_MASK|color;//COLOR
|
||||
if (dc->depth_buf) {
|
||||
dc->db_z=z2.i32[1];
|
||||
@@ -948,8 +940,8 @@ gr_done:
|
||||
|
||||
#help_index "Graphics"
|
||||
|
||||
public Bool Gr2Bezier3(CDC *dc=gr_dc,CD3I32 *ctrl)
|
||||
{
|
||||
public Bool Gr2Bezier3(CDC *dc=gr.dc,CD3I32 *ctrl)
|
||||
{//2nd order. Clipping and transform and pen width.
|
||||
Bool result=FALSE;
|
||||
I64 i,x,y,z,
|
||||
old_flags=dc->flags;
|
||||
@@ -993,8 +985,8 @@ gr_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool Gr3Bezier3(CDC *dc=gr_dc,CD3I32 *ctrl)
|
||||
{
|
||||
public Bool Gr3Bezier3(CDC *dc=gr.dc,CD3I32 *ctrl)
|
||||
{//3rd order. Clipping and transform and pen width.
|
||||
Bool result=FALSE;
|
||||
I64 i,x,y,z,
|
||||
old_flags=dc->flags;
|
||||
@@ -1038,8 +1030,8 @@ gr_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 Gr2BSpline3(CDC *dc=gr_dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{
|
||||
public I64 Gr2BSpline3(CDC *dc=gr.dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{//2nd order. Clipping and transform and pen width.
|
||||
Bool result=FALSE;
|
||||
I64 i,x,y,z,
|
||||
old_flags=dc->flags;
|
||||
@@ -1083,8 +1075,8 @@ gr_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool Gr3BSpline3(CDC *dc=gr_dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{
|
||||
public Bool Gr3BSpline3(CDC *dc=gr.dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{//3rd order. Clipping and transform and pen width.
|
||||
Bool result=FALSE;
|
||||
I64 i,x,y,z,
|
||||
old_flags=dc->flags;
|
||||
@@ -1128,21 +1120,20 @@ gr_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 GrFillTri0(CDC *dc=gr_dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p4)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
public I64 GrFillTri0(CDC *dc=gr.dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p4)
|
||||
{//3D. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
//Returns cnt of pixs changed
|
||||
I64 x1,x2,y,z1,z2,dx1,dy1,dz1,dx2,dy2,dz2,result=0,i,y_min,y_max;
|
||||
CTask *win_task;
|
||||
//p1 is min x
|
||||
if (p4->x<p2->x)
|
||||
SwapU64(&p4,&p2);
|
||||
SwapI64(&p4,&p2);
|
||||
if (p2->x<p1->x)
|
||||
SwapU64(&p2,&p1);
|
||||
SwapI64(&p2,&p1);
|
||||
|
||||
//p2y<=p4y
|
||||
if (p4->y<p2->y)
|
||||
SwapU64(&p4,&p2);
|
||||
SwapI64(&p4,&p2);
|
||||
|
||||
y_min=0;
|
||||
y_max=dc->height;
|
||||
@@ -1364,7 +1355,6 @@ p4y
|
||||
4
|
||||
|
||||
|
||||
|
||||
2
|
||||
1
|
||||
4
|
||||
@@ -1447,116 +1437,3 @@ p4y
|
||||
ft_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 GrFillPoly3(CDC *dc=gr_dc,I64 n,CD3I32 *poly)
|
||||
{ //Must be convex.
|
||||
//Returns cnt of pixs changed
|
||||
CD3I32 tri[3];
|
||||
I64 i,j,x,y,z,result=0;
|
||||
if (n<3) return 0;
|
||||
if (dc->flags & DCF_SYMMETRY) {
|
||||
for (i=1;i<n-1;i++) {
|
||||
j=i-1;
|
||||
if (i==1) {
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
tri[0].x=x; tri[0].y=y; tri[0].z=z;
|
||||
}
|
||||
|
||||
j++;
|
||||
if (i==1) {
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
}
|
||||
tri[1].x=x; tri[1].y=y; tri[1].z=z;
|
||||
|
||||
j++;
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
tri[2].x=x; tri[2].y=y; tri[2].z=z;
|
||||
|
||||
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
|
||||
}
|
||||
}
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
return result;
|
||||
for (i=1;i<n-1;i++) {
|
||||
j=i-1;
|
||||
if (i==1) {
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
tri[0].x=x; tri[0].y=y; tri[0].z=z;
|
||||
}
|
||||
|
||||
j++;
|
||||
if (i==1) {
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
}
|
||||
tri[1].x=x; tri[1].y=y; tri[1].z=z;
|
||||
|
||||
j++;
|
||||
x=poly[j].x; y=poly[j].y; z=poly[j].z;
|
||||
if (dc->flags&DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
tri[2].x=x; tri[2].y=y; tri[2].z=z;
|
||||
|
||||
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Mesh"
|
||||
|
||||
public I64 Gr3Mesh(CDC *dc=gr_dc,I64 vertex_cnt,CD3I32 *p,I64 tri_cnt,CMeshTri *tri)
|
||||
{
|
||||
//Returns cnt of pixs changed
|
||||
CColorROPU32 old_color=dc->color;
|
||||
I64 i,x,y,z,result=0;
|
||||
CD3I32 *pt,*pt_sym,*p_sym,*dst;
|
||||
CMeshTri *tri_sym=tri;
|
||||
if (dc->flags&DCF_TRANSFORMATION) {
|
||||
dst=pt=MAlloc(sizeof(CD3I32)*vertex_cnt);
|
||||
for (i=0;i<vertex_cnt;i++,p++,dst++) {
|
||||
x=p->x; y=p->y; z=p->z;
|
||||
(*dc->transform)(dc,&x,&y,&z);
|
||||
dst->x=x; dst->y=y; dst->z=z;
|
||||
}
|
||||
p=pt;
|
||||
} else
|
||||
pt=NULL;
|
||||
|
||||
if (dc->flags & DCF_SYMMETRY) {
|
||||
dst=pt_sym=MAlloc(sizeof(CD3I32)*vertex_cnt);
|
||||
p_sym=p;
|
||||
for (i=0;i<vertex_cnt;i++,p_sym++,dst++) {
|
||||
x=p_sym->x; y=p_sym->y; z=p_sym->z;
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
dst->x=x; dst->y=y; dst->z=z;
|
||||
}
|
||||
p_sym=pt_sym;
|
||||
for (i=0;i<tri_cnt;i++,tri_sym++) {
|
||||
(*dc->lighting)(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]],tri_sym->color);
|
||||
result+=GrFillTri0(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]]);
|
||||
}
|
||||
Free(pt_sym);
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
goto mesh_done;
|
||||
}
|
||||
for (i=0;i<tri_cnt;i++,tri++) {
|
||||
(*dc->lighting)(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]],tri->color);
|
||||
result+=GrFillTri0(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]]);
|
||||
}
|
||||
mesh_done:
|
||||
dc->color=old_color;
|
||||
Free(pt);
|
||||
return result;
|
||||
}
|
||||
+128
-139
@@ -1,14 +1,14 @@
|
||||
#help_index "Graphics/Screen"
|
||||
|
||||
U0 GrUpdateWins()
|
||||
{ //Only called by WinMgr
|
||||
{//Only called by WinMgr
|
||||
I64 i;
|
||||
CTask *task,*task1;
|
||||
CD3I64 saved_scroll;
|
||||
CDC *dc;
|
||||
Preempt(OFF);
|
||||
try {
|
||||
refresh_ode_time=0;
|
||||
winmgr.ode_time=0;
|
||||
if (Bt(&sys_semas[SYS_SEMA_UPDATE_WIN_Z_BUF],0))
|
||||
WinZBufUpdate;
|
||||
task1=task=sys_winmgr_task;
|
||||
@@ -22,22 +22,22 @@ U0 GrUpdateWins()
|
||||
if (!TaskValidate(task))
|
||||
break;
|
||||
if (Bt(&task->display_flags,DISPLAYf_SHOW) &&
|
||||
Bt(gr_win_uncovered_bitmap,task->win_z_num))
|
||||
Bt(gr.win_uncovered_bitmap,task->win_z_num))
|
||||
try {
|
||||
if (!Bt(&task->display_flags,DISPLAYf_NO_BORDER))
|
||||
DrawTaskBorder(task);
|
||||
WinTextFill(task->text_attr<<8,task);
|
||||
TextBorder(Fs,task->win_left,task->win_right,task->win_top,
|
||||
task->win_bottom,task->border_attr,task==sys_focus_task);
|
||||
TextRect(task->win_left,task->win_right,
|
||||
task->win_top,task->win_bottom,task->text_attr<<8);
|
||||
Preempt(ON);
|
||||
if (task==sys_winmgr_task) {
|
||||
if (fp_wall_paper)
|
||||
(*fp_wall_paper)(task);
|
||||
} else {
|
||||
if (!(task->win_inhibit&WIF_DOC))
|
||||
DocUpdateTaskDocs(task);
|
||||
}
|
||||
if (gr.fp_wall_paper)
|
||||
(*gr.fp_wall_paper)(task);
|
||||
} else if (!(task->win_inhibit&WIF_SELF_DOC))
|
||||
DocUpdateTaskDocs(task);
|
||||
if (TaskValidate(task)) {
|
||||
if (task->draw_it) {
|
||||
dc=DCAlias(gr_dc2,task);
|
||||
dc=DCAlias(gr.dc2,task);
|
||||
(*task->draw_it)(task,dc);
|
||||
DCDel(dc);
|
||||
}
|
||||
@@ -74,7 +74,7 @@ U0 GrUpdateWins()
|
||||
ODEsUpdate(task);
|
||||
Preempt(OFF);
|
||||
} catch {
|
||||
LBts(&task->win_inhibit,WIf_ODE);
|
||||
LBts(&task->win_inhibit,WIf_SELF_ODE);
|
||||
"Exception in WinMgr: ODE\n";
|
||||
PutExcept;
|
||||
Sleep(3000);
|
||||
@@ -90,44 +90,44 @@ U0 GrUpdateWins()
|
||||
Dbg("Exception in WinMgr");
|
||||
}
|
||||
|
||||
last_refresh_ode_time=refresh_ode_time;
|
||||
winmgr.last_ode_time=winmgr.ode_time;
|
||||
ode_allocated_factor=LowPass1(0.1,ode_allocated_factor,
|
||||
Clamp(Gs->idle_factor-0.1,0.2,0.8),1/win_actual_refresh);
|
||||
Clamp(Gs->idle_factor-0.1,0.2,0.8),1/winmgr.fps);
|
||||
|
||||
sys_task_being_screen_updated=NULL;
|
||||
gr_refresh_time_stamps[gr_refresh_ts_ptr++&(GR_REFRESH_LOG_CNT-1)]=tS;
|
||||
win_actual_refresh=(GR_REFRESH_LOG_CNT-1)/
|
||||
(gr_refresh_time_stamps[(gr_refresh_ts_ptr-1)&(GR_REFRESH_LOG_CNT-1)]-
|
||||
gr_refresh_time_stamps[gr_refresh_ts_ptr&(GR_REFRESH_LOG_CNT-1)]);
|
||||
gr.refresh_time_stamps[gr.refresh_ts_ptr++&(GR_REFRESH_LOG_CNT-1)]=tS;
|
||||
winmgr.fps=(GR_REFRESH_LOG_CNT-1)/
|
||||
(gr.refresh_time_stamps[(gr.refresh_ts_ptr-1)&(GR_REFRESH_LOG_CNT-1)]-
|
||||
gr.refresh_time_stamps[gr.refresh_ts_ptr&(GR_REFRESH_LOG_CNT-1)]);
|
||||
}
|
||||
|
||||
U0 GrFixZoomScale()
|
||||
{
|
||||
gr_screen_zoom=ClampI64(gr_screen_zoom,1,GR_MAX_SCREEN_ZOOM);
|
||||
if (gr_screen_zoom==1) {
|
||||
grsx=0;
|
||||
grsy=0;
|
||||
gr.screen_zoom=ClampI64(gr.screen_zoom,1,GR_MAX_SCREEN_ZOOM);
|
||||
if (gr.screen_zoom==1) {
|
||||
gr.sx=0;
|
||||
gr.sy=0;
|
||||
} else {
|
||||
grsx=ClampI64(grsx,0,GR_WIDTH-GR_WIDTH/gr_screen_zoom)&~7;
|
||||
grsy=ClampI64(grsy,0,GR_HEIGHT-GR_HEIGHT/gr_screen_zoom);
|
||||
gr.sx=ClampI64(gr.sx,0,GR_WIDTH-GR_WIDTH/gr.screen_zoom)&~7;
|
||||
gr.sy=ClampI64(gr.sy,0,GR_HEIGHT-GR_HEIGHT/gr.screen_zoom);
|
||||
}
|
||||
}
|
||||
|
||||
public U0 GrScaleZoom(F64 scale)
|
||||
{
|
||||
{//Multiply zoom factor larger or smaller.
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
F64 s=gr_screen_zoom;
|
||||
gr_screen_zoom=gr_screen_zoom*scale;
|
||||
F64 s=gr.screen_zoom;
|
||||
gr.screen_zoom=gr.screen_zoom*scale;
|
||||
GrFixZoomScale;
|
||||
s/=gr_screen_zoom;
|
||||
ipx_scale*=s;
|
||||
ipy_scale*=s;
|
||||
ipz_scale*=s;
|
||||
ipx_offset=ipx-(ipx-ipx_offset)*s;
|
||||
ipy_offset=ipy-(ipy-ipy_offset)*s;
|
||||
ipz_offset=ipz-(ipz-ipz_offset)*s;
|
||||
grsx=ipx-gr_zoomed_dc->width >>1/gr_screen_zoom;
|
||||
grsy=ipy-gr_zoomed_dc->height>>1/gr_screen_zoom;
|
||||
s/=gr.screen_zoom;
|
||||
ip.scale.x*=s;
|
||||
ip.scale.y*=s;
|
||||
ip.scale.z*=s;
|
||||
ip.offset.x=ip.pos.x-(ip.pos.x-ip.offset.x)*s;
|
||||
ip.offset.y=ip.pos.y-(ip.pos.y-ip.offset.y)*s;
|
||||
ip.offset.z=ip.pos.z-(ip.pos.z-ip.offset.z)*s;
|
||||
gr.sx=ip.pos.x-gr.zoomed_dc->width >>1/gr.screen_zoom;
|
||||
gr.sy=ip.pos.y-gr.zoomed_dc->height>>1/gr.screen_zoom;
|
||||
GrFixZoomScale;
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
@@ -136,26 +136,26 @@ U0 GrZoomInScreen()
|
||||
{
|
||||
GrFixZoomScale;
|
||||
I64 plane,row,col,k,l,
|
||||
d2=gr_zoomed_dc->width>>3/gr_screen_zoom,
|
||||
d4=gr_zoomed_dc->width_internal>>3,
|
||||
d5=d4-d2*gr_screen_zoom,
|
||||
d3=gr_zoomed_dc->height/gr_screen_zoom,
|
||||
d6=(gr_zoomed_dc->height-d3)*gr_dc1->width_internal>>3,
|
||||
d7=gr_zoomed_dc->height%gr_screen_zoom*d4;
|
||||
U8 *src,*src2,*dst,*src3,*map=gr_screen_zoom_tables[gr_screen_zoom];
|
||||
d2=gr.zoomed_dc->width>>3/gr.screen_zoom,
|
||||
d4=gr.zoomed_dc->width_internal>>3,
|
||||
d5=d4-d2*gr.screen_zoom,
|
||||
d3=gr.zoomed_dc->height/gr.screen_zoom,
|
||||
d6=(gr.zoomed_dc->height-d3)*gr.dc1->width_internal>>3,
|
||||
d7=gr.zoomed_dc->height%gr.screen_zoom*d4;
|
||||
U8 *src,*src2,*dst,*src3,*map=gr.screen_zoom_tables[gr.screen_zoom];
|
||||
|
||||
src=gr_dc1->body+grsx>>3+grsy*gr_dc1->width_internal>>3;
|
||||
dst=gr_zoomed_dc->body;
|
||||
src=gr.dc1->body+gr.sx>>3+gr.sy*gr.dc1->width_internal>>3;
|
||||
dst=gr.zoomed_dc->body;
|
||||
for (plane=1;plane<0x10;plane<<=1) {
|
||||
row=d3;
|
||||
while (row--) {
|
||||
k=gr_screen_zoom;
|
||||
k=gr.screen_zoom;
|
||||
while (k--) {
|
||||
src2=src;
|
||||
col=d2;
|
||||
while (col--) {
|
||||
src3=&map[*src2++];
|
||||
l=gr_screen_zoom;
|
||||
l=gr.screen_zoom;
|
||||
while (l--) {
|
||||
*dst++=*src3;
|
||||
src3+=256;
|
||||
@@ -174,30 +174,30 @@ U0 GrZoomInScreen()
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrUpdateBackgroundOfText()
|
||||
U0 GrUpdateTextBG()
|
||||
{
|
||||
I64 reg RSI *dst=gr_dc2->body,reg R13 c,row,col,
|
||||
I64 reg RSI *dst=gr.dc2->body,reg R13 c,row,col,
|
||||
num_rows=TEXT_ROWS,num_cols=TEXT_COLS,i,j,cur_ch,
|
||||
reg R12 w1=gr_dc2->width_internal,w2=-7*w1+8,w3=7*w1,w4=0;
|
||||
U32 *src=gr_text_base;
|
||||
reg R12 w1=gr.dc2->width_internal,w2=-7*w1+8,w3=7*w1,w4=0;
|
||||
U32 *src=gr.text_base;
|
||||
Bool blink_flag=Blink;
|
||||
U8 *dst2=dst;
|
||||
|
||||
if (gr_pan_text_x) {
|
||||
gr_pan_text_x=ClampI64(gr_pan_text_x,-7,7);
|
||||
j=AbsI64(gr_pan_text_x)/FONT_WIDTH+1;
|
||||
if (gr.pan_text_x) {
|
||||
gr.pan_text_x=ClampI64(gr.pan_text_x,-7,7);
|
||||
j=AbsI64(gr.pan_text_x)/FONT_WIDTH+1;
|
||||
num_cols-=j;
|
||||
if (gr_pan_text_x<0) {
|
||||
if (gr.pan_text_x<0) {
|
||||
src+=j;
|
||||
i=FONT_WIDTH*j+gr_pan_text_x;
|
||||
i=FONT_WIDTH*j+gr.pan_text_x;
|
||||
} else
|
||||
i=gr_pan_text_x;
|
||||
i=gr.pan_text_x;
|
||||
dst2=dst(U8 *)+i;
|
||||
w4=j;
|
||||
w3+=j*FONT_WIDTH;
|
||||
|
||||
j*=FONT_WIDTH;
|
||||
dst(U8 *)=gr_dc2->body;
|
||||
dst(U8 *)=gr.dc2->body;
|
||||
for (row=num_rows*FONT_HEIGHT;row--;) {
|
||||
for (col=i;col--;)
|
||||
*dst(U8 *)++=0;
|
||||
@@ -208,22 +208,22 @@ U0 GrUpdateBackgroundOfText()
|
||||
}
|
||||
dst=dst2;
|
||||
|
||||
if (gr_pan_text_y) {
|
||||
gr_pan_text_y=ClampI64(gr_pan_text_y,-7,7);
|
||||
j=AbsI64(gr_pan_text_y)/FONT_HEIGHT+1;
|
||||
if (gr.pan_text_y) {
|
||||
gr.pan_text_y=ClampI64(gr.pan_text_y,-7,7);
|
||||
j=AbsI64(gr.pan_text_y)/FONT_HEIGHT+1;
|
||||
num_rows-=j;
|
||||
if (gr_pan_text_y<0) {
|
||||
if (gr.pan_text_y<0) {
|
||||
src+=w1/FONT_WIDTH*j;
|
||||
i=w1*(FONT_HEIGHT*j+gr_pan_text_y);
|
||||
i=w1*(FONT_HEIGHT*j+gr.pan_text_y);
|
||||
} else
|
||||
i=w1*gr_pan_text_y;
|
||||
i=w1*gr.pan_text_y;
|
||||
dst2=dst(U8 *)+i;
|
||||
|
||||
j*=w1*FONT_HEIGHT;
|
||||
dst(U8 *)=gr_dc2->body;
|
||||
dst(U8 *)=gr.dc2->body;
|
||||
for (row=i;row--;)
|
||||
*dst(U8 *)++=0;
|
||||
dst(U8 *)=gr_dc2->body+TEXT_ROWS*TEXT_COLS*FONT_HEIGHT*FONT_WIDTH-j;
|
||||
dst(U8 *)=gr.dc2->body+TEXT_ROWS*TEXT_COLS*FONT_HEIGHT*FONT_WIDTH-j;
|
||||
for (row=j;row--;)
|
||||
*dst(U8 *)++=0;
|
||||
}
|
||||
@@ -232,15 +232,15 @@ U0 GrUpdateBackgroundOfText()
|
||||
for (row=num_rows;row--;) {
|
||||
for (col=num_cols;col--;) {
|
||||
cur_ch=*src++;
|
||||
if (cur_ch & (DOCET_SELECTED | DOCET_INVERT | DOCET_BLINK)) {
|
||||
if (cur_ch & DOCET_SELECTED)
|
||||
if (cur_ch & (ATTRF_SELECTED|ATTRF_INVERT|ATTRF_BLINK)) {
|
||||
if (cur_ch & ATTRF_SELECTED)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
|
||||
if (cur_ch & DOCET_INVERT)
|
||||
if (cur_ch & ATTRF_INVERT)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
|
||||
if (cur_ch & DOCET_BLINK && blink_flag)
|
||||
if (cur_ch & ATTRF_BLINK && blink_flag)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
|
||||
}
|
||||
c=gr_1_to_8_colors[cur_ch.u8[1]>>4];
|
||||
c=gr.to_8_colors[cur_ch.u8[1]>>4];
|
||||
MOV U64 [RSI],R13
|
||||
ADD RSI,R12
|
||||
MOV U64 [RSI],R13
|
||||
@@ -263,30 +263,20 @@ U0 GrUpdateBackgroundOfText()
|
||||
}
|
||||
}
|
||||
|
||||
//$AN,"ExtScreenCodes",A="ExtScreenCodes"$
|
||||
// Bits 0-7 ASCII (Screen Code)
|
||||
// Bits 8-11 Foreground color
|
||||
// Bits 12-15 Background color
|
||||
// Bits 16-20 Signed X pos shift val
|
||||
// Bits 21-25 Signed Y pos shift val
|
||||
// Bit 28 Blink
|
||||
// Bit 29 Inverted (Swap foreground and background)
|
||||
// Bit 30 Selected (XOR colors with FF)
|
||||
// Bit 31 Underline
|
||||
U0 GrUpdateForegroundOfText()
|
||||
{
|
||||
U32 *src=gr_text_base;
|
||||
I64 i,j,cur_ch,*dst=gr_dc2->body,
|
||||
w1=gr_dc2->width_internal,w2=7*w1,w4=0,
|
||||
U0 GrUpdateTextFG()
|
||||
{//See $LK,"TextBase Layer",A="HI:TextBase Layer"$.
|
||||
U32 *src=gr.text_base;
|
||||
I64 i,j,cur_ch,*dst=gr.dc2->body,
|
||||
w1=gr.dc2->width_internal,w2=7*w1,w4=0,
|
||||
num_rows=TEXT_ROWS,num_cols=TEXT_COLS,row,col;
|
||||
U8 *dst_start=gr_dc2->body,*dst_end=dst_start+w1*gr_dc2->height-7*w1-8;
|
||||
U8 *dst_start=gr.dc2->body,*dst_end=dst_start+w1*gr.dc2->height-7*w1-8;
|
||||
Bool blink_flag=Blink;
|
||||
|
||||
if (gr_pan_text_x) {
|
||||
gr_pan_text_x=ClampI64(gr_pan_text_x,-7,7);
|
||||
j=AbsI64(gr_pan_text_x)/FONT_WIDTH+1;
|
||||
if (gr.pan_text_x) {
|
||||
gr.pan_text_x=ClampI64(gr.pan_text_x,-7,7);
|
||||
j=AbsI64(gr.pan_text_x)/FONT_WIDTH+1;
|
||||
num_cols-=j;
|
||||
if (gr_pan_text_x<0) {
|
||||
if (gr.pan_text_x<0) {
|
||||
src+=j;
|
||||
dst(U8 *)+=FONT_WIDTH*j;
|
||||
}
|
||||
@@ -294,11 +284,11 @@ U0 GrUpdateForegroundOfText()
|
||||
w2+=j*FONT_WIDTH;
|
||||
}
|
||||
|
||||
if (gr_pan_text_y) {
|
||||
gr_pan_text_y=ClampI64(gr_pan_text_y,-7,7);
|
||||
j=AbsI64(gr_pan_text_y)/FONT_HEIGHT+1;
|
||||
if (gr.pan_text_y) {
|
||||
gr.pan_text_y=ClampI64(gr.pan_text_y,-7,7);
|
||||
j=AbsI64(gr.pan_text_y)/FONT_HEIGHT+1;
|
||||
num_rows-=j;
|
||||
if (gr_pan_text_y<0) {
|
||||
if (gr.pan_text_y<0) {
|
||||
src+=w1/FONT_WIDTH*j;
|
||||
dst(U8 *)+=w1*FONT_HEIGHT*j;
|
||||
}
|
||||
@@ -307,24 +297,24 @@ U0 GrUpdateForegroundOfText()
|
||||
for (row=num_rows;row--;) {
|
||||
for (col=num_cols;col--;) {
|
||||
cur_ch=*src++;
|
||||
if (cur_ch & (DOCET_UNDERLINE | DOCET_SELECTED | DOCET_INVERT | DOCET_BLINK)) {
|
||||
if (cur_ch & DOCET_SELECTED)
|
||||
if (cur_ch & (ATTRF_UNDERLINE|ATTRF_SELECTED|ATTRF_INVERT|ATTRF_BLINK)) {
|
||||
if (cur_ch & ATTRF_SELECTED)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
|
||||
if (cur_ch & DOCET_INVERT)
|
||||
if (cur_ch & ATTRF_INVERT)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
|
||||
if (cur_ch & DOCET_BLINK && blink_flag)
|
||||
if (cur_ch & ATTRF_BLINK && blink_flag)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
|
||||
}
|
||||
if (i=cur_ch.u16[1]&0x3FF+gr_pan_text_x+gr_pan_text_y<<5) {
|
||||
if (i=cur_ch.u16[1]&0x3FF+gr.pan_text_x+gr.pan_text_y<<5) {
|
||||
j=i&0x1F;
|
||||
if (j&0x10) j|=~0x1F;
|
||||
i>>=5;
|
||||
if (i&0x10) i|=~0x1F;
|
||||
i=w1*i+j;
|
||||
if (dst_start<=dst(U8 *)+i<dst_end)
|
||||
GrRopEquU8NoClipping(cur_ch&(DOCET_UNDERLINE+0xFFF),dst(U8 *)+i,w1);
|
||||
GrRopEquU8NoClipping(cur_ch&(ATTRF_UNDERLINE+0xFFF),dst(U8 *)+i,w1);
|
||||
} else
|
||||
GrRopEquU8NoClipping(cur_ch&(DOCET_UNDERLINE+0xFFF),dst,w1);
|
||||
GrRopEquU8NoClipping(cur_ch&(ATTRF_UNDERLINE+0xFFF),dst,w1);
|
||||
dst(U8 *)+=8;
|
||||
}
|
||||
src+=w4;
|
||||
@@ -334,11 +324,11 @@ U0 GrUpdateForegroundOfText()
|
||||
|
||||
U0 DCBlotColor8(CDC *dc,CDC *img)
|
||||
{
|
||||
U8 reg *src=img->body,*b0=dc->body;
|
||||
I64 reg j,reg k,reg d0=img->width_internal*img->height;
|
||||
U8 *src=img->body,*b0=dc->body;
|
||||
I64 j,k,d0=img->width_internal*img->height;
|
||||
for (k=0;k<d0;k++) {
|
||||
j=*src++;
|
||||
if (j!=COLOR_TRANSPARENT)
|
||||
if (j!=TRANSPARENT)
|
||||
*b0++=j;
|
||||
else
|
||||
b0++;
|
||||
@@ -347,19 +337,19 @@ U0 DCBlotColor8(CDC *dc,CDC *img)
|
||||
|
||||
U0 GrUpdateTextModeText()
|
||||
{
|
||||
U32 *src=gr_text_base;
|
||||
U32 *src=gr.text_base;
|
||||
I64 cur_ch,i,d0=TEXT_COLS*TEXT_ROWS;
|
||||
U16 *dst=VGA_TEXT_MEM_BASE,*dst2=gr_vga_text_cache;
|
||||
U16 *dst=VGA_TEXT_MEM_BASE,*dst2=gr.vga_text_cache;
|
||||
Bool blink_flag=Blink;
|
||||
if (LBtr(&sys_semas[SYS_SEMA_FLUSH_VGA_IMAGE],0)) {
|
||||
i=d0;
|
||||
while (i--) {
|
||||
cur_ch=*src++;
|
||||
if (cur_ch & DOCET_SELECTED)
|
||||
if (cur_ch & ATTRF_SELECTED)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
|
||||
if (cur_ch & DOCET_INVERT)
|
||||
if (cur_ch & ATTRF_INVERT)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
|
||||
if (cur_ch & DOCET_BLINK)
|
||||
if (cur_ch & ATTRF_BLINK)
|
||||
if (blink_flag)
|
||||
cur_ch.u8[1]= cur_ch.u8[1]<<4+ cur_ch.u8[1]>>4;
|
||||
cur_ch&=0x7FFF;
|
||||
@@ -369,11 +359,11 @@ U0 GrUpdateTextModeText()
|
||||
i=d0;
|
||||
while (i--) {
|
||||
cur_ch=*src++;
|
||||
if (cur_ch & DOCET_SELECTED)
|
||||
if (cur_ch & ATTRF_SELECTED)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
|
||||
if (cur_ch & DOCET_INVERT)
|
||||
if (cur_ch & ATTRF_INVERT)
|
||||
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
|
||||
if (cur_ch & DOCET_BLINK)
|
||||
if (cur_ch & ATTRF_BLINK)
|
||||
if (blink_flag)
|
||||
cur_ch.u8[1]= cur_ch.u8[1]<<4+ cur_ch.u8[1]>>4;
|
||||
cur_ch&=0x7FFF;
|
||||
@@ -388,63 +378,62 @@ U0 GrUpdateTextModeText()
|
||||
}
|
||||
|
||||
U0 GrUpdateVGAGraphics()
|
||||
{
|
||||
I64 row,plane,d2=gr_zoomed_dc->width_internal>>5;
|
||||
U32 *src,*dst,*dst2;
|
||||
//Update Graphic Card
|
||||
if (gr_screen_zoom==1)
|
||||
src=gr_dc1->body;
|
||||
{//Update Graphic Card
|
||||
I64 row,plane,d=gr.zoomed_dc->width_internal>>6;
|
||||
U32 *src,*vga,*dst;
|
||||
if (gr.screen_zoom==1)
|
||||
src=gr.dc1->body;
|
||||
else {
|
||||
GrZoomInScreen;
|
||||
src=gr_zoomed_dc->body;
|
||||
src=gr.zoomed_dc->body;
|
||||
}
|
||||
dst2=gr_screen_image->body;
|
||||
dst=gr.screen_image->body;
|
||||
if (LBtr(&sys_semas[SYS_SEMA_FLUSH_VGA_IMAGE],0)) {
|
||||
for (plane=1;plane<0x10;plane<<=1) {
|
||||
OutU8(VGA_SC_INDEX,VGA_MAP_MASK);
|
||||
OutU8(VGA_SC_DATA,plane);
|
||||
dst=VGA_GRAPHIC_MEM_BASE;
|
||||
row=gr_zoomed_dc->height;
|
||||
vga=VGA_GRAPHIC_MEM_BASE;
|
||||
row=gr.zoomed_dc->height;
|
||||
while (row--)
|
||||
GrUpdateLine32FlushCache(&dst,&src,d2,&dst2);
|
||||
GrUpdateLine64FlushCache(&vga,&src,d,&dst);
|
||||
}
|
||||
} else {
|
||||
for (plane=1;plane<0x10;plane<<=1) {
|
||||
OutU8(VGA_SC_INDEX,VGA_MAP_MASK);
|
||||
OutU8(VGA_SC_DATA,plane);
|
||||
dst=VGA_GRAPHIC_MEM_BASE;
|
||||
row=gr_zoomed_dc->height;
|
||||
vga=VGA_GRAPHIC_MEM_BASE;
|
||||
row=gr.zoomed_dc->height;
|
||||
while (row--)
|
||||
GrUpdateLine32(&dst,&src,d2,&dst2);
|
||||
GrUpdateLine64(&vga,&src,d,&dst);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrUpdateScreen()
|
||||
{
|
||||
{//Called by the Window Manager $LK,"HERE",A="FF:::/Adam/Win2b.CPP,GrUpdateScreen"$, 60 times a second.
|
||||
CDC *dc;
|
||||
Preempt(ON);
|
||||
if (text_mode) //If 640x480 VGA is not available, falls back to text mode.
|
||||
if (!sys_bios_gr_mode) //if text mode
|
||||
GrUpdateWins;
|
||||
else {
|
||||
GrUpdateBackgroundOfText;
|
||||
GrUpdateForegroundOfText;
|
||||
GrUpdateTextBG;
|
||||
GrUpdateTextFG;
|
||||
GrUpdateWins;
|
||||
DCBlotColor8(gr_dc2,gr_dc);
|
||||
DCBlotColor8(gr.dc2,gr.dc);
|
||||
}
|
||||
Preempt(OFF);
|
||||
|
||||
dc=DCAlias(gr_dc2,Fs);
|
||||
dc=DCAlias(gr.dc2,Fs);
|
||||
dc->flags|=DCF_ON_TOP;
|
||||
if (fp_final_screen_update)
|
||||
(*fp_final_screen_update)(dc);
|
||||
if (gr.fp_final_screen_update)
|
||||
(*gr.fp_final_screen_update)(dc);
|
||||
DCDel(dc);
|
||||
|
||||
if (text_mode)
|
||||
if (!sys_bios_gr_mode) //if text mode
|
||||
GrUpdateTextModeText;
|
||||
else {
|
||||
DCBlotColor4(gr_dc1->body,gr_dc2->body,gr_dc_cache->body,
|
||||
gr_dc2->height*gr_dc2->width_internal>>3);
|
||||
DCBlotColor4(gr.dc1->body,gr.dc2->body,gr.dc_cache->body,
|
||||
gr.dc2->height*gr.dc2->width_internal>>3);
|
||||
GrUpdateVGAGraphics;
|
||||
}
|
||||
}
|
||||
+90
-98
@@ -3,28 +3,26 @@
|
||||
$LK,"CSprite",A="MN:CSprite"$s are stored as a sequence of var
|
||||
length operations with a 1-byte type leading
|
||||
each operation. The types available are lsted
|
||||
here, $LK,"GRST_PT",A="MN:GRST_PT"$. They are stored, one after another,
|
||||
in a chunk of memory terminated by a type $LK,"GRST_END",A="MN:GRST_END"$.
|
||||
here, $LK,"SPT_PT",A="MN:SPT_PT"$. They are stored, one after another,
|
||||
in a chunk of memory terminated by a type $LK,"SPT_END",A="MN:SPT_END"$.
|
||||
|
||||
$LK,"Sprite3",A="MN:Sprite3"$() and $LK,"SpriteMain",A="MN:SpriteMain"$() shows how the
|
||||
unions are used. It's kind-of a mess using a union.
|
||||
$LK,"Sprite3",A="MN:Sprite3"$() shows how the $LK,"CSprite",A="MN:CSprite"$ unions are used.
|
||||
It's kind-of a mess using a union.
|
||||
|
||||
$LK,"SpriteSize",A="MN:SpriteSize"$() will return the size of a single
|
||||
operation, while $LK,"SpriteSize",A="MN:SpriteSize"$() with an 's' will
|
||||
return the size of an entire lst. Look at
|
||||
$LK,"sprite_base_size",A="MN:sprite_base_size"$.
|
||||
$LK,"SpriteElemSize",A="MN:SpriteElemSize"$() will return the size of a single
|
||||
element, while $LK,"SpriteSize",A="MN:SpriteSize"$() will return the size
|
||||
of an entire lst. Look at $LK,"sprite_elem_base_sizes",A="MN:sprite_elem_base_sizes"$.
|
||||
|
||||
To get familiar, type <CTRL-R> on sprite in
|
||||
a document and select "Display as Text". It
|
||||
will show the raw data for each CSprite. This
|
||||
is how they are stored in files, as well.
|
||||
See $LK,"SpriteElem2Code",A="MN:SpriteElem2Code"$() to infer the raw storage
|
||||
format. They are stored as raw binary values
|
||||
when saved to files, not text code.
|
||||
|
||||
See $MA-X+PU,"::/Apps/GrModels",LM="Cd(\"::/Apps/GrModels\");Dir;View;\n"$ for an example of
|
||||
making CSprite by hand. Those are type
|
||||
$LK,"GRST_MESH",A="MN:GRST_MESH"$, one of the most complicated.
|
||||
$LK,"SPT_MESH",A="MN:SPT_MESH"$, one of the most complicated.
|
||||
*/
|
||||
|
||||
public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
public U0 Sprite3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
{//Plot a sprite into a CDC.
|
||||
CSprite *tempg=elems-offset(CSprite.start);
|
||||
I64 i,j,k,x1,y1,z1,x2,y2,
|
||||
@@ -40,19 +38,19 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
while (tempg->type) {
|
||||
dc->cur_sprite_elem_num=cur_sprite_elem_num++;
|
||||
switch (tempg->type) {
|
||||
case GRST_COLOR8:
|
||||
dc->color=dc->color&~(COLORROP_COLORS_MASK|ROPF_DITHER)|tempg->color8;
|
||||
case SPT_COLOR:
|
||||
dc->color=dc->color&~(COLORROP_COLORS_MASK|ROPF_DITHER)|tempg->color;
|
||||
break;
|
||||
case GRST_DITHER_COLOR8:
|
||||
case SPT_DITHER_COLOR:
|
||||
dc->color=dc->color&~COLORROP_COLORS_MASK|
|
||||
tempg->dither_color8.u8[0]|
|
||||
tempg->dither_color8.u8[1]<<COLORROP_BITS|ROPF_DITHER;
|
||||
tempg->dither_color.u8[0]|
|
||||
tempg->dither_color.u8[1]<<COLORROP_BITS|ROPF_DITHER;
|
||||
break;
|
||||
case GRST_WIDTH:
|
||||
case SPT_WIDTH:
|
||||
dc->pen_width=tempg->width;
|
||||
GrScalePenWidth(dc);
|
||||
break;
|
||||
case GRST_TRANSFORM_ON:
|
||||
case SPT_TRANSFORM_ON:
|
||||
if (!(dc->flags&DCF_TRANSFORMATION)) {
|
||||
x-=dc->x;
|
||||
y-=dc->y;
|
||||
@@ -60,7 +58,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
}
|
||||
dc->flags|=DCF_TRANSFORMATION;
|
||||
break;
|
||||
case GRST_TRANSFORM_OFF:
|
||||
case SPT_TRANSFORM_OFF:
|
||||
if (dc->flags&DCF_TRANSFORMATION) {
|
||||
x+=dc->x;
|
||||
y+=dc->y;
|
||||
@@ -68,44 +66,44 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
}
|
||||
dc->flags&=~DCF_TRANSFORMATION;
|
||||
break;
|
||||
case GRST_PT:
|
||||
case SPT_PT:
|
||||
GrPlot3(dc,tempg->x1+x,tempg->y1+y,z);
|
||||
break;
|
||||
case GRST_TEXT:
|
||||
case SPT_TEXT:
|
||||
GrPrint3(dc,tempg->x1+x,tempg->y1+y,z,"%s",tempg->st);
|
||||
break;
|
||||
case GRST_TEXT_BOX:
|
||||
case SPT_TEXT_BOX:
|
||||
GrTextBox3(dc,tempg->x1+x,tempg->y1+y,z,tempg->st);
|
||||
break;
|
||||
case GRST_TEXT_DIAMOND:
|
||||
case SPT_TEXT_DIAMOND:
|
||||
GrTextDiamond3(dc,tempg->x1+x,tempg->y1+y,z,tempg->st);
|
||||
break;
|
||||
case GRST_FLOOD_FILL:
|
||||
case SPT_FLOOD_FILL:
|
||||
GrFloodFill3(dc,tempg->x1+x,tempg->y1+y,z,FALSE);
|
||||
break;
|
||||
case GRST_FLOOD_FILL_NOT:
|
||||
case SPT_FLOOD_FILL_NOT:
|
||||
i=dc->color;
|
||||
dc->color=dc->color.c0;
|
||||
GrFloodFill3(dc,tempg->x1+x,tempg->y1+y,z,TRUE);
|
||||
dc->color=i;
|
||||
break;
|
||||
case GRST_SHIFT:
|
||||
case SPT_SHIFT:
|
||||
x+=tempg->x1;
|
||||
y+=tempg->y1;
|
||||
break;
|
||||
case GRST_LINE:
|
||||
case SPT_LINE:
|
||||
GrLine3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2+x,tempg->y2+y,z);
|
||||
break;
|
||||
case GRST_ARROW:
|
||||
case SPT_ARROW:
|
||||
GrArrow3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2+x,tempg->y2+y,z);
|
||||
break;
|
||||
case GRST_PLANAR_SYMMETRY:
|
||||
case SPT_PLANAR_SYMMETRY:
|
||||
if (GrSetSymmetry3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2+x,tempg->y2+y,z,tempg->x2+x,tempg->y2+y,z+1))
|
||||
dc->flags|=DCF_SYMMETRY;
|
||||
else
|
||||
dc->flags&=~DCF_SYMMETRY;
|
||||
break;
|
||||
case GRST_BITMAP8:
|
||||
case SPT_BITMAP:
|
||||
img=CAlloc(sizeof(CDC));
|
||||
img->width=tempg->width;
|
||||
img->width_internal=(tempg->width+7)&~7;
|
||||
@@ -116,10 +114,10 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
GrBlot3(dc,tempg->x2+x,tempg->y2+y,z,img);
|
||||
Free(img);
|
||||
break;
|
||||
case GRST_RECT:
|
||||
case SPT_RECT:
|
||||
GrRect3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2-tempg->x1,tempg->y2-tempg->y1);
|
||||
break;
|
||||
case GRST_ROTATED_RECT:
|
||||
case SPT_ROTATED_RECT:
|
||||
x1=tempg->x1+x;
|
||||
y1=tempg->y1+y;
|
||||
z1=z;
|
||||
@@ -135,16 +133,16 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
GrSetRotMat(dc,old_r);
|
||||
dc->flags=dc->flags&~DCF_TRANSFORMATION|old_flags;
|
||||
break;
|
||||
case GRST_CIRCLE:
|
||||
case SPT_CIRCLE:
|
||||
GrCircle3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2);
|
||||
break;
|
||||
case GRST_ELLIPSE:
|
||||
case SPT_ELLIPSE:
|
||||
GrEllipse3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->rot_angle);
|
||||
break;
|
||||
case GRST_POLYGON:
|
||||
case SPT_POLYGON:
|
||||
GrRegPoly3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->sides,tempg->rot_angle);
|
||||
break;
|
||||
case GRST_POLYLINE:
|
||||
case SPT_POLYLINE:
|
||||
ptr=&tempg->y1;
|
||||
x1=ptr[0];
|
||||
y1=ptr[1];
|
||||
@@ -155,7 +153,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
x1=x2;y1=y2;
|
||||
}
|
||||
break;
|
||||
case GRST_POLYPT:
|
||||
case SPT_POLYPT:
|
||||
ptr=&tempg->y1;
|
||||
x1=ptr[0];
|
||||
y1=ptr[1];
|
||||
@@ -176,16 +174,16 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
p->y+=y;
|
||||
p->z+=z;
|
||||
}
|
||||
case GRST_BSPLINE2:
|
||||
case SPT_BSPLINE2:
|
||||
Gr2BSpline3(dc,&tempg->y1,tempg->num,FALSE);
|
||||
break;
|
||||
case GRST_BSPLINE3:
|
||||
case SPT_BSPLINE3:
|
||||
Gr3BSpline3(dc,&tempg->y1,tempg->num,FALSE);
|
||||
break;
|
||||
case GRST_BSPLINE2_CLOSED:
|
||||
case SPT_BSPLINE2_CLOSED:
|
||||
Gr2BSpline3(dc,&tempg->y1,tempg->num,TRUE);
|
||||
break;
|
||||
case GRST_BSPLINE3_CLOSED:
|
||||
case SPT_BSPLINE3_CLOSED:
|
||||
Gr3BSpline3(dc,&tempg->y1,tempg->num,TRUE);
|
||||
break;
|
||||
sub_switch_end:
|
||||
@@ -196,7 +194,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
p->z-=z;
|
||||
}
|
||||
break;
|
||||
case GRST_MESH:
|
||||
case SPT_MESH:
|
||||
p=&tempg->x2;
|
||||
for (i=0;i<tempg->vertex_cnt;i++,p++) {
|
||||
p->x+=x;
|
||||
@@ -211,7 +209,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
p->z-=z;
|
||||
}
|
||||
break;
|
||||
case GRST_SHIFTABLE_MESH:
|
||||
case SPT_SHIFTABLE_MESH:
|
||||
if (dc->flags&DCF_TRANSFORMATION) {
|
||||
dc->x+=tempg->x1;
|
||||
dc->y+=tempg->y1;
|
||||
@@ -255,7 +253,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
old_flags&(DCF_SYMMETRY|DCF_TRANSFORMATION);
|
||||
}
|
||||
|
||||
public U0 Sprite3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems)
|
||||
public U0 Sprite3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems)
|
||||
{//Plot a sprite into a CDC, post transform xyz translation.
|
||||
I64 old_x=dc->x,old_y=dc->y,old_z=dc->z,
|
||||
old_flags=dc->flags&DCF_TRANSFORMATION;
|
||||
@@ -266,8 +264,8 @@ public U0 Sprite3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems)
|
||||
dc->flags=dc->flags&~DCF_TRANSFORMATION|old_flags;
|
||||
}
|
||||
|
||||
public U0 SpriteMat3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,I64 *m)
|
||||
{//Plot rotated by matrix
|
||||
public U0 SpriteMat3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,I64 *m)
|
||||
{//Plot rotated by matrix.
|
||||
I64 *old_r=dc->r,old_m[16],
|
||||
old_flags=dc->flags&DCF_TRANSFORMATION;
|
||||
MemCpy(old_m,m,16*sizeof(I64));
|
||||
@@ -281,22 +279,22 @@ public U0 SpriteMat3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,I64 *m)
|
||||
dc->flags=dc->flags&~DCF_TRANSFORMATION|old_flags;
|
||||
}
|
||||
|
||||
public U0 SpriteX3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,F64 è=0)
|
||||
{//Plot rotated around X axis
|
||||
public U0 SpriteX3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,F64 è=0)
|
||||
{//Plot rotated around X axis.
|
||||
I64 *r=GrRotXNew(è);
|
||||
SpriteMat3B(dc,x,y,z,elems,r);
|
||||
Free(r);
|
||||
}
|
||||
|
||||
public U0 SpriteY3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,F64 ê=0)
|
||||
{//Plot rotated around Y axis
|
||||
public U0 SpriteY3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,F64 ê=0)
|
||||
{//Plot rotated around Y axis.
|
||||
I64 *r=GrRotYNew(ê);
|
||||
SpriteMat3B(dc,x,y,z,elems,r);
|
||||
Free(r);
|
||||
}
|
||||
|
||||
public U0 SpriteZ3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,F64 é=0)
|
||||
{//Plot rotated around Z axis
|
||||
public U0 SpriteZ3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,F64 é=0)
|
||||
{//Plot rotated around Z axis.
|
||||
I64 *r=GrRotZNew(é);
|
||||
SpriteMat3B(dc,x,y,z,elems,r);
|
||||
Free(r);
|
||||
@@ -304,7 +302,7 @@ public U0 SpriteZ3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,F64
|
||||
|
||||
public U0 SpriteExtents(U8 *elems,I64 *min_x=NULL,I64 *max_x=NULL,
|
||||
I64 *min_y=NULL,I64 *max_y=NULL)
|
||||
{ //Ignores flood fills.
|
||||
{//Ignores flood fills.
|
||||
CDC *dc=DCNew(MAX_I32,MAX_I32,Fs,TRUE);
|
||||
DCExtentsInit(dc);
|
||||
Sprite3(dc,MAX_I32/2,MAX_I32/2,MAX_I32/2,elems);
|
||||
@@ -324,7 +322,7 @@ public U0 SpriteExtents(U8 *elems,I64 *min_x=NULL,I64 *max_x=NULL,
|
||||
}
|
||||
|
||||
public CDC *Sprite2DC(U8 *elems)
|
||||
{
|
||||
{//Convert sprite to device context.
|
||||
CDC *result;
|
||||
I64 min_x,max_x,min_y,max_y;
|
||||
SpriteExtents(elems,&min_x,&max_x,&min_y,&max_y);
|
||||
@@ -334,11 +332,9 @@ public CDC *Sprite2DC(U8 *elems)
|
||||
}
|
||||
|
||||
public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
|
||||
{
|
||||
//The two CSprite should be identical
|
||||
//except for points shifted around.
|
||||
//t ranges from 0.0 to 1.0
|
||||
I64 i,t1=gr_scale*t,t0=gr_scale-t1;
|
||||
{//The two CSprite should be identical except for points shifted around.
|
||||
//t ranges from 0.0 to 1.0.
|
||||
I64 i,t1=GR_SCALE*t,t0=GR_SCALE-t1;
|
||||
I32 *ptr0,*ptr1,*ptrr;
|
||||
CD3I32 *p0,*p1,*pr;
|
||||
U8 *result;
|
||||
@@ -358,41 +354,41 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
|
||||
if (tempg0->type!=tempg1->type)
|
||||
throw('Graphics');
|
||||
switch (tempg0->type) {
|
||||
case GRST_ROTATED_RECT:
|
||||
tempgr->rot_angle=(tempg0->rot_angle*t0+tempg1->rot_angle*t1)/gr_scale;
|
||||
case GRST_RECT:
|
||||
case GRST_LINE:
|
||||
case GRST_ARROW:
|
||||
case GRST_PLANAR_SYMMETRY:
|
||||
case SPT_ROTATED_RECT:
|
||||
tempgr->rot_angle=(tempg0->rot_angle*t0+tempg1->rot_angle*t1)/GR_SCALE;
|
||||
case SPT_RECT:
|
||||
case SPT_LINE:
|
||||
case SPT_ARROW:
|
||||
case SPT_PLANAR_SYMMETRY:
|
||||
tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32;
|
||||
tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32;
|
||||
case GRST_TEXT:
|
||||
case GRST_TEXT_BOX:
|
||||
case GRST_TEXT_DIAMOND:
|
||||
case GRST_PT:
|
||||
case GRST_FLOOD_FILL:
|
||||
case GRST_FLOOD_FILL_NOT:
|
||||
case GRST_SHIFT:
|
||||
case SPT_TEXT:
|
||||
case SPT_TEXT_BOX:
|
||||
case SPT_TEXT_DIAMOND:
|
||||
case SPT_PT:
|
||||
case SPT_FLOOD_FILL:
|
||||
case SPT_FLOOD_FILL_NOT:
|
||||
case SPT_SHIFT:
|
||||
tempgr->x1=(tempg0->x1*t0+tempg1->x1*t1)>>32;
|
||||
tempgr->y1=(tempg0->y1*t0+tempg1->y1*t1)>>32;
|
||||
break;
|
||||
case GRST_CIRCLE:
|
||||
case SPT_CIRCLE:
|
||||
tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32;
|
||||
tempgr->x1=(tempg0->x1*t0+tempg1->x1*t1)>>32;
|
||||
tempgr->y1=(tempg0->y1*t0+tempg1->y1*t1)>>32;
|
||||
break;
|
||||
case GRST_ELLIPSE:
|
||||
case GRST_POLYGON:
|
||||
case SPT_ELLIPSE:
|
||||
case SPT_POLYGON:
|
||||
tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32;
|
||||
tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32;
|
||||
tempgr->width=(tempg0->width*t0+tempg1->width*t1)>>32;
|
||||
tempgr->height=(tempg0->height*t0+tempg1->height*t1)>>32;
|
||||
break;
|
||||
case GRST_BITMAP8:
|
||||
case SPT_BITMAP:
|
||||
tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32;
|
||||
tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32;
|
||||
break;
|
||||
case GRST_POLYLINE:
|
||||
case SPT_POLYLINE:
|
||||
ptr0=&tempg0->y1;
|
||||
ptr1=&tempg1->y1;
|
||||
ptrr=&tempgr->y1;
|
||||
@@ -401,17 +397,17 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
|
||||
ptrr[i<<1+1]=(ptr0[i<<1+1]*t0+ptr1[i<<1+1]*t1)>>32;
|
||||
}
|
||||
break;
|
||||
case GRST_POLYPT:
|
||||
case SPT_POLYPT:
|
||||
ptr0=&tempg0->y1;
|
||||
ptr1=&tempg1->y1;
|
||||
ptrr=&tempgr->y1;
|
||||
ptrr[0]=(ptr0[0]*t0+ptr1[0]*t1)>>32;
|
||||
ptrr[1]=(ptr0[1]*t0+ptr1[1]*t1)>>32;
|
||||
break;
|
||||
case GRST_BSPLINE2:
|
||||
case GRST_BSPLINE3:
|
||||
case GRST_BSPLINE2_CLOSED:
|
||||
case GRST_BSPLINE3_CLOSED:
|
||||
case SPT_BSPLINE2:
|
||||
case SPT_BSPLINE3:
|
||||
case SPT_BSPLINE2_CLOSED:
|
||||
case SPT_BSPLINE3_CLOSED:
|
||||
p0=&tempg0->y1;
|
||||
p1=&tempg1->y1;
|
||||
pr=&tempgr->y1;
|
||||
@@ -421,7 +417,7 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
|
||||
pr[i].z=(p0[i].z*t0+p1[i].z*t1)>>32;
|
||||
}
|
||||
break;
|
||||
case GRST_MESH:
|
||||
case SPT_MESH:
|
||||
p0=&tempg0->x2;
|
||||
p1=&tempg1->x2;
|
||||
pr=&tempgr->x2;
|
||||
@@ -431,7 +427,7 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
|
||||
pr[i].z=(p0[i].z*t0+p1[i].z*t1)>>32;
|
||||
}
|
||||
break;
|
||||
case GRST_SHIFTABLE_MESH:
|
||||
case SPT_SHIFTABLE_MESH:
|
||||
p0=(&tempg0->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
p1=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
pr=(&tempgr->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
@@ -449,11 +445,10 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
#help_index "Graphics/Sprite;Doc/Output"
|
||||
#help_index "Graphics/Sprite;DolDoc/Output"
|
||||
public CDocEntry *DocSprite(CDoc *doc=NULL,U8 *elems,U8 *fmt=NULL)
|
||||
{//Put a sprite into a document. You can, optionally, supply a fmt string
|
||||
//for $LK,"Dollar",A="FI:::/Doc/Dollar.TXT"$ cmd with a %d for the bin_num.
|
||||
//for $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT"$ cmd with a %d for the bin_num.
|
||||
I64 size;
|
||||
U8 *st;
|
||||
Bool unlock;
|
||||
@@ -470,13 +465,13 @@ public CDocEntry *DocSprite(CDoc *doc=NULL,U8 *elems,U8 *fmt=NULL)
|
||||
tempb->use_cnt=1;
|
||||
QueIns(tempb,doc->bin_root.last);
|
||||
if (fmt)
|
||||
st=MPrint(fmt,doc->cur_bin_num++);
|
||||
st=MStrPrint(fmt,doc->cur_bin_num++);
|
||||
else
|
||||
st=MPrint("$$SP,\"\",BI=%d$$",doc->cur_bin_num++);
|
||||
st=MStrPrint("$$SP,\"\",BI=%d$$",doc->cur_bin_num++);
|
||||
doc_e=DocPrint(doc,"%s",st);
|
||||
Free(st);
|
||||
doc_e->bin_data=tempb;
|
||||
if (doc_e && doc_e->flags1&DOCEF1_TAG && doc_e->tag && *doc_e->tag)
|
||||
if (doc_e && doc_e->de_flags&DOCEF_TAG && doc_e->tag && *doc_e->tag)
|
||||
tempb->tag=StrNew(doc_e->tag,doc->mem_task);
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
@@ -484,11 +479,8 @@ public CDocEntry *DocSprite(CDoc *doc=NULL,U8 *elems,U8 *fmt=NULL)
|
||||
}
|
||||
|
||||
public CDocEntry *Sprite(U8 *elems,U8 *fmt=NULL)
|
||||
{
|
||||
//If you set fmt,
|
||||
//then include dollarsigns ("$$SP ...$$")
|
||||
//and leave a %d for the number.
|
||||
|
||||
{//Put sprite to the command-line, $LK,"DocPut",A="MN:DocPut"$.
|
||||
//If you set fmt, then include dollars ("$$SP ...$$") and leave %d for num.
|
||||
CDoc *doc;
|
||||
if (doc=DocPut)
|
||||
return DocSprite(doc,elems,fmt);
|
||||
|
||||
@@ -0,0 +1,370 @@
|
||||
#help_index "TextBase Layer;Char/TextBase Layer"
|
||||
#help_file "::/Doc/TextBase"
|
||||
|
||||
asm {
|
||||
USE64
|
||||
//************************************
|
||||
_TEXT_CHAR:://Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 d);
|
||||
//Must be called 60fps in Fs->draw_it() callback.
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
MOV RCX,U64 SF_ARG1[RBP]
|
||||
MOV RBX,U64 CTask.scroll_x[RCX]
|
||||
SAR RBX,3
|
||||
ADD RBX,U64 SF_ARG3[RBP]
|
||||
MOV RAX,U64 CTask.scroll_y[RCX]
|
||||
SAR RAX,3
|
||||
ADD RAX,U64 SF_ARG4[RBP]
|
||||
|
||||
TEST U8 SF_ARG2[RBP],0xFF
|
||||
JNZ @@10
|
||||
|
||||
//Border not allowed
|
||||
TEST RBX,RBX //Check X
|
||||
JS @@05
|
||||
ADD RBX,U64 CTask.win_left[RCX]
|
||||
CMP RBX,U64 CTask.win_right[RCX]
|
||||
JG @@05
|
||||
TEST RBX,RBX
|
||||
JS @@05
|
||||
CMP RBX,TEXT_COLS
|
||||
JGE @@05
|
||||
TEST RAX,RAX //Check Y
|
||||
JS @@05
|
||||
ADD RAX,U64 CTask.win_top[RCX]
|
||||
CMP RAX,U64 CTask.win_bottom[RCX]
|
||||
JG @@05
|
||||
TEST RAX,RAX
|
||||
JS @@05
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@05
|
||||
JMP @@15
|
||||
|
||||
@@05: XOR RAX,RAX //return FALSE
|
||||
POP RBP
|
||||
RET1 40
|
||||
|
||||
//Border allowed
|
||||
@@10: MOV RDX,-1 //Check X
|
||||
CMP RBX,RDX
|
||||
JL @@05
|
||||
ADD RBX,U64 CTask.win_left[RCX]
|
||||
MOV RDX,U64 CTask.win_right[RCX]
|
||||
INC RDX
|
||||
CMP RBX,RDX
|
||||
JG @@05
|
||||
TEST RBX,RBX
|
||||
JS @@05
|
||||
CMP RBX,TEXT_COLS
|
||||
JGE @@05
|
||||
MOV RDX,-1 //Check Y
|
||||
CMP RAX,RDX
|
||||
JL @@05
|
||||
ADD RAX,U64 CTask.win_top[RCX]
|
||||
MOV RDX,U64 CTask.win_bottom[RCX]
|
||||
INC RDX
|
||||
CMP RAX,RDX
|
||||
JG @@05
|
||||
TEST RAX,RAX
|
||||
JS @@05
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@05
|
||||
|
||||
@@15: IMUL2 RAX,TEXT_COLS
|
||||
ADD RBX,RAX
|
||||
SHL RBX,2
|
||||
ADD RBX,U64 [&gr.text_base]
|
||||
MOV RAX,U64 SF_ARG5[RBP]
|
||||
MOV U32 [RBX],EAX
|
||||
|
||||
MOV RAX,TRUE
|
||||
POP RBP
|
||||
RET1 40
|
||||
//************************************
|
||||
_TEXT_LEN_STR:://Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s)
|
||||
//Must be called 60fps in Fs->draw_it() callback.
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
MOV RBX,U64 SF_ARG1[RBP]
|
||||
MOV RSI,U64 SF_ARG6[RBP]
|
||||
MOV RDI,U64 CTask.scroll_x[RBX]
|
||||
SAR RDI,3
|
||||
ADD RDI,U64 SF_ARG2[RBP]
|
||||
MOV RCX,U64 SF_ARG4[RBP]
|
||||
|
||||
TEST RDI,RDI
|
||||
JNS @@05
|
||||
ADD RCX,RDI
|
||||
SUB RSI,RDI
|
||||
XOR RDI,RDI
|
||||
@@05: ADD RDI,U64 CTask.win_left[RBX]
|
||||
MOV RDX,RCX
|
||||
ADD RDX,RDI
|
||||
DEC RDX
|
||||
CMP RDX,U64 CTask.win_right[RBX]
|
||||
JLE @@10
|
||||
MOV RAX,RDX
|
||||
SUB RAX,U64 CTask.win_right[RBX]
|
||||
SUB RDX,RAX
|
||||
SUB RCX,RAX
|
||||
@@10: TEST RDI,RDI
|
||||
JNS @@15
|
||||
ADD RCX,RDI
|
||||
SUB RSI,RDI
|
||||
XOR RDI,RDI
|
||||
@@15: INC RDX
|
||||
SUB RDX,TEXT_COLS
|
||||
JLE @@20
|
||||
SUB RCX,RDX
|
||||
@@20: CMP RCX,1
|
||||
JL @@30
|
||||
|
||||
MOV RAX,U64 CTask.scroll_y[RBX]
|
||||
SAR RAX,3
|
||||
ADD RAX,U64 SF_ARG3[RBP]
|
||||
TEST RAX,RAX
|
||||
JS @@30
|
||||
ADD RAX,U64 CTask.win_top[RBX]
|
||||
CMP RAX,U64 CTask.win_bottom[RBX]
|
||||
JG @@30
|
||||
TEST RAX,RAX
|
||||
JS @@30
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@30
|
||||
|
||||
IMUL2 RAX,TEXT_COLS
|
||||
ADD RDI,RAX
|
||||
SHL RDI,2
|
||||
ADD RDI,U64 [&gr.text_base]
|
||||
MOV RAX,U64 SF_ARG5[RBP]
|
||||
@@25: LODSB
|
||||
STOSD
|
||||
DEC RCX
|
||||
JNZ @@25
|
||||
|
||||
POP RDI
|
||||
POP RSI
|
||||
MOV RAX,TRUE
|
||||
POP RBP
|
||||
RET1 48
|
||||
|
||||
@@30: POP RDI
|
||||
POP RSI
|
||||
XOR RAX,RAX
|
||||
POP RBP
|
||||
RET1 48
|
||||
//************************************
|
||||
_TEXT_LEN_ATTR_STR:://Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_attr)
|
||||
//Must be called 60fps in Fs->draw_it() callback.
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
MOV RBX,U64 SF_ARG1[RBP]
|
||||
MOV RSI,U64 SF_ARG5[RBP]
|
||||
MOV RDI,U64 CTask.scroll_x[RBX]
|
||||
SAR RDI,3
|
||||
ADD RDI,U64 SF_ARG2[RBP]
|
||||
MOV RCX,U64 SF_ARG4[RBP]
|
||||
|
||||
TEST RDI,RDI
|
||||
JNS @@05
|
||||
ADD RCX,RDI
|
||||
SHL RDI,2
|
||||
SUB RSI,RDI
|
||||
XOR RDI,RDI
|
||||
@@05: ADD RDI,U64 CTask.win_left[RBX]
|
||||
MOV RDX,RCX
|
||||
ADD RDX,RDI
|
||||
DEC RDX
|
||||
CMP RDX,U64 CTask.win_right[RBX]
|
||||
JLE @@10
|
||||
MOV RAX,RDX
|
||||
SUB RAX,U64 CTask.win_right[RBX]
|
||||
SUB RDX,RAX
|
||||
SUB RCX,RAX
|
||||
@@10: TEST RDI,RDI
|
||||
JNS @@15
|
||||
ADD RCX,RDI
|
||||
SHL RDI,2
|
||||
SUB RSI,RDI
|
||||
XOR RDI,RDI
|
||||
@@15: INC RDX
|
||||
SUB RDX,TEXT_COLS
|
||||
JLE @@20
|
||||
SUB RCX,RDX
|
||||
@@20: CMP RCX,1
|
||||
JL @@30
|
||||
|
||||
MOV RAX,U64 CTask.scroll_y[RBX]
|
||||
SAR RAX,3
|
||||
ADD RAX,U64 SF_ARG3[RBP]
|
||||
TEST RAX,RAX
|
||||
JS @@30
|
||||
ADD RAX,U64 CTask.win_top[RBX]
|
||||
CMP RAX,U64 CTask.win_bottom[RBX]
|
||||
JG @@30
|
||||
TEST RAX,RAX
|
||||
JS @@30
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@30
|
||||
|
||||
IMUL2 RAX,TEXT_COLS
|
||||
ADD RDI,RAX
|
||||
SHL RDI,2
|
||||
ADD RDI,U64 [&gr.text_base]
|
||||
@@25: MOVSD
|
||||
DEC RCX
|
||||
JNZ @@25
|
||||
|
||||
POP RDI
|
||||
POP RSI
|
||||
MOV RAX,TRUE
|
||||
POP RBP
|
||||
RET1 40
|
||||
|
||||
@@30: POP RDI
|
||||
POP RSI
|
||||
XOR RAX,RAX
|
||||
POP RBP
|
||||
RET1 40
|
||||
//************************************
|
||||
_TEXT_LEN_ATTR:://Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr)
|
||||
//Must be called 60fps in Fs->draw_it() callback.
|
||||
PUSH RBP
|
||||
MOV RBP,RSP
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
MOV RBX,U64 SF_ARG1[RBP]
|
||||
MOV RDI,U64 CTask.scroll_x[RBX]
|
||||
SAR RDI,3
|
||||
ADD RDI,U64 SF_ARG2[RBP]
|
||||
MOV RCX,U64 SF_ARG4[RBP]
|
||||
|
||||
TEST RDI,RDI
|
||||
JNS @@05
|
||||
ADD RCX,RDI
|
||||
XOR RDI,RDI
|
||||
@@05: ADD RDI,U64 CTask.win_left[RBX]
|
||||
MOV RDX,RCX
|
||||
ADD RDX,RDI
|
||||
DEC RDX
|
||||
CMP RDX,U64 CTask.win_right[RBX]
|
||||
JLE @@10
|
||||
MOV RAX,RDX
|
||||
SUB RAX,U64 CTask.win_right[RBX]
|
||||
SUB RDX,RAX
|
||||
SUB RCX,RAX
|
||||
@@10: TEST RDI,RDI
|
||||
JNS @@15
|
||||
ADD RCX,RDI
|
||||
XOR RDI,RDI
|
||||
@@15: INC RDX
|
||||
SUB RDX,TEXT_COLS
|
||||
JLE @@20
|
||||
SUB RCX,RDX
|
||||
@@20: CMP RCX,1
|
||||
JL @@35
|
||||
|
||||
MOV RAX,U64 CTask.scroll_y[RBX]
|
||||
SAR RAX,3
|
||||
ADD RAX,U64 SF_ARG3[RBP]
|
||||
TEST RAX,RAX
|
||||
JS @@35
|
||||
ADD RAX,U64 CTask.win_top[RBX]
|
||||
CMP RAX,U64 CTask.win_bottom[RBX]
|
||||
JG @@35
|
||||
TEST RAX,RAX
|
||||
JS @@35
|
||||
CMP RAX,TEXT_ROWS
|
||||
JGE @@35
|
||||
|
||||
IMUL2 RAX,TEXT_COLS
|
||||
ADD RDI,RAX
|
||||
SHL RDI,2
|
||||
ADD RDI,U64 [&gr.text_base]
|
||||
MOV RBX,U64 SF_ARG5[RBP]
|
||||
MOV RSI,RDI
|
||||
@@25: LODSD
|
||||
TEST AL,AL
|
||||
JNZ @@30
|
||||
MOV RAX,RBX
|
||||
STOSD
|
||||
DEC RCX
|
||||
JNZ @@25
|
||||
|
||||
@@30: POP RDI
|
||||
POP RSI
|
||||
MOV RAX,TRUE
|
||||
POP RBP
|
||||
RET1 40
|
||||
|
||||
@@35: POP RDI
|
||||
POP RSI
|
||||
XOR RAX,RAX
|
||||
POP RBP
|
||||
RET1 40
|
||||
}
|
||||
public _extern _TEXT_CHAR Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 d); //Plot char. Must be called 60fps in Fs->draw_it() callback.
|
||||
public _extern _TEXT_LEN_STR Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s); //Plot str with len. Must be called 60fps in Fs->draw_it() callback.
|
||||
public _extern _TEXT_LEN_ATTR_STR Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_attr); //Plot attr str with len. Must be called 60fps in Fs->draw_it() callback.
|
||||
public _extern _TEXT_LEN_ATTR Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr); //Plot attrs with len. Must be called 60fps in Fs->draw_it() callback.
|
||||
|
||||
public U0 TextPrint(CTask *task,I64 x,I64 y,I64 attr,U8 *fmt,...)
|
||||
{//Plot chars. Must be called 60fps in Fs->draw_it() callback.
|
||||
//You probably want $LK,"GrPrint",A="MN:GrPrint"$() or just $LK,"Print",A="MN:Print"$().
|
||||
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||||
TextLenStr(task,x,y,StrLen(buf),attr<<8,buf);
|
||||
Free(buf);
|
||||
}
|
||||
|
||||
public U0 TextBorder(CTask *task=NULL,I64 l,I64 r,I64 t,I64 b,I64 attr,Bool solid)
|
||||
{//Plot border square. Must be called 60fps in Fs->draw_it() callback.
|
||||
//Draws window borders or DolDoc text button borders.
|
||||
//Set task=sys_winmgr_task for no clipping.
|
||||
I64 i;
|
||||
if (!task) task=Fs;
|
||||
attr<<=8;
|
||||
if (solid) {
|
||||
TextChar(task,,l-1,t-1,'É'+attr);
|
||||
TextChar(task,,r+1,t-1,'»'+attr);
|
||||
TextChar(task,,l-1,b+1,'È'+attr);
|
||||
TextChar(task,,r+1,b+1,'¼'+attr);
|
||||
for (i=l;i<=r;i++) {
|
||||
TextChar(task,,i,t-1,'Í'+attr);
|
||||
TextChar(task,,i,b+1,'Í'+attr);
|
||||
}
|
||||
for (i=t;i<=b;i++) {
|
||||
TextChar(task,,l-1,i,'º'+attr);
|
||||
TextChar(task,,r+1,i,'º'+attr);
|
||||
}
|
||||
} else {
|
||||
TextChar(task,,l-1,t-1,'Ú'+attr);
|
||||
TextChar(task,,r+1,t-1,'¿'+attr);
|
||||
TextChar(task,,l-1,b+1,'À'+attr);
|
||||
TextChar(task,,r+1,b+1,'Ù'+attr);
|
||||
for (i=l;i<=r;i++) {
|
||||
TextChar(task,,i,t-1,'Ä'+attr);
|
||||
TextChar(task,,i,b+1,'Ä'+attr);
|
||||
}
|
||||
for (i=t;i<=b;i++) {
|
||||
TextChar(task,,l-1,i,'³'+attr);
|
||||
TextChar(task,,r+1,i,'³'+attr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public U0 TextRect(I64 l,I64 r,I64 t,I64 b,I64 d)
|
||||
{//Fill text rect. Must be called 60fps in Fs->draw_it() callback.
|
||||
I64 y,w;
|
||||
if (l>r || t>b) return;
|
||||
if (t<0) t=0;
|
||||
if (b>=TEXT_ROWS) b=TEXT_ROWS-1;
|
||||
if (l<0) l=0;
|
||||
if (r>=TEXT_COLS) r=TEXT_COLS-1;
|
||||
if (w=r-l+1)
|
||||
for (y=t;y<=b;y++)
|
||||
MemSetU32(gr.text_base(U8 *)+(y*TEXT_COLS+l)*sizeof(U32),d,w);
|
||||
}
|
||||
+65
-76
@@ -10,8 +10,8 @@ public Bool Line(U8 *aux_data,
|
||||
I64 x2,I64 y2,I64 z2,
|
||||
Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),
|
||||
I64 step=1,I64 start=0)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
{//Step through line segment calling callback.
|
||||
//Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
I64 i,j,d,dx=x2-x1,dy=y2-y1,dz=z2-z1,_x,_y,_z,
|
||||
adx=AbsI64(dx),ady=AbsI64(dy),adz=AbsI64(dz);
|
||||
Bool first=TRUE;
|
||||
@@ -81,56 +81,52 @@ public Bool Line(U8 *aux_data,
|
||||
|
||||
#help_index "Graphics/Math/3D Transformation"
|
||||
public I64 *GrRotXNew(F64 è,CTask *mem_task=NULL)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(è)*gr_scale,
|
||||
my_sin=Sin(è)*gr_scale;
|
||||
{//MAlloc 4x4 matrix to rot about X axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(è)*GR_SCALE,
|
||||
my_sin=Sin(è)*GR_SCALE;
|
||||
I64 *r=CAlloc(sizeof(I64)*16,mem_task);
|
||||
|
||||
r[5]=my_cos;
|
||||
r[10]=my_cos;
|
||||
r[9]=my_sin;
|
||||
r[6]=-my_sin;
|
||||
r[0]=gr_scale;
|
||||
r[15]=gr_scale;
|
||||
r[0]=GR_SCALE;
|
||||
r[15]=GR_SCALE;
|
||||
return r;
|
||||
}
|
||||
|
||||
public I64 *GrRotYNew(F64 ê,CTask *mem_task=NULL)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(ê)*gr_scale,
|
||||
my_sin=Sin(ê)*gr_scale;
|
||||
{//MAlloc 4x4 matrix to rot about Y axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(ê)*GR_SCALE,
|
||||
my_sin=Sin(ê)*GR_SCALE;
|
||||
I64 *r=CAlloc(sizeof(I64)*16,mem_task);
|
||||
|
||||
r[0]=my_cos;
|
||||
r[10]=my_cos;
|
||||
r[8]=-my_sin;
|
||||
r[2]=my_sin;
|
||||
r[5]=gr_scale;
|
||||
r[15]=gr_scale;
|
||||
r[5]=GR_SCALE;
|
||||
r[15]=GR_SCALE;
|
||||
return r;
|
||||
}
|
||||
|
||||
public I64 *GrRotZNew(F64 é,CTask *mem_task=NULL)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(é)*gr_scale,
|
||||
my_sin=Sin(é)*gr_scale;
|
||||
{//MAlloc 4x4 matrix to rot about Z axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(é)*GR_SCALE,
|
||||
my_sin=Sin(é)*GR_SCALE;
|
||||
I64 *r=CAlloc(sizeof(I64)*16,mem_task);
|
||||
|
||||
r[0]=my_cos;
|
||||
r[5]=my_cos;
|
||||
r[4]=my_sin;
|
||||
r[1]=-my_sin;
|
||||
r[10]=gr_scale;
|
||||
r[15]=gr_scale;
|
||||
r[10]=GR_SCALE;
|
||||
r[15]=GR_SCALE;
|
||||
return r;
|
||||
}
|
||||
|
||||
public I64 *GrScaleNew(I64 *m1,F64 s,CTask *mem_task=NULL)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
{//MAlloc matrix that is scaled version of a 4x4 matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
I64 i,*r=CAlloc(sizeof(I64)*16,mem_task);
|
||||
for (i=0;i<16;i++)
|
||||
r[i]=m1[i]*s;
|
||||
@@ -138,9 +134,8 @@ public I64 *GrScaleNew(I64 *m1,F64 s,CTask *mem_task=NULL)
|
||||
}
|
||||
|
||||
public I64 *GrMulMat(I64 *m1,I64 *m2,CTask *mem_task=NULL)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
//Conceptually, the transform m1 is applied after m2
|
||||
{//Multiply 4x4 matrices, return MAlloced matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
//Conceptually, the transform m1 is applied after m2
|
||||
I64 i,j,k,*r=CAlloc(sizeof(I64)*16,mem_task);
|
||||
F64 d;
|
||||
for (i=0;i<4;i++) {
|
||||
@@ -148,7 +143,7 @@ public I64 *GrMulMat(I64 *m1,I64 *m2,CTask *mem_task=NULL)
|
||||
for (k=0;k<4;k++) {
|
||||
d=m1[k+4*j];
|
||||
d*=m2[i+4*k]; //TODO! Possible overflow if norm > one.
|
||||
d/=gr_scale;
|
||||
d/=GR_SCALE;
|
||||
r[i+4*j]+=d;
|
||||
}
|
||||
}
|
||||
@@ -157,18 +152,17 @@ public I64 *GrMulMat(I64 *m1,I64 *m2,CTask *mem_task=NULL)
|
||||
}
|
||||
|
||||
public I64 *GrRotXEqu(I64 *m1,F64 è)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(è)*gr_scale,
|
||||
my_sin=Sin(è)*gr_scale;
|
||||
{//Rot matrix about X axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(è)*GR_SCALE,
|
||||
my_sin=Sin(è)*GR_SCALE;
|
||||
I64 r[16],*r2;
|
||||
MemSet(r,0,sizeof(r));
|
||||
r[5]=my_cos;
|
||||
r[10]=my_cos;
|
||||
r[9]=my_sin;
|
||||
r[6]=-my_sin;
|
||||
r[0]=gr_scale;
|
||||
r[15]=gr_scale;
|
||||
r[0]=GR_SCALE;
|
||||
r[15]=GR_SCALE;
|
||||
|
||||
r2=GrMulMat(r,m1);
|
||||
MemCpy(m1,r2,sizeof(I64)*16);
|
||||
@@ -177,18 +171,17 @@ public I64 *GrRotXEqu(I64 *m1,F64
|
||||
}
|
||||
|
||||
public I64 *GrRotYEqu(I64 *m1,F64 ê)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(ê)*gr_scale,
|
||||
my_sin=Sin(ê)*gr_scale;
|
||||
{//Rot matrix about Y axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(ê)*GR_SCALE,
|
||||
my_sin=Sin(ê)*GR_SCALE;
|
||||
I64 r[16],*r2;
|
||||
MemSet(r,0,sizeof(r));
|
||||
r[0]=my_cos;
|
||||
r[10]=my_cos;
|
||||
r[8]=-my_sin;
|
||||
r[2]=my_sin;
|
||||
r[5]=gr_scale;
|
||||
r[15]=gr_scale;
|
||||
r[5]=GR_SCALE;
|
||||
r[15]=GR_SCALE;
|
||||
|
||||
r2=GrMulMat(r,m1);
|
||||
MemCpy(m1,r2,sizeof(I64)*16);
|
||||
@@ -197,18 +190,17 @@ public I64 *GrRotYEqu(I64 *m1,F64
|
||||
}
|
||||
|
||||
public I64 *GrRotZEqu(I64 *m1,F64 é)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(é)*gr_scale,
|
||||
my_sin=Sin(é)*gr_scale;
|
||||
{//Rot matrix about Z axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
F64 my_cos=Cos(é)*GR_SCALE,
|
||||
my_sin=Sin(é)*GR_SCALE;
|
||||
I64 r[16],*r2;
|
||||
MemSet(r,0,sizeof(r));
|
||||
r[0]=my_cos;
|
||||
r[5]=my_cos;
|
||||
r[4]=my_sin;
|
||||
r[1]=-my_sin;
|
||||
r[10]=gr_scale;
|
||||
r[15]=gr_scale;
|
||||
r[10]=GR_SCALE;
|
||||
r[15]=GR_SCALE;
|
||||
|
||||
r2=GrMulMat(r,m1);
|
||||
MemCpy(m1,r2,sizeof(I64)*16);
|
||||
@@ -217,15 +209,15 @@ public I64 *GrRotZEqu(I64 *m1,F64
|
||||
}
|
||||
|
||||
public I64 *GrScaleEqu(I64 *m1,F64 s)
|
||||
{
|
||||
{//Scale 4x4 matrix by value.
|
||||
I64 i;
|
||||
for (i=0;i<16;i++)
|
||||
m1[i]*=s;
|
||||
return m1;
|
||||
}
|
||||
|
||||
public U0 GrScalePenWidth(CDC *dc=gr_dc)
|
||||
{
|
||||
public U0 GrScalePenWidth(CDC *dc=gr.dc)
|
||||
{//Scale device context's pen width by norm of transformation.
|
||||
I64 d;
|
||||
if (dc->flags&DCF_TRANSFORMATION) {
|
||||
if (dc->pen_width) {
|
||||
@@ -238,27 +230,25 @@ public U0 GrScalePenWidth(CDC *dc=gr_dc)
|
||||
}
|
||||
|
||||
public I64 *GrSetTranslation(I64 r[4][4],I64 x,I64 y,I64 z)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
{//Set translation values in 4x4 matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
r[0][3]=x<<32;
|
||||
r[1][3]=y<<32;
|
||||
r[2][3]=z<<32;
|
||||
r[3][3]=gr_scale;
|
||||
r[3][3]=GR_SCALE;
|
||||
return r;
|
||||
}
|
||||
|
||||
public I64 *GrAddTranslation(I64 r[4][4],I64 x,I64 y,I64 z)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
{//Add translation to 4x4 matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
r[0][3]+=x<<32;
|
||||
r[1][3]+=y<<32;
|
||||
r[2][3]+=z<<32;
|
||||
r[3][3]=gr_scale;
|
||||
r[3][3]=GR_SCALE;
|
||||
return r;
|
||||
}
|
||||
|
||||
public Bool GrSetSymmetry(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2)
|
||||
{
|
||||
public Bool GrSetSymmetry(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2)
|
||||
{//2D. Set device context's symmetry.
|
||||
F64 d;
|
||||
if (y1==y2 && x1==x2)
|
||||
return FALSE;
|
||||
@@ -268,7 +258,7 @@ public Bool GrSetSymmetry(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2)
|
||||
if (d=Sqrt(SqrI64(dc->sym.snx)+
|
||||
SqrI64(dc->sym.sny)+
|
||||
SqrI64(dc->sym.snz))) {
|
||||
d=gr_scale/d;
|
||||
d=GR_SCALE/d;
|
||||
dc->sym.snx *= d;
|
||||
dc->sym.sny *= d;
|
||||
dc->sym.snz *= d;
|
||||
@@ -279,8 +269,8 @@ public Bool GrSetSymmetry(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public Bool GrSetSymmetry3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 x3,I64 y3,I64 z3)
|
||||
{
|
||||
public Bool GrSetSymmetry3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 x3,I64 y3,I64 z3)
|
||||
{//3D. Set device context's symmetry.
|
||||
F64 d,x,y,z,xx,yy,zz;
|
||||
I64 xx1,yy1,zz1,xx2,yy2,zz2,*r;
|
||||
xx1=x1-x2; yy1=y1-y2; zz1=z1-z2;
|
||||
@@ -301,7 +291,7 @@ public Bool GrSetSymmetry3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64
|
||||
x=xx; y=yy; z=zz;
|
||||
}
|
||||
if (d=Sqrt(Sqr(x)+Sqr(y)+Sqr(z))) {
|
||||
d=gr_scale/d;
|
||||
d=GR_SCALE/d;
|
||||
dc->sym.snx = d*x;
|
||||
dc->sym.sny = d*y;
|
||||
dc->sym.snz = d*z;
|
||||
@@ -315,8 +305,7 @@ public Bool GrSetSymmetry3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64
|
||||
}
|
||||
|
||||
public U0 GrReflect(CDC *dc,I64 *_x,I64 *_y,I64 *_z)
|
||||
{
|
||||
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
{//Reflect 3D point about device context's symmetry. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
|
||||
I64 x=*_x<<32,y=*_y<<32,z=*_z<<32,
|
||||
xx=*_x-dc->sym.sx,yy=*_y-dc->sym.sy,zz=*_z-dc->sym.sz,
|
||||
d=(xx*dc->sym.snx+yy*dc->sym.sny+zz*dc->sym.snz)>>16,
|
||||
@@ -352,7 +341,7 @@ public Bool Circle(U8 *aux_data,
|
||||
I64 step=1,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
{//Step through circle arc calling callback.
|
||||
I64 i,j,len=Ceil(len_radians*radius),
|
||||
x,y,x1,y1,s1,s2,c;
|
||||
F64 t;
|
||||
@@ -396,7 +385,7 @@ public Bool Ellipse(U8 *aux_data,
|
||||
I64 step=1,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
{//Step through ellipse arc calling callback.
|
||||
I64 i,j,len,
|
||||
x,y,_x,_y,x1,y1,x2,y2, s1,s2,c, s12,s22,c2;
|
||||
F64 t;
|
||||
@@ -468,7 +457,7 @@ public Bool RegPoly(U8 *aux_data,
|
||||
I64 step=1,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
{//Step through regular polygon calling callback.
|
||||
I64 i,n,x,y,x1,y1,x2,y2,
|
||||
xx1,yy1,xx2,yy2,
|
||||
s1,s2,c, s12,s22,c2;
|
||||
@@ -523,30 +512,30 @@ public Bool RegPoly(U8 *aux_data,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#help_index "Graphics/CD3I32;Math/CD3I32"
|
||||
#help_index "Graphics/Data Types;Math/Data Types"
|
||||
public F64 D3I32Dist(CD3I32 *p1,CD3I32 *p2)
|
||||
{
|
||||
{//Dist between p1 and p2.
|
||||
return Sqrt(SqrI64(p1->x-p2->x)+SqrI64(p1->y-p2->y)+SqrI64(p1->z-p2->z));
|
||||
}
|
||||
|
||||
public I64 D3I32SqrDist(CD3I32 *p1,CD3I32 *p2)
|
||||
{
|
||||
public I64 D3I32DistSqr(CD3I32 *p1,CD3I32 *p2)
|
||||
{//Dist Squared between p1 and p2.
|
||||
return SqrI64(p1->x-p2->x)+SqrI64(p1->y-p2->y)+SqrI64(p1->z-p2->z);
|
||||
}
|
||||
|
||||
public F64 D3I32Norm(CD3I32 *p)
|
||||
{
|
||||
{//Norm of p.
|
||||
return Sqrt(SqrI64(p->x)+SqrI64(p->y)+SqrI64(p->z));
|
||||
}
|
||||
|
||||
public I64 D3I32SqrNorm(CD3I32 *p)
|
||||
{
|
||||
public I64 D3I32NormSqr(CD3I32 *p)
|
||||
{//Norm Squared of p.
|
||||
return SqrI64(p->x)+SqrI64(p->y)+SqrI64(p->z);
|
||||
}
|
||||
|
||||
#help_index "Graphics/Math"
|
||||
public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE)
|
||||
{//2nd order
|
||||
{//Go in 2nd order bezier calling callback.
|
||||
I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max;
|
||||
F64 x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z,
|
||||
x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0,
|
||||
@@ -590,7 +579,7 @@ public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64
|
||||
}
|
||||
|
||||
public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE)
|
||||
{ //3rd order
|
||||
{//Go in 3rd order bezier calling callback.
|
||||
I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max;
|
||||
F64 x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z,
|
||||
x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0,
|
||||
@@ -638,7 +627,7 @@ public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64
|
||||
}
|
||||
|
||||
public Bool BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE)
|
||||
{ //2nd order
|
||||
{//Go in 2nd order spline calling callback.
|
||||
I64 i,j;
|
||||
CD3I32 *c;
|
||||
Bool first;
|
||||
@@ -704,7 +693,7 @@ public Bool BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I
|
||||
}
|
||||
|
||||
public Bool BSpline3(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE)
|
||||
{ //3rd order
|
||||
{//Go in 3rd order spline calling callback.
|
||||
I64 i,j;
|
||||
F64 x,y,z;
|
||||
CD3I32 *c;
|
||||
@@ -798,7 +787,7 @@ public Bool BSpline3(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I
|
||||
#define CC_BOTTOM 8
|
||||
|
||||
public Bool ClipLine(I64 *_x1,I64 *_y1,I64 *_x2,I64 *_y2,I64 left,I64 top,I64 right,I64 bottom)
|
||||
{
|
||||
{//Clip x1,y1 x2,y2 with left,top,right,bottom.
|
||||
I64 x,y,x1=*_x1,y1=*_y1,x2=*_x2,y2=*_y2,
|
||||
cc,cc1,cc2;
|
||||
if (y1>bottom)
|
||||
|
||||
+251
-252
@@ -1,33 +1,33 @@
|
||||
#help_index "Graphics/Sprite"
|
||||
|
||||
#define GEBM_EXIT 0
|
||||
#define GEBM_MAIN_MENU 1
|
||||
#define GEBM_COLOR 2
|
||||
#define GEBM_DITHER_COLOR 3
|
||||
#define GEBM_WIDTH 4
|
||||
#define GEBM_PT 5
|
||||
#define GEBM_LINE 6
|
||||
#define GEBM_ARROW 7
|
||||
#define GEBM_RECT 8
|
||||
#define GEBM_CIRCLE 9
|
||||
#define GEBM_TEXT 10
|
||||
#define GEBM_TEXT_BOX 11
|
||||
#define GEBM_TEXT_DIAMOND 12
|
||||
#define GEBM_FLOOD_FILL 13
|
||||
#define GEBM_FLOOD_FILL_NOT 14
|
||||
#define GEBM_POLYLINE 15
|
||||
#define GEBM_POLYPT 16
|
||||
#define GEBM_COPY 17
|
||||
#define GEBM_DELETE 18
|
||||
#define GEBM_PASTE 19
|
||||
#define GEBM_PASTE_TRANSPARENT 20
|
||||
#define GEBM_FIND_AND_REPLACE 21
|
||||
#define GEBM_TRIM_TO_EXTENTS 22
|
||||
#define GEBM_ADD_OUTLINE 23
|
||||
#define GEBM_ETCH 24
|
||||
#define GEBM_UNDO 25
|
||||
#define GEBM_SAVE_BMP 26
|
||||
#define GEBM_SAVE_GRA 27
|
||||
#define GBM_EXIT 0
|
||||
#define GBM_MAIN_MENU 1
|
||||
#define GBM_COLOR 2
|
||||
#define GBM_DITHER_COLOR 3
|
||||
#define GBM_WIDTH 4
|
||||
#define GBM_PT 5
|
||||
#define GBM_LINE 6
|
||||
#define GBM_ARROW 7
|
||||
#define GBM_RECT 8
|
||||
#define GBM_CIRCLE 9
|
||||
#define GBM_TEXT 10
|
||||
#define GBM_TEXT_BOX 11
|
||||
#define GBM_TEXT_DIAMOND 12
|
||||
#define GBM_FLOOD_FILL 13
|
||||
#define GBM_FLOOD_FILL_NOT 14
|
||||
#define GBM_POLYLINE 15
|
||||
#define GBM_POLYPT 16
|
||||
#define GBM_COPY 17
|
||||
#define GBM_DELETE 18
|
||||
#define GBM_PASTE 19
|
||||
#define GBM_PASTE_TRANSPARENT 20
|
||||
#define GBM_FIND_AND_REPLACE 21
|
||||
#define GBM_TRIM_TO_EXTENTS 22
|
||||
#define GBM_ADD_OUTLINE 23
|
||||
#define GBM_ETCH 24
|
||||
#define GBM_UNDO 25
|
||||
#define GBM_SAVE_BMP 26
|
||||
#define GBM_SAVE_GRA 27
|
||||
|
||||
U0 GrInit4()
|
||||
{
|
||||
@@ -46,7 +46,7 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width)
|
||||
U8 *st1,*st2,buf[136];
|
||||
CDoc *doc=DocNew;
|
||||
|
||||
Color2Text(buf,color);
|
||||
Color2Str(buf,color);
|
||||
if (color&ROPF_DITHER) {
|
||||
st1="";
|
||||
st2=buf;
|
||||
@@ -57,34 +57,34 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width)
|
||||
|
||||
DocPrint(doc,"$$PURPLE$$$$TX+CX,\"Sprite BitMap Menu\"$$\n"
|
||||
"$$LK+PU+CX,\"Click for Help\",A=\"FI:::/Doc/SpriteBitMap.TXT.Z\"$$\n"
|
||||
"\n$$LTBLUE$$$$MU-UL,\"Color %s\",LE=GEBM_COLOR$$\n"
|
||||
"$$MU-UL,\"Dither Color %s\",LE=GEBM_DITHER_COLOR$$\n"
|
||||
"$$MU-UL,\"Width %d\",LE=GEBM_WIDTH$$\n"
|
||||
"$$MU-UL,\"Find & Replace Color\",LE=GEBM_FIND_AND_REPLACE$$\n"
|
||||
"$$MU-UL,\"Trim to Extents\",LE=GEBM_TRIM_TO_EXTENTS$$\n"
|
||||
"$$MU-UL,\"Add Outline\",LE=GEBM_ADD_OUTLINE$$\n"
|
||||
"$$MU-UL,\"Etch\",LE=GEBM_ETCH$$\n"
|
||||
"\n$$MU-UL,\"Point\",LE=GEBM_PT$$\n"
|
||||
"$$MU-UL,\"Line\",LE=GEBM_LINE$$\n"
|
||||
"$$MU-UL,\"Arrow\",LE=GEBM_ARROW$$\n"
|
||||
"$$MU-UL,\"Rect\",LE=GEBM_RECT$$\n"
|
||||
"$$MU-UL,\"Circle\",LE=GEBM_CIRCLE$$\n"
|
||||
"$$MU-UL,\"Text\",LE=GEBM_TEXT$$\n"
|
||||
"$$MU-UL,\"Text Box\",LE=GEBM_TEXT_BOX$$\n"
|
||||
"$$MU-UL,\"Text Diamond\",LE=GEBM_TEXT_DIAMOND$$\n"
|
||||
"$$MU-UL,\"Flood Fill\",LE=GEBM_FLOOD_FILL$$\n"
|
||||
"$$MU-UL,\"Flood Fill Not Color\",LE=GEBM_FLOOD_FILL_NOT$$\n"
|
||||
"$$MU-UL,\"PolyLine\",LE=GEBM_POLYLINE$$\n"
|
||||
"$$MU-UL,\"PolyPoint\",LE=GEBM_POLYPT$$\n"
|
||||
"\n$$MU-UL,\"Copy to Clipboard\",LE=GEBM_COPY$$\n"
|
||||
"$$MU-UL,\"Delete to Clipboard\",LE=GEBM_DELETE$$\n"
|
||||
"$$MU-UL,\"Paste Clipboard\",LE=GEBM_PASTE$$\n"
|
||||
"$$MU-UL,\"Paste Transparent Clipboard\",LE=GEBM_PASTE_TRANSPARENT$$\n"
|
||||
"\n$$MU-UL,\"Save BMP File\",LE=GEBM_SAVE_BMP$$\n"
|
||||
"$$MU-UL,\"Save GRA File\",LE=GEBM_SAVE_GRA$$\n"
|
||||
"\n$$MU-UL,\"Undo\",LE=GEBM_UNDO$$\n"
|
||||
"\n$$PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",LE=GEBM_MAIN_MENU$$$$LTBLUE$$\n"
|
||||
"$$MU-UL,\"Exit Sprite\",LE=GEBM_EXIT$$\n"
|
||||
"\n$$LTBLUE$$$$MU-UL,\"Color %s\",LE=GBM_COLOR$$\n"
|
||||
"$$MU-UL,\"Dither Color %s\",LE=GBM_DITHER_COLOR$$\n"
|
||||
"$$MU-UL,\"Width %d\",LE=GBM_WIDTH$$\n"
|
||||
"$$MU-UL,\"Find & Replace Color\",LE=GBM_FIND_AND_REPLACE$$\n"
|
||||
"$$MU-UL,\"Trim to Extents\",LE=GBM_TRIM_TO_EXTENTS$$\n"
|
||||
"$$MU-UL,\"Add Outline\",LE=GBM_ADD_OUTLINE$$\n"
|
||||
"$$MU-UL,\"Etch\",LE=GBM_ETCH$$\n"
|
||||
"\n$$MU-UL,\"Point\",LE=GBM_PT$$\n"
|
||||
"$$MU-UL,\"Line\",LE=GBM_LINE$$\n"
|
||||
"$$MU-UL,\"Arrow\",LE=GBM_ARROW$$\n"
|
||||
"$$MU-UL,\"Rect\",LE=GBM_RECT$$\n"
|
||||
"$$MU-UL,\"Circle\",LE=GBM_CIRCLE$$\n"
|
||||
"$$MU-UL,\"Text\",LE=GBM_TEXT$$\n"
|
||||
"$$MU-UL,\"Text Box\",LE=GBM_TEXT_BOX$$\n"
|
||||
"$$MU-UL,\"Text Diamond\",LE=GBM_TEXT_DIAMOND$$\n"
|
||||
"$$MU-UL,\"Flood Fill\",LE=GBM_FLOOD_FILL$$\n"
|
||||
"$$MU-UL,\"Flood Fill Not Color\",LE=GBM_FLOOD_FILL_NOT$$\n"
|
||||
"$$MU-UL,\"PolyLine\",LE=GBM_POLYLINE$$\n"
|
||||
"$$MU-UL,\"PolyPoint\",LE=GBM_POLYPT$$\n"
|
||||
"\n$$MU-UL,\"Copy to Clipboard\",LE=GBM_COPY$$\n"
|
||||
"$$MU-UL,\"Delete to Clipboard\",LE=GBM_DELETE$$\n"
|
||||
"$$MU-UL,\"Paste Clipboard\",LE=GBM_PASTE$$\n"
|
||||
"$$MU-UL,\"Paste Transparent Clipboard\",LE=GBM_PASTE_TRANSPARENT$$\n"
|
||||
"\n$$MU-UL,\"Save BMP File\",LE=GBM_SAVE_BMP$$\n"
|
||||
"$$MU-UL,\"Save GRA File\",LE=GBM_SAVE_GRA$$\n"
|
||||
"\n$$MU-UL,\"Undo\",LE=GBM_UNDO$$\n"
|
||||
"\n$$PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",LE=GBM_MAIN_MENU$$$$LTBLUE$$\n"
|
||||
"$$MU-UL,\"Exit Sprite\",LE=GBM_EXIT$$\n"
|
||||
"$$MU-UL,\"Abort Sprite\",LE=DOCM_CANCEL$$\n",st1,st2,width);
|
||||
DocPrint(doc,"\nRight-Click to get back to this menu.");
|
||||
i=PopUpMenu(doc);
|
||||
@@ -92,13 +92,13 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width)
|
||||
return i;
|
||||
}
|
||||
|
||||
U0 GrBMEdPrepPersistentDC(CDC *dc,I64 xx1,I64 yy1,CDC *img)
|
||||
U0 GrBitMapEdPrepPersistentDC(CDC *dc,I64 xx1,I64 yy1,CDC *img)
|
||||
{
|
||||
DCFill(dc);
|
||||
GrBlot(dc,xx1,yy1,img);
|
||||
}
|
||||
|
||||
U0 GrBMETrimToExtents(CDC **_img,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CColorROPU32 bkcolor)
|
||||
U0 GrBitMapEdTrimToExtents(CDC **_img,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CColorROPU32 bkcolor)
|
||||
{
|
||||
CDC *img=*_img;
|
||||
I64 i,c,
|
||||
@@ -106,7 +106,7 @@ U0 GrBMETrimToExtents(CDC **_img,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CColorR
|
||||
while (y1<y2) {
|
||||
for (i=x1;i<=x2;i++) {
|
||||
c=GrPeek(img,i,y1);
|
||||
if (c!=bkcolor&&c!=COLOR_TRANSPARENT) goto tr_y2;
|
||||
if (c!=bkcolor&&c!=TRANSPARENT) goto tr_y2;
|
||||
}
|
||||
y1++;
|
||||
}
|
||||
@@ -115,7 +115,7 @@ tr_y2:
|
||||
while (y1<y2) {
|
||||
for (i=x1;i<=x2;i++) {
|
||||
c=GrPeek(img,i,y2);
|
||||
if (c!=bkcolor&&c!=COLOR_TRANSPARENT) goto tr_x1;
|
||||
if (c!=bkcolor&&c!=TRANSPARENT) goto tr_x1;
|
||||
}
|
||||
y2--;
|
||||
}
|
||||
@@ -124,7 +124,7 @@ tr_x1:
|
||||
while (x1<x2) {
|
||||
for (i=y1;i<=y2;i++) {
|
||||
c=GrPeek(img,x1,i);
|
||||
if (c!=bkcolor&&c!=COLOR_TRANSPARENT) goto tr_x2;
|
||||
if (c!=bkcolor&&c!=TRANSPARENT) goto tr_x2;
|
||||
}
|
||||
x1++;
|
||||
}
|
||||
@@ -133,7 +133,7 @@ tr_x2:
|
||||
while (x1<x2) {
|
||||
for (i=y1;i<=y2;i++) {
|
||||
c=GrPeek(img,x2,i);
|
||||
if (c!=bkcolor&&c!=COLOR_TRANSPARENT) goto tr_done;
|
||||
if (c!=bkcolor&&c!=TRANSPARENT) goto tr_done;
|
||||
}
|
||||
x2--;
|
||||
}
|
||||
@@ -145,8 +145,7 @@ tr_done:
|
||||
DCDel(img);
|
||||
}
|
||||
|
||||
|
||||
U0 GrBMEAddOutline(CDC *img,I64 width,CColorROPU32 color,CColorROPU32 bkcolor)
|
||||
U0 GrBitMapEdAddOutline(CDC *img,I64 width,CColorROPU32 color,CColorROPU32 bkcolor)
|
||||
{
|
||||
I64 i,j,k,c;
|
||||
CColorROPU32 old_color;
|
||||
@@ -172,7 +171,7 @@ U0 GrBMEAddOutline(CDC *img,I64 width,CColorROPU32 color,CColorROPU32 bkcolor)
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrBMEEtch(CDC *img,I64 width,CColorROPU32 bkcolor)
|
||||
U0 GrBitMapEdEtch(CDC *img,I64 width,CColorROPU32 bkcolor)
|
||||
{
|
||||
I64 i,j,k,c;
|
||||
CColorROPU32 old_color;
|
||||
@@ -198,11 +197,11 @@ U0 GrBMEEtch(CDC *img,I64 width,CColorROPU32 bkcolor)
|
||||
}
|
||||
}
|
||||
|
||||
I64 SpriteBitMap(CDoc *,CDocEntry *doc_e,CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CDC **_img,CColorROPU32 bkcolor)
|
||||
I64 SpriteBitMapEd(CDoc *,CDocEntry *doc_e,CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CDC **_img,CColorROPU32 bkcolor)
|
||||
{
|
||||
I64 i,j,mode=GEBM_LINE,color=BLACK,width=1,msg_code,p1,p2,x1,y1,x11,y11,x22,y22,
|
||||
I64 i,j,mode=GBM_LINE,color=BLACK,width=1,msg_code,a1,a2,x1,y1,x11,y11,x22,y22,
|
||||
result,xx1=*_xx1,yy1=*_yy1,xx2=*_xx2,yy2=*_yy2,
|
||||
old_e_flags1=doc_e->flags1;
|
||||
old_de_flags=doc_e->de_flags;
|
||||
Bool down=FALSE;
|
||||
U8 *st=NULL;
|
||||
CEdFileName filename;
|
||||
@@ -210,25 +209,25 @@ I64 SpriteBitMap(CDoc *,CDocEntry *doc_e,CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I
|
||||
*clipboard=NULL,*undo=NULL,*dc2;
|
||||
SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$
|
||||
|
||||
doc_e->flags1|=DOCEF1_DONT_DRAW;
|
||||
doc_e->de_flags|=DOCEF_DONT_DRAW;
|
||||
goto bm_menu;
|
||||
|
||||
while (TRUE) {
|
||||
if (sys_cur_scan_code&SCF_CTRL)//grab scroll update?
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (kbd.scan_code&SCF_CTRL)//grab scroll update?
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
|
||||
dc->color=ROPF_DITHER+WHITE<<16+BLACK;
|
||||
dc->pen_width=1;
|
||||
GrLineRect4(dc,xx1-1,yy1-1,xx2,yy2);//This is done little bit too often.
|
||||
GrBorder(dc,xx1-1,yy1-1,xx2,yy2);//This is done little bit too often.
|
||||
|
||||
while (msg_code=ScanMsg(&p1,&p2,1<<MSG_IP_L_DOWN|1<<MSG_IP_L_UP|1<<MSG_IP_R_DOWN|
|
||||
while (msg_code=ScanMsg(&a1,&a2,1<<MSG_IP_L_DOWN|1<<MSG_IP_L_UP|1<<MSG_IP_R_DOWN|
|
||||
1<<MSG_IP_MOVE|1<<MSG_KEY_DOWN)) {
|
||||
switch (msg_code) {
|
||||
case MSG_KEY_DOWN:
|
||||
if (p1==CH_SHIFT_ESC) {
|
||||
if (a1==CH_SHIFT_ESC) {
|
||||
result=GE_ABORT;
|
||||
goto bm_key_up_done;
|
||||
} else if (p1==CH_ESC) {
|
||||
} else if (a1==CH_ESC) {
|
||||
result=GE_CONT;
|
||||
goto bm_key_up_done;
|
||||
}
|
||||
@@ -245,73 +244,73 @@ bm_menu:
|
||||
case DOCM_CANCEL:
|
||||
result=GE_ABORT;
|
||||
goto bm_done;
|
||||
case GEBM_EXIT:
|
||||
case GBM_EXIT:
|
||||
result=GE_EXIT;
|
||||
goto bm_done;
|
||||
case GEBM_MAIN_MENU:
|
||||
case GBM_MAIN_MENU:
|
||||
result=GE_CONT;
|
||||
goto bm_done;
|
||||
|
||||
case GEBM_COLOR:
|
||||
case GBM_COLOR:
|
||||
i=PopUpColor(,,FALSE);
|
||||
if (i>=0) color=i;
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_FIND_AND_REPLACE:
|
||||
case GBM_FIND_AND_REPLACE:
|
||||
i=PopUpColor("Find Color\n",,FALSE);
|
||||
if (i>=0) {
|
||||
j=PopUpColor("Replace Color\n",,FALSE);
|
||||
if (j>=0) {
|
||||
DCColorChg(img,i,j);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
}
|
||||
}
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_TRIM_TO_EXTENTS:
|
||||
GrBMETrimToExtents(&img,&xx1,&yy1,&xx2,&yy2,bkcolor);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
case GBM_TRIM_TO_EXTENTS:
|
||||
GrBitMapEdTrimToExtents(&img,&xx1,&yy1,&xx2,&yy2,bkcolor);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_ADD_OUTLINE:
|
||||
case GBM_ADD_OUTLINE:
|
||||
i=PopUpRangeI64(1,16,1,"Outline Width\n");
|
||||
if (i>=0) {
|
||||
GrBMEAddOutline(img,i,color,bkcolor);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrBitMapEdAddOutline(img,i,color,bkcolor);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
}
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_ETCH:
|
||||
case GBM_ETCH:
|
||||
i=PopUpRangeI64(1,16,1,"Etch Width\n");
|
||||
if (i>=0) {
|
||||
GrBMEEtch(img,i,bkcolor);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrBitMapEdEtch(img,i,bkcolor);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
}
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_SAVE_BMP:
|
||||
case GBM_SAVE_BMP:
|
||||
*filename.name=0;
|
||||
if (DocFormDo(&filename) && *filename.name)
|
||||
BMPFileWrite(filename.name,img);
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_SAVE_GRA:
|
||||
case GBM_SAVE_GRA:
|
||||
*filename.name=0;
|
||||
if (DocFormDo(&filename) && *filename.name)
|
||||
GRAWrite(filename.name,img);
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_DITHER_COLOR:
|
||||
case GBM_DITHER_COLOR:
|
||||
i=PopUpColorDither;
|
||||
if (i>=0) color=i;
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_WIDTH:
|
||||
case GBM_WIDTH:
|
||||
i=PopUpRangeI64(1,16,1,"Pen Width\n");
|
||||
if (i>=0) width=i;
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_UNDO:
|
||||
case GBM_UNDO:
|
||||
if (undo) {
|
||||
Beep;
|
||||
img->color=ROP_EQU;
|
||||
@@ -321,27 +320,27 @@ bm_menu:
|
||||
}
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_PT:
|
||||
case GEBM_LINE:
|
||||
case GEBM_ARROW:
|
||||
case GEBM_RECT:
|
||||
case GEBM_CIRCLE:
|
||||
case GEBM_FLOOD_FILL:
|
||||
case GEBM_FLOOD_FILL_NOT:
|
||||
case GEBM_POLYPT:
|
||||
case GEBM_POLYLINE:
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
case GEBM_PASTE:
|
||||
case GEBM_PASTE_TRANSPARENT:
|
||||
case GBM_PT:
|
||||
case GBM_LINE:
|
||||
case GBM_ARROW:
|
||||
case GBM_RECT:
|
||||
case GBM_CIRCLE:
|
||||
case GBM_FLOOD_FILL:
|
||||
case GBM_FLOOD_FILL_NOT:
|
||||
case GBM_POLYPT:
|
||||
case GBM_POLYLINE:
|
||||
case GBM_COPY:
|
||||
case GBM_DELETE:
|
||||
case GBM_PASTE:
|
||||
case GBM_PASTE_TRANSPARENT:
|
||||
mode=i;
|
||||
break;
|
||||
|
||||
case GEBM_TEXT:
|
||||
case GEBM_TEXT_BOX:
|
||||
case GEBM_TEXT_DIAMOND:
|
||||
case GBM_TEXT:
|
||||
case GBM_TEXT_BOX:
|
||||
case GBM_TEXT_DIAMOND:
|
||||
Free(st);
|
||||
st=PopUpMGetS("Enter text and press <ESC>.\n");
|
||||
st=PopUpGetStr("Enter text and press <ESC>.\n");
|
||||
if (st && *st)
|
||||
mode=i;
|
||||
else
|
||||
@@ -353,316 +352,316 @@ bm_menu:
|
||||
undo=DCExtract(img,0,0,img->width-1,img->height-1);
|
||||
undo->bkcolor=bkcolor;
|
||||
WinMgrSync(2,TRUE); //Let popup close
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
down=FALSE;
|
||||
break;
|
||||
case MSG_IP_L_DOWN:
|
||||
switch (mode) {
|
||||
case GEBM_PT:
|
||||
case GBM_PT:
|
||||
img->color=color;
|
||||
img->pen_width=width;
|
||||
GrPlot3(img,p1-xx1,p2-yy1,0);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrPlot3(img,a1-xx1,a2-yy1,0);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
break;
|
||||
case GEBM_LINE:
|
||||
case GEBM_ARROW:
|
||||
case GEBM_RECT:
|
||||
case GEBM_CIRCLE:
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
case GBM_LINE:
|
||||
case GBM_ARROW:
|
||||
case GBM_RECT:
|
||||
case GBM_CIRCLE:
|
||||
case GBM_COPY:
|
||||
case GBM_DELETE:
|
||||
if (down)
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
x1=p1; y1=p2;
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
x1=a1; y1=a2;
|
||||
down=TRUE;
|
||||
dc->color=color;
|
||||
dc->pen_width=width;
|
||||
switch (mode) {
|
||||
case GEBM_LINE:
|
||||
GrLine3(dc,x1,y1,0,p1,p2,0);
|
||||
case GBM_LINE:
|
||||
GrLine3(dc,x1,y1,0,a1,a2,0);
|
||||
break;
|
||||
case GEBM_ARROW:
|
||||
GrArrow3(dc,x1,y1,0,p1,p2,0);
|
||||
case GBM_ARROW:
|
||||
GrArrow3(dc,x1,y1,0,a1,a2,0);
|
||||
break;
|
||||
case GEBM_RECT:
|
||||
case GBM_RECT:
|
||||
GrRect(dc,x1,y1,1,1);
|
||||
break;
|
||||
case GEBM_CIRCLE:
|
||||
case GBM_CIRCLE:
|
||||
GrCircle3(dc,x1,y1,0,1);
|
||||
break;
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
case GBM_COPY:
|
||||
case GBM_DELETE:
|
||||
dc->color=ROPF_DITHER+WHITE<<16+BLACK;
|
||||
dc->pen_width=1;
|
||||
GrLineRect4(dc,x1,y1,x1,y1);
|
||||
GrBorder(dc,x1,y1,x1,y1);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case GEBM_PASTE:
|
||||
case GEBM_PASTE_TRANSPARENT:
|
||||
case GBM_PASTE:
|
||||
case GBM_PASTE_TRANSPARENT:
|
||||
if (clipboard) {
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (mode==GEBM_PASTE) {
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (mode==GBM_PASTE) {
|
||||
clipboard->flags|=DCF_NO_TRANSPARENTS;
|
||||
GrBlot(dc,p1,p2,clipboard);
|
||||
GrBlot(dc,a1,a2,clipboard);
|
||||
clipboard->flags&=~DCF_NO_TRANSPARENTS;
|
||||
} else {
|
||||
dc2=DCCopy(clipboard);
|
||||
DCColorChg(dc2,bkcolor);
|
||||
GrBlot(dc,p1,p2,dc2);
|
||||
GrBlot(dc,a1,a2,dc2);
|
||||
DCDel(dc2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GEBM_TEXT:
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
case GBM_TEXT:
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
dc->color=color;
|
||||
GrPrint(dc,p1,p2,"%s",st);
|
||||
GrPrint(dc,a1,a2,"%s",st);
|
||||
break;
|
||||
case GEBM_TEXT_BOX:
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
case GBM_TEXT_BOX:
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
dc->color=color;
|
||||
GrTextBox3(dc,p1,p2,0,st);
|
||||
GrTextBox3(dc,a1,a2,0,st);
|
||||
break;
|
||||
case GEBM_TEXT_DIAMOND:
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
case GBM_TEXT_DIAMOND:
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
dc->color=color;
|
||||
GrTextDiamond3(dc,p1,p2,0,st);
|
||||
GrTextDiamond3(dc,a1,a2,0,st);
|
||||
break;
|
||||
case GEBM_FLOOD_FILL:
|
||||
case GBM_FLOOD_FILL:
|
||||
img->color=color;
|
||||
GrFloodFill(img,p1-xx1,p2-yy1);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrFloodFill(img,a1-xx1,a2-yy1);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
break;
|
||||
case GEBM_FLOOD_FILL_NOT:
|
||||
case GBM_FLOOD_FILL_NOT:
|
||||
img->color=color;
|
||||
GrFloodFill(img,p1-xx1,p2-yy1,TRUE);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrFloodFill(img,a1-xx1,a2-yy1,TRUE);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
break;
|
||||
case GEBM_POLYLINE:
|
||||
case GBM_POLYLINE:
|
||||
if (!down) {
|
||||
x1=p1; y1=p2;
|
||||
x1=a1; y1=a2;
|
||||
down=TRUE;
|
||||
dc->color=color;
|
||||
dc->pen_width=width;
|
||||
GrLine3(dc,x1,y1,0,p1,p2,0);
|
||||
GrLine3(dc,x1,y1,0,a1,a2,0);
|
||||
}
|
||||
break;
|
||||
case GEBM_POLYPT:
|
||||
x1=p1; y1=p2;
|
||||
case GBM_POLYPT:
|
||||
x1=a1; y1=a2;
|
||||
down=TRUE;
|
||||
img->color=color;
|
||||
img->pen_width=width;
|
||||
GrLine3(img,x1-xx1,y1-yy1,0,p1-xx1,p2-yy1,0);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrLine3(img,x1-xx1,y1-yy1,0,a1-xx1,a2-yy1,0);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MSG_IP_MOVE:
|
||||
switch (mode) {
|
||||
case GEBM_LINE:
|
||||
case GEBM_ARROW:
|
||||
case GEBM_POLYLINE:
|
||||
case GBM_LINE:
|
||||
case GBM_ARROW:
|
||||
case GBM_POLYLINE:
|
||||
if (down) {
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
dc->color=color;
|
||||
dc->pen_width=width;
|
||||
if (mode==GEBM_ARROW)
|
||||
GrArrow3(dc,x1,y1,0,p1,p2,0);
|
||||
if (mode==GBM_ARROW)
|
||||
GrArrow3(dc,x1,y1,0,a1,a2,0);
|
||||
else
|
||||
GrLine3(dc,x1,y1,0,p1,p2,0);
|
||||
GrLine3(dc,x1,y1,0,a1,a2,0);
|
||||
}
|
||||
break;
|
||||
case GEBM_RECT:
|
||||
case GBM_RECT:
|
||||
if (down) {
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (x1<p1) {
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (x1<a1) {
|
||||
x11=x1;
|
||||
x22=p1;
|
||||
x22=a1;
|
||||
} else {
|
||||
x11=p1;
|
||||
x11=a1;
|
||||
x22=x1;
|
||||
}
|
||||
if (y1<p2) {
|
||||
if (y1<a2) {
|
||||
y11=y1;
|
||||
y22=p2;
|
||||
y22=a2;
|
||||
} else {
|
||||
y11=p2;
|
||||
y11=a2;
|
||||
y22=y1;
|
||||
}
|
||||
dc->color=color;
|
||||
GrRect(dc,x11,y11,x22-x11+1,y22-y11+1);
|
||||
}
|
||||
break;
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
case GBM_COPY:
|
||||
case GBM_DELETE:
|
||||
if (down) {
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (x1<p1) {
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (x1<a1) {
|
||||
x11=x1;
|
||||
x22=p1;
|
||||
x22=a1;
|
||||
} else {
|
||||
x11=p1;
|
||||
x11=a1;
|
||||
x22=x1;
|
||||
}
|
||||
if (y1<p2) {
|
||||
if (y1<a2) {
|
||||
y11=y1;
|
||||
y22=p2;
|
||||
y22=a2;
|
||||
} else {
|
||||
y11=p2;
|
||||
y11=a2;
|
||||
y22=y1;
|
||||
}
|
||||
dc->color=ROPF_DITHER+WHITE<<16+BLACK;
|
||||
dc->pen_width=1;
|
||||
GrLineRect4(dc,x11,y11,x22,y22);
|
||||
GrBorder(dc,x11,y11,x22,y22);
|
||||
}
|
||||
break;
|
||||
case GEBM_CIRCLE:
|
||||
case GBM_CIRCLE:
|
||||
if (down) {
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
dc->color=color;
|
||||
dc->pen_width=width;
|
||||
GrCircle3(dc,x1,y1,0,Sqrt(SqrI64(p1-x1)+SqrI64(p2-y1)));
|
||||
GrCircle3(dc,x1,y1,0,Sqrt(SqrI64(a1-x1)+SqrI64(a2-y1)));
|
||||
}
|
||||
break;
|
||||
case GEBM_PASTE:
|
||||
case GEBM_PASTE_TRANSPARENT:
|
||||
case GBM_PASTE:
|
||||
case GBM_PASTE_TRANSPARENT:
|
||||
if (clipboard) {
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (mode==GEBM_PASTE) {
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (mode==GBM_PASTE) {
|
||||
clipboard->flags|=DCF_NO_TRANSPARENTS;
|
||||
GrBlot(dc,p1,p2,clipboard);
|
||||
GrBlot(dc,a1,a2,clipboard);
|
||||
clipboard->flags&=~DCF_NO_TRANSPARENTS;
|
||||
} else {
|
||||
dc2=DCCopy(clipboard);
|
||||
DCColorChg(dc2,bkcolor);
|
||||
GrBlot(dc,p1,p2,dc2);
|
||||
GrBlot(dc,a1,a2,dc2);
|
||||
DCDel(dc2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GEBM_TEXT:
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
case GBM_TEXT:
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
dc->color=color;
|
||||
GrPrint(dc,p1,p2,"%s",st);
|
||||
GrPrint(dc,a1,a2,"%s",st);
|
||||
break;
|
||||
case GEBM_TEXT_BOX:
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
case GBM_TEXT_BOX:
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
dc->color=color;
|
||||
GrTextBox3(dc,p1,p2,0,st);
|
||||
GrTextBox3(dc,a1,a2,0,st);
|
||||
break;
|
||||
case GEBM_TEXT_DIAMOND:
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
case GBM_TEXT_DIAMOND:
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
dc->color=color;
|
||||
GrTextDiamond3(dc,p1,p2,0,st);
|
||||
GrTextDiamond3(dc,a1,a2,0,st);
|
||||
break;
|
||||
case GEBM_POLYPT:
|
||||
case GBM_POLYPT:
|
||||
if (down) {
|
||||
img->color=color;
|
||||
img->pen_width=width;
|
||||
GrLine3(img,x1-xx1,y1-yy1,0,p1-xx1,p2-yy1,0);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
x1=p1; y1=p2;
|
||||
GrLine3(img,x1-xx1,y1-yy1,0,a1-xx1,a2-yy1,0);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
x1=a1; y1=a2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MSG_IP_L_UP:
|
||||
switch (mode) {
|
||||
case GEBM_LINE:
|
||||
case GEBM_ARROW:
|
||||
case GEBM_POLYPT:
|
||||
case GEBM_POLYLINE:
|
||||
case GBM_LINE:
|
||||
case GBM_ARROW:
|
||||
case GBM_POLYPT:
|
||||
case GBM_POLYLINE:
|
||||
img->color=color;
|
||||
img->pen_width=width;
|
||||
if (mode==GEBM_ARROW)
|
||||
GrArrow3(img,x1-xx1,y1-yy1,0,p1-xx1,p2-yy1,0);
|
||||
if (mode==GBM_ARROW)
|
||||
GrArrow3(img,x1-xx1,y1-yy1,0,a1-xx1,a2-yy1,0);
|
||||
else
|
||||
GrLine3(img,x1-xx1,y1-yy1,0,p1-xx1,p2-yy1,0);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (mode==GEBM_POLYLINE) {
|
||||
x1=p1; y1=p2;
|
||||
GrLine3(img,x1-xx1,y1-yy1,0,a1-xx1,a2-yy1,0);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (mode==GBM_POLYLINE) {
|
||||
x1=a1; y1=a2;
|
||||
} else
|
||||
down=FALSE;
|
||||
break;
|
||||
case GEBM_RECT:
|
||||
case GBM_RECT:
|
||||
img->color=color;
|
||||
if (x1<p1) {
|
||||
if (x1<a1) {
|
||||
x11=x1;
|
||||
x22=p1;
|
||||
x22=a1;
|
||||
} else {
|
||||
x11=p1;
|
||||
x11=a1;
|
||||
x22=x1;
|
||||
}
|
||||
if (y1<p2) {
|
||||
if (y1<a2) {
|
||||
y11=y1;
|
||||
y22=p2;
|
||||
y22=a2;
|
||||
} else {
|
||||
y11=p2;
|
||||
y11=a2;
|
||||
y22=y1;
|
||||
}
|
||||
GrRect(img,x11-xx1,y11-yy1,x22-x11+1,y22-y11+1);
|
||||
down=FALSE;
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
break;
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
if (x1<p1) {
|
||||
case GBM_COPY:
|
||||
case GBM_DELETE:
|
||||
if (x1<a1) {
|
||||
x11=x1;
|
||||
x22=p1;
|
||||
x22=a1;
|
||||
} else {
|
||||
x11=p1;
|
||||
x11=a1;
|
||||
x22=x1;
|
||||
}
|
||||
if (y1<p2) {
|
||||
if (y1<a2) {
|
||||
y11=y1;
|
||||
y22=p2;
|
||||
y22=a2;
|
||||
} else {
|
||||
y11=p2;
|
||||
y11=a2;
|
||||
y22=y1;
|
||||
}
|
||||
DCDel(clipboard);
|
||||
clipboard=DCExtract(img,x11-xx1,y11-yy1,x22-xx1,y22-yy1);
|
||||
clipboard->bkcolor=bkcolor;
|
||||
if (mode==GEBM_DELETE) {
|
||||
if (mode==GBM_DELETE) {
|
||||
img->color=bkcolor;
|
||||
GrRect(img,x11-xx1,y11-yy1,x22-x11+1,y22-y11+1);
|
||||
}
|
||||
goto bm_menu;
|
||||
case GEBM_CIRCLE:
|
||||
case GBM_CIRCLE:
|
||||
img->color=color;
|
||||
img->pen_width=width;
|
||||
GrCircle3(img,x1-xx1,y1-yy1,0,Sqrt(SqrI64(p1-x1)+SqrI64(p2-y1)));
|
||||
GrCircle3(img,x1-xx1,y1-yy1,0,Sqrt(SqrI64(a1-x1)+SqrI64(a2-y1)));
|
||||
down=FALSE;
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
break;
|
||||
case GEBM_PASTE:
|
||||
case GEBM_PASTE_TRANSPARENT:
|
||||
case GBM_PASTE:
|
||||
case GBM_PASTE_TRANSPARENT:
|
||||
if (clipboard) {
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (mode==GEBM_PASTE) {
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
if (mode==GBM_PASTE) {
|
||||
clipboard->flags|=DCF_NO_TRANSPARENTS;
|
||||
GrBlot(img,p1-xx1,p2-yy1,clipboard);
|
||||
GrBlot(img,a1-xx1,a2-yy1,clipboard);
|
||||
clipboard->flags&=~DCF_NO_TRANSPARENTS;
|
||||
} else {
|
||||
dc2=DCCopy(clipboard);
|
||||
DCColorChg(dc2,bkcolor);
|
||||
GrBlot(img,p1-xx1,p2-yy1,dc2);
|
||||
GrBlot(img,a1-xx1,a2-yy1,dc2);
|
||||
DCDel(dc2);
|
||||
}
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
}
|
||||
break;
|
||||
case GEBM_TEXT:
|
||||
case GBM_TEXT:
|
||||
img->color=color;
|
||||
GrPrint(img,p1-xx1,p2-yy1,"%s",st);
|
||||
GrPrint(img,a1-xx1,a2-yy1,"%s",st);
|
||||
goto bm_menu;
|
||||
case GEBM_TEXT_BOX:
|
||||
case GBM_TEXT_BOX:
|
||||
img->color=color;
|
||||
GrTextBox3(img,p1-xx1,p2-yy1,0,st);
|
||||
GrTextBox3(img,a1-xx1,a2-yy1,0,st);
|
||||
goto bm_menu;
|
||||
case GEBM_TEXT_DIAMOND:
|
||||
case GBM_TEXT_DIAMOND:
|
||||
img->color=color;
|
||||
GrTextDiamond3(img,p1-xx1,p2-yy1,0,st);
|
||||
GrTextDiamond3(img,a1-xx1,a2-yy1,0,st);
|
||||
goto bm_menu;
|
||||
}
|
||||
break;
|
||||
@@ -678,7 +677,7 @@ bm_done:
|
||||
Free(st);
|
||||
DCFill(dc);
|
||||
SettingsPop;
|
||||
doc_e->flags1=old_e_flags1;
|
||||
doc_e->de_flags=old_de_flags;
|
||||
*_img=img;
|
||||
*_xx1=xx1,*_yy1=yy1,*_xx2=xx2,*_yy2=yy2;
|
||||
return result;
|
||||
|
||||
@@ -0,0 +1,607 @@
|
||||
#help_index "Graphics/Sprite"
|
||||
|
||||
U0 SpriteElem2Code(CDoc *doc,CSprite *tempg)
|
||||
{
|
||||
U8 buf1[256],buf2[136];
|
||||
I32 *ptr;
|
||||
I64 i,j,k,col,width_internal;
|
||||
CD3I32 *p;
|
||||
CMeshTri *tri;
|
||||
if (!doc) doc=DocPut;
|
||||
DocPrint(doc,"%Z",tempg->type,"ST_SPRITE_ELEM_CODES");
|
||||
switch (tempg->type) {
|
||||
case SPT_COLOR:
|
||||
DocPrint(doc,"{%s}",
|
||||
Color2Str(buf1,tempg->color));
|
||||
break;
|
||||
case SPT_DITHER_COLOR:
|
||||
DocPrint(doc,"{%s}",
|
||||
Color2Str(buf2,ROPF_DITHER|tempg->dither_color.u8[0]|tempg->dither_color.u8[1]<<COLORROP_BITS));
|
||||
break;
|
||||
case SPT_TRANSFORM_ON:
|
||||
DocPrint(doc,"{ON}");
|
||||
break;
|
||||
case SPT_TRANSFORM_OFF:
|
||||
DocPrint(doc,"{OFF}");
|
||||
break;
|
||||
case SPT_LINE:
|
||||
case SPT_ARROW:
|
||||
case SPT_PLANAR_SYMMETRY:
|
||||
DocPrint(doc,"{(%d,%d),(%d,%d)}",tempg->x1,tempg->y1,tempg->x2,tempg->y2);
|
||||
break;
|
||||
case SPT_RECT:
|
||||
DocPrint(doc,"{(%d,%d):(%d,%d)}",tempg->x1,tempg->y1,
|
||||
tempg->x2-tempg->x1,tempg->y2-tempg->y1);
|
||||
break;
|
||||
case SPT_ROTATED_RECT:
|
||||
DocPrint(doc,"{(%d,%d):(%d,%d),%0.4f}",tempg->x1,tempg->y1,
|
||||
tempg->x2-tempg->x1,tempg->y2-tempg->y1,
|
||||
180/ã*Wrap(tempg->rot_angle));
|
||||
break;
|
||||
case SPT_PT:
|
||||
case SPT_FLOOD_FILL:
|
||||
case SPT_SHIFT:
|
||||
DocPrint(doc,"{(%d,%d)}",tempg->x1,tempg->y1);
|
||||
break;
|
||||
case SPT_FLOOD_FILL_NOT:
|
||||
DocPrint(doc,"{(%d,%d),TRUE}",tempg->x1,tempg->y1);
|
||||
break;
|
||||
case SPT_CIRCLE:
|
||||
DocPrint(doc,"{(%d,%d):%d}",tempg->x1,tempg->y1,tempg->x2);
|
||||
break;
|
||||
case SPT_WIDTH:
|
||||
DocPrint(doc,"{%d}",tempg->width);
|
||||
break;
|
||||
case SPT_ELLIPSE:
|
||||
DocPrint(doc,"{(%d,%d):(%d,%d),%0.4f}",tempg->x2,tempg->y2,
|
||||
tempg->width,tempg->height,180/ã*Wrap(tempg->rot_angle));
|
||||
break;
|
||||
case SPT_POLYGON:
|
||||
DocPrint(doc,"{%d,(%d,%d):(%d,%d),%0.4f}",tempg->sides,tempg->x2,tempg->y2,
|
||||
tempg->width,tempg->height,180/ã*Wrap(tempg->rot_angle));
|
||||
break;
|
||||
case SPT_TEXT:
|
||||
case SPT_TEXT_BOX:
|
||||
case SPT_TEXT_DIAMOND:
|
||||
DocPrint(doc,"{(%d,%d),\"%Q\"}",tempg->x1,tempg->y1,tempg->st);
|
||||
break;
|
||||
case SPT_POLYLINE:
|
||||
ptr=&tempg->y1;
|
||||
DocPrint(doc,"{(%d,%d)",ptr[0],ptr[1]);
|
||||
if (tempg->num>1) DocPrint(doc,",");
|
||||
ptr+=2;
|
||||
for (i=1;i<tempg->num;i++) {
|
||||
DocPrint(doc,"(%d,%d)",ptr[0],ptr[1]);
|
||||
if (i+1<tempg->num) DocPrint(doc,",");
|
||||
if (i&3==3 && i+1<tempg->num)
|
||||
DocPrint(doc,"\n");
|
||||
ptr+=2;
|
||||
}
|
||||
DocPrint(doc,"}");
|
||||
break;
|
||||
case SPT_BSPLINE2:
|
||||
case SPT_BSPLINE3:
|
||||
case SPT_BSPLINE2_CLOSED:
|
||||
case SPT_BSPLINE3_CLOSED:
|
||||
ptr=&tempg->y1;
|
||||
DocPrint(doc,"{(%d,%d,%d)",ptr[0],ptr[1],ptr[2]);
|
||||
ptr+=3;
|
||||
if (tempg->num>1) DocPrint(doc,",");
|
||||
for (i=1;i<tempg->num;i++,ptr+=3) {
|
||||
DocPrint(doc,"(%d,%d,%d)",ptr[0],ptr[1],ptr[2]);
|
||||
if (i+1<tempg->num) DocPrint(doc,",");
|
||||
if (i&3==3 && i+1<tempg->num)
|
||||
DocPrint(doc,"\n");
|
||||
}
|
||||
if (tempg->type==SPT_BSPLINE2||tempg->type==SPT_BSPLINE3)
|
||||
DocPrint(doc,",FALSE}");
|
||||
else
|
||||
DocPrint(doc,",TRUE}");
|
||||
break;
|
||||
case SPT_POLYPT:
|
||||
ptr=&tempg->y1;
|
||||
DocPrint(doc,"{(%d,%d),",ptr[0],ptr[1]);
|
||||
ptr+=2;
|
||||
col=16;
|
||||
for (i=0;i<tempg->num;i++) {
|
||||
DocPrint(doc,"%d",BFieldExtU32(ptr,i*3,3));
|
||||
if (++col>=64 && i+1<tempg->num) {
|
||||
DocPrint(doc,"\n");
|
||||
col=0;
|
||||
}
|
||||
}
|
||||
DocPrint(doc,"}");
|
||||
break;
|
||||
case SPT_BITMAP:
|
||||
DocPrint(doc,"{(%d,%d):(%d,%d),\n",tempg->x2,tempg->y2,tempg->width,tempg->height);
|
||||
width_internal=(tempg->width+7)&~7;
|
||||
if (width_internal<80)
|
||||
k=width_internal;
|
||||
else
|
||||
k=64;
|
||||
ptr=tempg(U8 *)+offset(CSprite.linespeed);
|
||||
col=0;
|
||||
for (j=0;j<tempg->height;j++)
|
||||
for (i=0;i<width_internal;i++,ptr(U8 *)++) {
|
||||
if (i>=tempg->width)
|
||||
DocPrint(doc,"_");
|
||||
else if (*ptr(U8 *)<16)
|
||||
DocPrint(doc,"%X",*ptr(U8 *));
|
||||
else
|
||||
DocPrint(doc,"%c",CH_SHIFT_SPACE);
|
||||
if (++col>=k && (i+1<width_internal||j+1<tempg->height)) {
|
||||
DocPrint(doc,"\n");
|
||||
col=0;
|
||||
}
|
||||
}
|
||||
DocPrint(doc,"}");
|
||||
break;
|
||||
case SPT_MESH:
|
||||
DocPrint(doc,"{FALSE,");
|
||||
p=(&tempg->tri_cnt)(U8 *)+sizeof(I32);
|
||||
col=0;
|
||||
for (i=0;i<tempg->vertex_cnt;i++,p++) {
|
||||
DocPrint(doc,"(%d,%d,%d)",p->x,p->y,p->z);
|
||||
if (i+1<tempg->vertex_cnt) DocPrint(doc,",");
|
||||
if (++col==4) {
|
||||
DocPrint(doc,"\t//%d\n",i);
|
||||
col=0;
|
||||
}
|
||||
}
|
||||
DocPrint(doc,":");
|
||||
tri=p;
|
||||
for (i=0;i<tempg->tri_cnt;i++,tri++) {
|
||||
DocPrint(doc,"(%s,%d,%d,%d)",Color2Str(buf1,tri->color),
|
||||
tri->nums[0],tri->nums[1],tri->nums[2]);
|
||||
if (i+1<tempg->tri_cnt) DocPrint(doc,",");
|
||||
if (++col>=3 && i+1<tempg->tri_cnt) {
|
||||
DocPrint(doc,"\n");
|
||||
col=0;
|
||||
}
|
||||
}
|
||||
DocPrint(doc,"}");
|
||||
break;
|
||||
case SPT_SHIFTABLE_MESH:
|
||||
DocPrint(doc,"{TRUE,(%d,%d,%d):",tempg->x1,tempg->y1,tempg->z1);
|
||||
p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
col=1;
|
||||
for (i=0;i<tempg->shiftable_vertex_cnt;i++,p++) {
|
||||
DocPrint(doc,"(%d,%d,%d)",p->x,p->y,p->z);
|
||||
if (i+1<tempg->shiftable_vertex_cnt) DocPrint(doc,",");
|
||||
if (++col==4) {
|
||||
DocPrint(doc,"\t//%d\n",i);
|
||||
col=0;
|
||||
}
|
||||
}
|
||||
DocPrint(doc,":");
|
||||
tri=p;
|
||||
for (i=0;i<tempg->shiftable_tri_cnt;i++,tri++) {
|
||||
DocPrint(doc,"(%s,%d,%d,%d)",Color2Str(buf1,tri->color),
|
||||
tri->nums[0],tri->nums[1],tri->nums[2]);
|
||||
if (i+1<tempg->shiftable_tri_cnt) DocPrint(doc,",");
|
||||
if (++col>=3 && i+1<tempg->shiftable_tri_cnt) {
|
||||
DocPrint(doc,"\n");
|
||||
col=0;
|
||||
}
|
||||
}
|
||||
DocPrint(doc,"}");
|
||||
break;
|
||||
}
|
||||
DocPrint(doc,";\n");
|
||||
}
|
||||
|
||||
public U0 Sprite2Code(CDoc *doc=NULL,U8 *elems)
|
||||
{//Sprite to text.
|
||||
CSprite *tempg=elems-offset(CSprite.start);
|
||||
while (tempg->type) {
|
||||
SpriteElem2Code(doc,tempg);
|
||||
tempg(U8 *)+=SpriteElemSize(tempg);
|
||||
}
|
||||
}
|
||||
|
||||
CSprite *Code2SpriteElem(CLex *lx,I64 type)
|
||||
{
|
||||
I64 i,num1,num2,size;
|
||||
CSprite *result,g;
|
||||
CColorROPU32 color;
|
||||
U8 *st,*ptr;
|
||||
CQueD3I32 rootp,*tempp,*tempa1;
|
||||
CQueMeshTri roott,*tempt,*tempt1;
|
||||
CQueVectU8 *tempv;
|
||||
MemSet(&g,0,sizeof(CSprite));
|
||||
switch (type) {
|
||||
sub_switch_start:
|
||||
case SPT_COLOR:
|
||||
case SPT_DITHER_COLOR:
|
||||
st=LexFirstRem(lx,"}");
|
||||
color=Str2ColorU32(st);
|
||||
Free(st);
|
||||
Lex(lx); //Skip color
|
||||
g.color=color.c0.color;
|
||||
if (color&ROPF_DITHER) {
|
||||
g.dither_color.u8[1]=color.c1.color;
|
||||
g.type=SPT_DITHER_COLOR;
|
||||
} else
|
||||
g.type=SPT_COLOR;
|
||||
break;
|
||||
case SPT_TRANSFORM_ON:
|
||||
case SPT_TRANSFORM_OFF:
|
||||
Lex(lx); //Skip {
|
||||
if (LexExpressionI64(lx))
|
||||
g.type=SPT_TRANSFORM_ON;
|
||||
else
|
||||
g.type=SPT_TRANSFORM_OFF;
|
||||
break;
|
||||
case SPT_LINE:
|
||||
case SPT_ARROW:
|
||||
case SPT_PLANAR_SYMMETRY:
|
||||
Lex(lx); //Skip {
|
||||
g.type=type;
|
||||
LexD2I32(lx,&g.x1);
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
Lex(lx); //Skip ,
|
||||
LexD2I32(lx,&g.x2);
|
||||
break;
|
||||
case SPT_RECT:
|
||||
case SPT_ROTATED_RECT:
|
||||
Lex(lx); //Skip {
|
||||
LexD2I32(lx,&g.x1);
|
||||
if (lx->token!=':')
|
||||
LexExcept(lx,"expecting ':' at ");
|
||||
Lex(lx); //Skip :
|
||||
LexD2I32(lx,&g.x2);
|
||||
g.x2+=g.x1;
|
||||
g.y2+=g.y1;
|
||||
if (lx->token==',') {
|
||||
Lex(lx); //Skip ,
|
||||
g.rot_angle=ã/180*LexExpressionF64(lx);
|
||||
g.type=SPT_ROTATED_RECT;
|
||||
} else
|
||||
g.type=SPT_RECT;
|
||||
break;
|
||||
case SPT_PT:
|
||||
case SPT_SHIFT:
|
||||
Lex(lx); //Skip {
|
||||
g.type=type;
|
||||
LexD2I32(lx,&g.x1);
|
||||
break;
|
||||
case SPT_FLOOD_FILL:
|
||||
case SPT_FLOOD_FILL_NOT:
|
||||
Lex(lx); //Skip {
|
||||
LexD2I32(lx,&g.x1);
|
||||
if (lx->token==',') {
|
||||
Lex(lx); //Skip ,
|
||||
i=LexExpressionI64(lx);
|
||||
} else
|
||||
i=0;
|
||||
if (i)
|
||||
g.type=SPT_FLOOD_FILL_NOT;
|
||||
else
|
||||
g.type=SPT_FLOOD_FILL;
|
||||
break;
|
||||
case SPT_WIDTH:
|
||||
Lex(lx); //Skip {
|
||||
g.width=LexExpressionI64(lx);
|
||||
g.type=SPT_WIDTH;
|
||||
break;
|
||||
case SPT_CIRCLE:
|
||||
Lex(lx); //Skip {
|
||||
g.type=SPT_CIRCLE;
|
||||
LexD2I32(lx,&g.x1);
|
||||
if (lx->token!=':')
|
||||
LexExcept(lx,"expecting ':' at ");
|
||||
Lex(lx); //Skip :
|
||||
g.x2=LexExpressionI64(lx);
|
||||
break;
|
||||
case SPT_POLYGON:
|
||||
Lex(lx); //Skip {
|
||||
g.sides=LexExpressionI64(lx);
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
Lex(lx); //Skip ,
|
||||
case SPT_ELLIPSE:
|
||||
Lex(lx); //Skip {
|
||||
g.type=type;
|
||||
LexD2I32(lx,&g.x2);
|
||||
if (lx->token!=':')
|
||||
LexExcept(lx,"expecting ':' at ");
|
||||
Lex(lx); //Skip :
|
||||
LexD2I32(lx,&g.width);
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
Lex(lx); //Skip ,
|
||||
g.rot_angle=ã/180*LexExpressionF64(lx);
|
||||
break;
|
||||
sub_switch_end:
|
||||
size=SpriteElemSize(&g)+offset(CSprite.start);
|
||||
result=MAlloc(size);
|
||||
MemCpy(result,&g,size);
|
||||
break;
|
||||
case SPT_TEXT:
|
||||
case SPT_TEXT_BOX:
|
||||
case SPT_TEXT_DIAMOND:
|
||||
Lex(lx); //Skip {
|
||||
g.type=type;
|
||||
LexD2I32(lx,&g.x1);
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
if (Lex(lx)==TK_STR) //Skip ,
|
||||
st=LexExtStr(lx);
|
||||
else
|
||||
LexExcept(lx,"expecting string at ");
|
||||
size=SpriteElemQuedBaseSize(type);
|
||||
i=StrLen(st)+1;
|
||||
result=MAlloc(size+i);
|
||||
MemCpy(result,&g,size);
|
||||
MemCpy(result(U8 *)+size,st,i);
|
||||
Free(st);
|
||||
break;
|
||||
case SPT_POLYLINE:
|
||||
Lex(lx); //Skip {
|
||||
g.type=SPT_POLYLINE;
|
||||
QueInit(&rootp);
|
||||
while (lx->token=='(') {
|
||||
tempp=CAlloc(sizeof(CQueD3I32));
|
||||
LexD2I32(lx,&tempp->p);
|
||||
QueIns(tempp,rootp.last);
|
||||
g.num++;
|
||||
if (lx->token==',')
|
||||
Lex(lx); //Skip ,
|
||||
}
|
||||
if (!g.num)
|
||||
LexExcept(lx,"expecting point at ");
|
||||
size=SpriteElemQuedBaseSize(SPT_POLYLINE);
|
||||
i=g.num*sizeof(CD2I32);
|
||||
result=MAlloc(size+i);
|
||||
MemCpy(result,&g,size);
|
||||
ptr=&result->y1;
|
||||
tempp=rootp.next;
|
||||
while (tempp!=&rootp) {
|
||||
tempa1=tempp->next;
|
||||
MemCpy(ptr,&tempp->p,sizeof(CD2I32));
|
||||
ptr+=sizeof(CD2I32);
|
||||
Free(tempp);
|
||||
tempp=tempa1;
|
||||
}
|
||||
break;
|
||||
case SPT_BSPLINE2:
|
||||
case SPT_BSPLINE3:
|
||||
case SPT_BSPLINE2_CLOSED:
|
||||
case SPT_BSPLINE3_CLOSED:
|
||||
Lex(lx); //Skip {
|
||||
QueInit(&rootp);
|
||||
while (lx->token=='(') {
|
||||
tempp=CAlloc(sizeof(CQueD3I32));
|
||||
LexD3I32(lx,&tempp->p);
|
||||
QueIns(tempp,rootp.last);
|
||||
g.num++;
|
||||
if (lx->token==',')
|
||||
Lex(lx); //Skip ,
|
||||
}
|
||||
if (!g.num)
|
||||
LexExcept(lx,"expecting point at ");
|
||||
size=SpriteElemQuedBaseSize(type);
|
||||
i=g.num*sizeof(CD3I32);
|
||||
result=MAlloc(size+i);
|
||||
if (LexExpressionI64(lx)) {
|
||||
if (type==SPT_BSPLINE2||type==SPT_BSPLINE2_CLOSED)
|
||||
g.type=SPT_BSPLINE2_CLOSED;
|
||||
else
|
||||
g.type=SPT_BSPLINE3_CLOSED;
|
||||
} else {
|
||||
if (type==SPT_BSPLINE2||type==SPT_BSPLINE2_CLOSED)
|
||||
g.type=SPT_BSPLINE2;
|
||||
else
|
||||
g.type=SPT_BSPLINE3;
|
||||
}
|
||||
MemCpy(result,&g,size);
|
||||
ptr=&result->y1;
|
||||
tempp=rootp.next;
|
||||
while (tempp!=&rootp) {
|
||||
tempa1=tempp->next;
|
||||
MemCpy(ptr,&tempp->p,sizeof(CD3I32));
|
||||
ptr+=sizeof(CD3I32);
|
||||
Free(tempp);
|
||||
tempp=tempa1;
|
||||
}
|
||||
break;
|
||||
case SPT_POLYPT:
|
||||
Lex(lx); //Skip {
|
||||
LexD2I32(lx,&g.y1);
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
tempv=QueVectU8New;
|
||||
while (TRUE) {
|
||||
if (!(i=LexGetChar(lx)))
|
||||
LexExcept(lx,"expecting '}' at ");
|
||||
if (i=='}')
|
||||
break;
|
||||
if ('0'<=i<='7')
|
||||
QueVectU8Put(tempv,g.num++,i-'0');
|
||||
}
|
||||
Bts(&lx->flags,Lf_USE_LAST_U16);
|
||||
Lex(lx); //Load '}'
|
||||
g.type=SPT_POLYPT;
|
||||
size=SpriteElemQuedBaseSize(SPT_POLYPT);
|
||||
i=(g.num*3+7)>>3;
|
||||
result=CAlloc(size+i);
|
||||
MemCpy(result,&g,size);
|
||||
ptr=&result->y2;
|
||||
for (i=0;i<g.num;i++)
|
||||
BFieldOrU32(ptr,i*3,QueVectU8Get(tempv,i));
|
||||
QueVectU8Del(tempv);
|
||||
break;
|
||||
case SPT_BITMAP:
|
||||
Lex(lx); //Skip {
|
||||
LexD2I32(lx,&g.x2);
|
||||
if (lx->token!=':')
|
||||
LexExcept(lx,"expecting ':' at ");
|
||||
Lex(lx); //Skip :
|
||||
LexD2I32(lx,&g.width);
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
tempv=QueVectU8New;
|
||||
num1=0;
|
||||
while (TRUE) {
|
||||
if (!(i=ToUpper(LexGetChar(lx))))
|
||||
LexExcept(lx,"expecting '}' at ");
|
||||
if (i=='}')
|
||||
break;
|
||||
if ('0'<=i<='9')
|
||||
QueVectU8Put(tempv,num1++,i-'0');
|
||||
else if ('A'<=i<='F')
|
||||
QueVectU8Put(tempv,num1++,i-'A'+10);
|
||||
else if (i==CH_SPACE||i==CH_SHIFT_SPACE)
|
||||
QueVectU8Put(tempv,num1++,TRANSPARENT);
|
||||
else if (i=='_')
|
||||
QueVectU8Put(tempv,num1++,0);
|
||||
}
|
||||
Bts(&lx->flags,Lf_USE_LAST_U16);
|
||||
Lex(lx); //Load '}'
|
||||
g.type=SPT_BITMAP;
|
||||
size=SpriteElemQuedBaseSize(SPT_BITMAP);
|
||||
result=CAlloc(size+num1);
|
||||
MemCpy(result,&g,size);
|
||||
ptr=&result->linespeed;
|
||||
for (i=0;i<num1;i++)
|
||||
*ptr++=QueVectU8Get(tempv,i);
|
||||
QueVectU8Del(tempv);
|
||||
break;
|
||||
case SPT_MESH:
|
||||
case SPT_SHIFTABLE_MESH:
|
||||
Lex(lx); //Skip {
|
||||
if (LexExpressionI64(lx)) {
|
||||
g.type=SPT_SHIFTABLE_MESH;
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
Lex(lx); //Skip ,
|
||||
LexD3I32(lx,&g.x1);
|
||||
if (lx->token!=':')
|
||||
LexExcept(lx,"expecting ':' at ");
|
||||
Lex(lx); //Skip :
|
||||
} else {
|
||||
g.type=SPT_MESH;
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
Lex(lx); //Skip ,
|
||||
}
|
||||
num1=0;
|
||||
QueInit(&rootp);
|
||||
while (lx->token=='(') {
|
||||
tempp=CAlloc(sizeof(CQueD3I32));
|
||||
LexD3I32(lx,&tempp->p);
|
||||
QueIns(tempp,rootp.last);
|
||||
num1++;
|
||||
if (lx->token==',')
|
||||
Lex(lx); //Skip ,
|
||||
}
|
||||
if (lx->token!=':')
|
||||
LexExcept(lx,"expecting ':' at ");
|
||||
Lex(lx); //Skip :
|
||||
num2=0;
|
||||
QueInit(&roott);
|
||||
while (lx->token=='(') {
|
||||
tempt=CAlloc(sizeof(CQueMeshTri));
|
||||
st=LexFirstRem(lx,",");
|
||||
tempt->color=Str2ColorU32(st);
|
||||
Free(st);
|
||||
Lex(lx); //Skip color
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
Lex(lx); //Skip ,
|
||||
tempt->nums[0]=LexExpressionI64(lx);
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
Lex(lx); //Skip ,
|
||||
tempt->nums[1]=LexExpressionI64(lx);
|
||||
if (lx->token!=',')
|
||||
LexExcept(lx,"expecting ',' at ");
|
||||
Lex(lx); //Skip ,
|
||||
tempt->nums[2]=LexExpressionI64(lx);
|
||||
if (lx->token!=')')
|
||||
LexExcept(lx,"expecting ')' at ");
|
||||
Lex(lx); //Skip )
|
||||
QueIns(tempt,roott.last);
|
||||
num2++;
|
||||
if (lx->token==',')
|
||||
Lex(lx); //Skip ,
|
||||
}
|
||||
if (g.type==SPT_MESH) {
|
||||
g.vertex_cnt=num1;
|
||||
g.tri_cnt=num2;
|
||||
size=SpriteElemQuedBaseSize(SPT_MESH);
|
||||
} else {
|
||||
g.shiftable_vertex_cnt=num1;
|
||||
g.shiftable_tri_cnt=num2;
|
||||
}
|
||||
size=SpriteElemQuedBaseSize(g.type);
|
||||
result=MAlloc(size+num1*sizeof(CD3I32)+num2*sizeof(CMeshTri));
|
||||
MemCpy(result,&g,size);
|
||||
ptr=result(U8 *)+size;
|
||||
tempp=rootp.next;
|
||||
while (tempp!=&rootp) {
|
||||
tempa1=tempp->next;
|
||||
MemCpy(ptr,&tempp->p,sizeof(CD3I32));
|
||||
ptr+=sizeof(CD3I32);
|
||||
Free(tempp);
|
||||
tempp=tempa1;
|
||||
}
|
||||
tempt=roott.next;
|
||||
while (tempt!=&roott) {
|
||||
tempt1=tempt->next;
|
||||
MemCpy(ptr,&tempt->start,sizeof(CMeshTri));
|
||||
ptr+=sizeof(CMeshTri);
|
||||
Free(tempt);
|
||||
tempt=tempt1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (lx->token!='}')
|
||||
LexExcept(lx,"expecting '}' at ");
|
||||
if (Lex(lx)!=';')
|
||||
LexExcept(lx,"expecting ';' at ");
|
||||
return result;
|
||||
}
|
||||
|
||||
public U8 *Code2Sprite(CDoc *doc,I64 *_size=NULL)
|
||||
{//Text to sprite.
|
||||
CSprite root;
|
||||
U8 *result;
|
||||
Bool okay=TRUE,unlock_doc=DocLock(doc);
|
||||
CLex *lx=LexNew(,LF_DONT_FREE_BUF);
|
||||
CHashTable *old_hash_table_lst=lx->htc.hash_table_lst;
|
||||
CHashGeneric *temph;
|
||||
I64 i,size=0;
|
||||
QueInit(&root);
|
||||
LexAttachDoc(lx,,doc);
|
||||
try {
|
||||
do {
|
||||
lx->htc.hash_table_lst=NULL;
|
||||
if (Lex(lx)==TK_IDENT && //Skip ;
|
||||
(temph=HashFind(lx->cur_str,gr.sprite_hash,SPHT_ELEM_CODE))) {
|
||||
i=temph->user_data0;
|
||||
lx->htc.hash_table_lst=old_hash_table_lst;
|
||||
if (Lex(lx)=='{') //Skip ident
|
||||
QueIns(Code2SpriteElem(lx,i),root.last);
|
||||
} else if (lx->token)
|
||||
LexExcept(lx,"expecting sprite element type name at ");
|
||||
} while (lx->token);
|
||||
okay=TRUE;
|
||||
} catch {
|
||||
Fs->catch_except=TRUE;
|
||||
okay=FALSE;
|
||||
}
|
||||
if (unlock_doc)
|
||||
DocUnlock(doc);
|
||||
if (okay) {
|
||||
LexDel(lx); //TODO: can crash
|
||||
result=SpriteQue2Sprite(&root,&size);
|
||||
} else {
|
||||
result=NULL;
|
||||
size=0;
|
||||
}
|
||||
if (_size) *_size=size;
|
||||
QueDel(&root);
|
||||
return result;
|
||||
}
|
||||
+290
-329
File diff suppressed because it is too large.
Load diff
+370
-366
File diff suppressed because it is too large.
Load diff
+302
-310
File diff suppressed because it is too large.
Load diff
+96
-94
@@ -1,73 +1,75 @@
|
||||
#help_index "Graphics/Sprite"
|
||||
#help_file "::/Doc/Sprite"
|
||||
|
||||
I64 sprite_base_size[GRST_NUM_TYPES]=
|
||||
U8 polypt_map[9]={0,1,2,3,0,4,5,6,7};
|
||||
|
||||
I64 sprite_elem_base_sizes[SPT_NUM_TYPES]=
|
||||
{
|
||||
offset(CSprite.x1)-offset(CSprite.start), //GRST_END
|
||||
1+offset(CSprite.color8)-offset(CSprite.start), //GRST_COLOR8
|
||||
2+offset(CSprite.dither_color8)-offset(CSprite.start), //GRST_DITHER_COLOR8
|
||||
offset(CSprite.y1)-offset(CSprite.start), //GRST_WIDTH
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_PLANAR_SYMMETRY
|
||||
offset(CSprite.x1)-offset(CSprite.start), //GRST_TRANSFORM_ON
|
||||
offset(CSprite.x1)-offset(CSprite.start), //GRST_TRANSFORM_OFF
|
||||
offset(CSprite.x2)-offset(CSprite.start), //GRST_SHIFT
|
||||
offset(CSprite.x2)-offset(CSprite.start), //GRST_PT
|
||||
offset(CSprite.y1)-offset(CSprite.start), //GRST_POLYPT
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_LINE
|
||||
offset(CSprite.y1)-offset(CSprite.start), //GRST_POLYLINE
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_RECT
|
||||
offset(CSprite.sides)-offset(CSprite.start), //GRST_ROTATED_RECT
|
||||
offset(CSprite.y2)-offset(CSprite.start), //GRST_CIRCLE
|
||||
offset(CSprite.sides)-offset(CSprite.start), //GRST_ELLIPSE
|
||||
sizeof(CSprite)-offset(CSprite.start), //GRST_POLYGON
|
||||
offset(CSprite.y1)-offset(CSprite.start), //GRST_BSPLINE2
|
||||
offset(CSprite.y1)-offset(CSprite.start), //GRST_BSPLINE2_CLOSED
|
||||
offset(CSprite.y1)-offset(CSprite.start), //GRST_BSPLINE3
|
||||
offset(CSprite.y1)-offset(CSprite.start), //GRST_BSPLINE3_CLOSED
|
||||
offset(CSprite.x2)-offset(CSprite.start), //GRST_FLOOD_FILL
|
||||
offset(CSprite.x2)-offset(CSprite.start), //GRST_FLOOD_FILL_NOT
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_BITMAP8
|
||||
offset(CSprite.x2)-offset(CSprite.start), //GRST_MESH
|
||||
offset(CSprite.shiftable_tri_cnt)+sizeof(I32)-offset(CSprite.start), //GRST_SHIFTABLE_MESH
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_ARROW
|
||||
offset(CSprite.st)-offset(CSprite.start), //GRST_TEXT
|
||||
offset(CSprite.st)-offset(CSprite.start), //GRST_TEXT_BOX
|
||||
offset(CSprite.st)-offset(CSprite.start), //GRST_TEXT_DIAMOND
|
||||
offset(CSprite.x1)-offset(CSprite.start), //SPT_END
|
||||
1+offset(CSprite.color)-offset(CSprite.start), //SPT_COLOR
|
||||
2+offset(CSprite.dither_color)-offset(CSprite.start), //SPT_DITHER_COLOR
|
||||
offset(CSprite.y1)-offset(CSprite.start), //SPT_WIDTH
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_PLANAR_SYMMETRY
|
||||
offset(CSprite.x1)-offset(CSprite.start), //SPT_TRANSFORM_ON
|
||||
offset(CSprite.x1)-offset(CSprite.start), //SPT_TRANSFORM_OFF
|
||||
offset(CSprite.x2)-offset(CSprite.start), //SPT_SHIFT
|
||||
offset(CSprite.x2)-offset(CSprite.start), //SPT_PT
|
||||
offset(CSprite.y2)-offset(CSprite.start), //SPT_POLYPT
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_LINE
|
||||
offset(CSprite.y1)-offset(CSprite.start), //SPT_POLYLINE
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_RECT
|
||||
offset(CSprite.sides)-offset(CSprite.start), //SPT_ROTATED_RECT
|
||||
offset(CSprite.y2)-offset(CSprite.start), //SPT_CIRCLE
|
||||
offset(CSprite.sides)-offset(CSprite.start), //SPT_ELLIPSE
|
||||
sizeof(CSprite)-offset(CSprite.start), //SPT_POLYGON
|
||||
offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE2
|
||||
offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE2_CLOSED
|
||||
offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE3
|
||||
offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE3_CLOSED
|
||||
offset(CSprite.x2)-offset(CSprite.start), //SPT_FLOOD_FILL
|
||||
offset(CSprite.x2)-offset(CSprite.start), //SPT_FLOOD_FILL_NOT
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_BITMAP
|
||||
offset(CSprite.x2)-offset(CSprite.start), //SPT_MESH
|
||||
offset(CSprite.shiftable_tri_cnt)+sizeof(I32)-offset(CSprite.start), //SPT_SHIFTABLE_MESH
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_ARROW
|
||||
offset(CSprite.st)-offset(CSprite.start), //SPT_TEXT
|
||||
offset(CSprite.st)-offset(CSprite.start), //SPT_TEXT_BOX
|
||||
offset(CSprite.st)-offset(CSprite.start), //SPT_TEXT_DIAMOND
|
||||
};
|
||||
|
||||
I64 SpriteQuedBaseSize(I64 type)
|
||||
I64 SpriteElemQuedBaseSize(I64 type)
|
||||
{
|
||||
return sprite_base_size[type]+offset(CSprite.start);
|
||||
return sprite_elem_base_sizes[type]+offset(CSprite.start);
|
||||
}
|
||||
|
||||
I64 SpriteElemSize(CSprite *tempg)
|
||||
{
|
||||
I64 i=sprite_base_size[tempg->type];
|
||||
I64 i=sprite_elem_base_sizes[tempg->type];
|
||||
switch (tempg->type) {
|
||||
case GRST_POLYLINE:
|
||||
i+=tempg->num<<1*sizeof(I32);
|
||||
case SPT_POLYLINE:
|
||||
i+=tempg->num*sizeof(CD2I32);
|
||||
break;
|
||||
case GRST_TEXT:
|
||||
case GRST_TEXT_BOX:
|
||||
case GRST_TEXT_DIAMOND:
|
||||
case SPT_TEXT:
|
||||
case SPT_TEXT_BOX:
|
||||
case SPT_TEXT_DIAMOND:
|
||||
i+=StrLen(tempg->st)+1;
|
||||
break;
|
||||
case GRST_BITMAP8:
|
||||
case SPT_BITMAP:
|
||||
i+=((tempg->width+7)&~7)*tempg->height;
|
||||
break;
|
||||
case GRST_POLYPT:
|
||||
i+=sizeof(I32)<<1+(tempg->num*3+7)>>3;
|
||||
case SPT_POLYPT:
|
||||
i+=(tempg->num*3+7)>>3;
|
||||
break;
|
||||
case GRST_BSPLINE2:
|
||||
case GRST_BSPLINE3:
|
||||
case GRST_BSPLINE2_CLOSED:
|
||||
case GRST_BSPLINE3_CLOSED:
|
||||
case SPT_BSPLINE2:
|
||||
case SPT_BSPLINE3:
|
||||
case SPT_BSPLINE2_CLOSED:
|
||||
case SPT_BSPLINE3_CLOSED:
|
||||
i+=tempg->num*sizeof(CD3I32);
|
||||
break;
|
||||
case GRST_MESH:
|
||||
case SPT_MESH:
|
||||
i+=tempg->vertex_cnt*sizeof(CD3I32)+tempg->tri_cnt*sizeof(CMeshTri);
|
||||
break;
|
||||
case GRST_SHIFTABLE_MESH:
|
||||
case SPT_SHIFTABLE_MESH:
|
||||
i+=tempg->shiftable_vertex_cnt*sizeof(CD3I32)+tempg->shiftable_tri_cnt*sizeof(CMeshTri);
|
||||
break;
|
||||
}
|
||||
@@ -75,11 +77,11 @@ I64 SpriteElemSize(CSprite *tempg)
|
||||
}
|
||||
|
||||
public I64 SpriteSize(U8 *elems)
|
||||
{
|
||||
{//Walk sprite elements and return size of sprite as binary data.
|
||||
CSprite *tempg=elems-offset(CSprite.start),*tempg1=tempg;
|
||||
while (tempg->type)
|
||||
tempg(U8 *)+=SpriteElemSize(tempg);
|
||||
return tempg(U8 *)-tempg1(U8 *)+sprite_base_size[GRST_END];
|
||||
return tempg(U8 *)-tempg1(U8 *)+sprite_elem_base_sizes[SPT_END];
|
||||
}
|
||||
|
||||
I64 SpriteTypeMask(U8 *elems)
|
||||
@@ -87,8 +89,8 @@ I64 SpriteTypeMask(U8 *elems)
|
||||
I64 result=0;
|
||||
CSprite *tempg=elems-offset(CSprite.start);
|
||||
while (tempg->type) {
|
||||
if (tempg->type>=GRST_NUM_TYPES)
|
||||
return 1<<GRST_NUM_TYPES;
|
||||
if (tempg->type>=SPT_NUM_TYPES)
|
||||
return 1<<SPT_NUM_TYPES;
|
||||
Bts(&result,tempg->type);
|
||||
tempg(U8 *)+=SpriteElemSize(tempg);
|
||||
}
|
||||
@@ -96,13 +98,13 @@ I64 SpriteTypeMask(U8 *elems)
|
||||
}
|
||||
|
||||
public U8 *DC2Sprite(CDC *tempb)
|
||||
{
|
||||
{//Convert device context to sprite.
|
||||
CSprite *tempg;
|
||||
tempg=CAlloc(sprite_base_size[GRST_BITMAP8]+
|
||||
tempg=CAlloc(sprite_elem_base_sizes[SPT_BITMAP]+
|
||||
tempb->width_internal*tempb->height+
|
||||
sprite_base_size[GRST_END])
|
||||
sprite_elem_base_sizes[SPT_END])
|
||||
(U8 *)-offset(CSprite.start);
|
||||
tempg->type=GRST_BITMAP8;
|
||||
tempg->type=SPT_BITMAP;
|
||||
tempg->width=tempb->width;
|
||||
tempg->height=tempb->height;
|
||||
tempg->x2=0;
|
||||
@@ -112,62 +114,62 @@ public U8 *DC2Sprite(CDC *tempb)
|
||||
return tempg(U8 *)+offset(CSprite.start);
|
||||
}
|
||||
|
||||
public U8 *Sprite2Text(CSprite *tempg)
|
||||
{ //Study $LK,"::/Demo/Graphics/SpriteText.CPP"$.
|
||||
public U8 *SpriteElem2OneLineSummary(CSprite *tempg)
|
||||
{//Study $LK,"::/Demo/Graphics/SpriteText.CPP"$.
|
||||
U8 buf[256],buf2[136];
|
||||
I32 *ptr;
|
||||
SPrint(buf,"%Z",tempg->type,"ST_SPRITE_TYPES");
|
||||
StrPrint(buf,"%Z",tempg->type,"ST_SPRITE_ELEM_TYPES");
|
||||
switch (tempg->type) {
|
||||
case GRST_COLOR8:
|
||||
CatPrint(buf," %s",Color2Text(buf2,tempg->color8));
|
||||
case SPT_COLOR:
|
||||
CatPrint(buf," %s",Color2Str(buf2,tempg->color));
|
||||
break;
|
||||
case GRST_PT:
|
||||
case GRST_FLOOD_FILL:
|
||||
case GRST_FLOOD_FILL_NOT:
|
||||
case GRST_SHIFT:
|
||||
CatPrint(buf," %d,%d",tempg->x1,tempg->y1);
|
||||
case SPT_DITHER_COLOR:
|
||||
CatPrint(buf," %s",Color2Str(buf2,ROPF_DITHER|tempg->dither_color.u8[0]|tempg->dither_color.u8[1]<<COLORROP_BITS));
|
||||
break;
|
||||
case GRST_LINE:
|
||||
case GRST_ARROW:
|
||||
case GRST_PLANAR_SYMMETRY:
|
||||
case GRST_RECT:
|
||||
case GRST_ROTATED_RECT:
|
||||
CatPrint(buf," (%d,%d)-(%d,%d)",tempg->x1,tempg->y1,tempg->x2,tempg->y2);
|
||||
case SPT_PT:
|
||||
case SPT_FLOOD_FILL:
|
||||
case SPT_FLOOD_FILL_NOT:
|
||||
case SPT_SHIFT:
|
||||
CatPrint(buf," (%d,%d)",tempg->x1,tempg->y1);
|
||||
break;
|
||||
case GRST_CIRCLE:
|
||||
CatPrint(buf," %d,%d:%dR",tempg->x1,tempg->y1,tempg->x2);
|
||||
case SPT_LINE:
|
||||
case SPT_ARROW:
|
||||
case SPT_PLANAR_SYMMETRY:
|
||||
case SPT_RECT:
|
||||
case SPT_ROTATED_RECT:
|
||||
CatPrint(buf," (%d,%d),(%d,%d)",tempg->x1,tempg->y1,tempg->x2,tempg->y2);
|
||||
break;
|
||||
case GRST_WIDTH:
|
||||
case SPT_CIRCLE:
|
||||
CatPrint(buf," (%d,%d):%dR",tempg->x1,tempg->y1,tempg->x2);
|
||||
break;
|
||||
case SPT_WIDTH:
|
||||
CatPrint(buf," %d",tempg->width);
|
||||
break;
|
||||
case GRST_TEXT:
|
||||
case GRST_TEXT_BOX:
|
||||
case GRST_TEXT_DIAMOND:
|
||||
case SPT_TEXT:
|
||||
case SPT_TEXT_BOX:
|
||||
case SPT_TEXT_DIAMOND:
|
||||
CatPrint(buf," %d,%d:%-16tQ",tempg->x1,tempg->y1,tempg->st);
|
||||
break;
|
||||
case GRST_DITHER_COLOR8:
|
||||
CatPrint(buf," %s",Color2Text(buf2,ROPF_DITHER|tempg->dither_color8.u8[0]|tempg->dither_color8.u8[1]<<COLORROP_BITS));
|
||||
break;
|
||||
case GRST_POLYLINE:
|
||||
case GRST_POLYPT:
|
||||
case SPT_POLYLINE:
|
||||
case SPT_POLYPT:
|
||||
ptr=&tempg->y1;
|
||||
CatPrint(buf," %d %d,%d",tempg->num,ptr[0],ptr[1]);
|
||||
CatPrint(buf," %d (%d,%d)",tempg->num,ptr[0],ptr[1]);
|
||||
break;
|
||||
case GRST_ELLIPSE:
|
||||
case GRST_POLYGON:
|
||||
case GRST_BITMAP8:
|
||||
CatPrint(buf," %dW,%dH:%d,%d",tempg->width,tempg->height,tempg->x2,tempg->y2);
|
||||
case SPT_ELLIPSE:
|
||||
case SPT_POLYGON:
|
||||
case SPT_BITMAP:
|
||||
CatPrint(buf," (%d,%d):%dW,%dH",tempg->x2,tempg->y2,tempg->width,tempg->height);
|
||||
break;
|
||||
case GRST_BSPLINE2:
|
||||
case GRST_BSPLINE3:
|
||||
case GRST_BSPLINE2_CLOSED:
|
||||
case GRST_BSPLINE3_CLOSED:
|
||||
case SPT_BSPLINE2:
|
||||
case SPT_BSPLINE3:
|
||||
case SPT_BSPLINE2_CLOSED:
|
||||
case SPT_BSPLINE3_CLOSED:
|
||||
CatPrint(buf," %d",tempg->num);
|
||||
break;
|
||||
case GRST_MESH:
|
||||
case SPT_MESH:
|
||||
CatPrint(buf," %dV,%dT",tempg->vertex_cnt,tempg->tri_cnt);
|
||||
break;
|
||||
case GRST_SHIFTABLE_MESH:
|
||||
case SPT_SHIFTABLE_MESH:
|
||||
CatPrint(buf," %dV,%dT",tempg->shiftable_vertex_cnt,tempg->shiftable_tri_cnt);
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user