Blob Blame Raw


h64020
s 00077 / 00001 / 08351
d D 1.105 00 / 11 / 24 20 : 06 : 53 vincenzo 105 104
c rop_mirror per cmapped
e
s 00015 / 00003 / 08337
d D 1.104 00 / 02 / 18 15 : 59 : 01 max 104 103
c fix baco in rop_premultiply RGBM64 RGBM64;
rop_copy funz.su RAS_BW, RAS_BW
e
s 00001 / 00000 / 08339
d D 1.103 00 / 01 / 12 12 : 08 : 57 vincenzo 103 102
c rop_copy CM24->GR16
e
s 00005 / 00000 / 08334
d D 1.102 99 / 11 / 25 11 : 02 : 20 max 102 101
c rop mirror gestisce WB e BW
e
s 00002 / 00000 / 08332
d D 1.101 99 / 11 / 12 16 : 22 : 09 vincenzo 101 100
c rop_copy_cm16s12->rgbm
e
s 00002 / 00001 / 08330
d D 1.100 99 / 10 / 28 10 : 10 : 09 max 100 99
c rop_mirror supporta anche rastype RAS_WB
e
s 00016 / 00000 / 08315
d D 1.99 99 / 08 / 20 09 : 53 : 22 vincenzo 99 98
c messaggi(disattivati) di diagnostica sulla memoria
e
s 00090 / 00000 / 08225
d D 1.98 99 / 05 / 17 17 : 28 : 42 vincenzo 98 97
c CM16S12
e
s 00006 / 00021 / 08219
d D 1.97 99 / 04 / 01 17 : 59 : 05 vincenzo 97 96
c conversioni varie utilizzate per salvare i.mov
e
s 00374 / 00191 / 07866
d D 1.96 99 / 03 / 26 19 : 19 : 15 vincenzo 96 95
c rop_xrgb1555
e
s 00484 / 00000 / 07573
d D 1.95 99 / 03 / 03 16 : 08 : 21 max 95 94
c + rop_copy rgbx64->rgbx, rgbx64->rgb16;
+ rop_zoom_out rgbx64->rgbx, rgbx64->rgb16, rgbm64->rgbm
e
s 00013 / 00009 / 07560
d D 1.94 99 / 02 / 25 17:04:34 tross 94 93
c rop_subimage_to_raster anche per RGBM64
e
s 00007 / 00006 / 07562
d D 1.93 99 / 02 / 20 15:51:08 tross 93 92
c corretta rop_clear(sbagliava se y1 != 0)
e
s 00001 / 00001 / 07567
d D 1.92 99 / 02 / 17 19:07:11 vincenzo 92 91
c la clone_raster fa anche gli extra
e
s 00020 / 00016 / 07548
d D 1.91 99 / 02 / 15 17:31:49 tross 91 90
c corretta la clone_raster per CM
e
s 00029 / 00002 / 07535
d D 1.90 99 / 02 / 15 17:22:14 vincenzo 90 89
c RAS_GR16
e
s 00713 / 00426 / 06824
d D 1.89 99 / 01 / 11 18:03:57 tross 89 88
c migliorati extra:corretti bachi e aggiunte funz - corretta rop_custom_fill_cmap_penramp(baco tcheck cm24)
e
s 00034 / 00002 / 07216
d D 1.88 98 / 12 / 14 16:21:17 vincenzo 88 87
c ristrutturazione megagalattica per le dll
e
s 00013 / 00000 / 07205
d D 1.87 98 / 10 / 23 17:21:44 vincenzo 87 86
c convert_raster
e
s 00007 / 00001 / 07198
d D 1.86 98 / 09 / 24 18:32:38 tross 86 85
c messa cmap.info in create_raster()
e
s 00003 / 00000 / 07196
d D 1.85 98 / 09 / 14 16:15:32 vincenzo 85 84
c clone_raster mette anchge la cmap
e
s 01500 / 00701 / 05696
d D 1.84 98 / 09 / 14 15:57:39 tross 84 83
c modifiche per CM24, velocizzati[un] premult_lpixel
e
s 00044 / 00064 / 06353
d D 1.83 98 / 08 / 14 17:14:44 tross 83 82
c tolti UNICM
e
s 00013 / 00014 / 06404
d D 1.82 98 / 08 / 14 14:39:55 tross 82 81
c tolto cmap.size
e
s 00348 / 00177 / 06070
d D 1.81 98 / 07 / 16 20:02:00 tross 81 80
c rop_copy e rop_zoom_out rgb_rgb16
e
s 00028 / 00000 / 06219
d D 1.80 98 / 07 / 10 18:32:08 vincenzo 80 79
c create_subraster e clone_raster
e
s 00005 / 00014 / 06214
d D 1.79 98 / 06 / 09 17:29:54 vincenzo 79 78
c eliminata struct cmap_color
e
s 00025 / 00025 / 06203
d D 1.78 98 / 03 / 26 01:07:03 tross 78 77
c assert(FALSE)-- > abort()per problemi di GP piena
e
s 00038 / 00000 / 06190
d D 1.77 98 / 03 / 13 18:35:34 vincenzo 77 76
c create_raster e release_raster
e
s 00002 / 00002 / 06188
d D 1.76 98 / 03 / 09 15:00:15 vincenzo 76 75
c rop_image_to_(sub)raster non inizializzava native_buffer
e
s 00004 / 00004 / 06186
d D 1.75 98 / 02 / 23 12:35:57 vincenzo 75 74
c sbagliata scansione raster su premultiply
e
s 00082 / 00002 / 06108
d D 1.74 98 / 02 / 23 11:15:21 tross 74 73
c rop_premultiply()
e
s 00056 / 00051 / 06054
d D 1.73 97 / 12 / 01 18:26:04 vincenzo 73 72
c rgbx->bw_q, cm16->bw_q
e
s 00020 / 00000 / 06085
d D 1.72 97 / 11 / 28 17:31:32 vincenzo 72 71
c gestione RAS_CMxSy(copy, pixbytes pix_to_ras etc)
e
s 00017 / 00001 / 06068
d D 1.71 97 / 11 / 18 16:42:31 tross 71 70
c rop_copy RAS_CMxSy
e
s 00033 / 00001 / 06036
d D 1.70 97 / 09 / 26 12:25:32 vincenzo 70 69
c rop_copy_rgb16_rgbm
e
s 00010 / 00007 / 06027
d D 1.69 97 / 09 / 23 15:53:42 tross 69 68
c migliorata la rop_copy_bw
e
s 00043 / 00003 / 05991
d D 1.68 97 / 09 / 23 00:00:23 tross 68 67
c rop_copy_bw_bw
e
s 00038 / 00000 / 05956
d D 1.67 97 / 09 / 22 22:20:35 tross 67 66
c rop_copy_rgbx_rgb(vincenzo)
e
s 00006 / 00016 / 05950
d D 1.66 97 / 04 / 01 18:46:33 vincenzo 66 65
c esportata la dither
e
s 00037 / 00021 / 05929
d D 1.65 97 / 03 / 27 19:54:27 tross 65 64
c rop_copy_rgbm64_rgbm con random round
e
s 00001 / 00001 / 05949
d D 1.64 97 / 01 / 03 15:10:39 roberto 64 63
c Corretto bug in rop_copy_90(CASE-- __OR)
e
s 00453 / 00002 / 05497
d D 1.63 96 / 11 / 24 22:36:00 tross 63 62
c rop_copy_90_rgb_rgb16, rop_zoom_out_90_rgb_rgb16 / rgbm
e
s 00381 / 00003 / 05118
d D 1.62 96 / 09 / 14 21:54:23 tross 62 61
c rop_zoom_out_bw_rgb16 / rgbm
e
s 00577 / 00323 / 04544
d D 1.61 96 / 09 / 12 19:44:13 tross 61 60
c rop_zoom_out_bw_rgbm / rgb16, corretto rop_zoom_out_90_gr8_...
e
s 00026 / 00026 / 04841
d D 1.60 96 / 08 / 05 18:15:12 vincenzo 60 59
c gl_color->LPIXEL
e
s 00002 / 00001 / 04865
d D 1.59 96 / 07 / 12 18:41:01 vincenzo 59 58
c messo RGBM64 rop_pixbytes
e
s 00246 / 00123 / 04620
d D 1.58 96 / 07 / 10 17:57:56 vincenzo 58 57
c introdotto rop_copy per RAS_RGBM64
e
s 00280 / 00086 / 04463
d D 1.57 96 / 07 / 10 01:01:58 tross 57 56
c rop_zoom_out_90, per ora solo gr8-- > rgb16 / rgbm
e
s 00279 / 00110 / 04270
d D 1.56 96 / 07 / 09 16:44:14 tross 56 55
c cmap.offset-- > cmap.info.offset_mask etc.
e
s 00238 / 00065 / 04142
d D 1.55 96 / 07 / 01 16:24:22 tross 55 54
c rop_copy_90_bw / gr8_rgb16 
e
s 00205 / 00009 / 04002
d D 1.54 96 / 06 / 27 20:46:24 tross 54 53
c rop_copy_bw / gr8_rgb16, rop_zoom_out_gr8_rgb16, aggiornati nomi macro RGB16
e
s 00094 / 00047 / 03917
d D 1.53 96 / 06 / 27 04:39:24 tross 53 52
c conversioni pix_type<->ras_type
e
s 00675 / 00343 / 03289
d D 1.52 96 / 06 / 26 02:04:18 tross 52 51
c potrebbero funziare un po' di copy e zoom_out ->rgb16
e
s 00002 / 00001 / 03630
d D 1.51 96 / 05 / 15 22:11:20 tross 51 50
c tmsg.h
e
s 00011 / 00000 / 03620
d D 1.50 96 / 05 / 11 13:34:15 tross 50 49
c variabili non inizializzate
e
s 00001 / 00001 / 03619
d D 1.49 96 / 04 / 10 02:05:56 tross 49 48
c rop_zoom_out_rgb_rgbm(con baco corretto)
e
s 00112 / 00001 / 03508
d D 1.48 96 / 04 / 10 02:01:59 tross 48 47
c 
e
s 00104 / 00010 / 03405
d D 1.47 96 / 03 / 19 18:04:11 tross 47 46
c rop_zoom_out_gr8_rgbm
e
s 00139 / 00010 / 03276
d D 1.46 96 / 03 / 18 20:22:38 tross 46 45
c rop_zoom_out_rgbx
e
s 00003 / 00002 / 03283
d D 1.45 96 / 02 / 08 23:16:51 tross 45 44
c mancava la rop_copy_90 RGB--> RGB_
e
s 00000 / 00002 / 03285
d D 1.44 96 / 02 / 07 18:24:05 tross 44 43
c tolta una printf
e
s 00091 / 00000 / 03196
d D 1.43 95 / 11 / 21 16:33:23 roberto 43 42
c Introdotta rgb to rgbm
e
s 00004 / 00001 / 03192
d D 1.42 95 / 10 / 09 14:57:40 vinz 42 41
c aggiunti i rop_copy RAS_CM16-- > quantized type
e
s 00061 / 00042 / 03132
d D 1.41 95 / 10 / 04 18:16:37 tross 41 40
c corretto baco di rop_copy:fatto rop_copy_same()
e
s 00061 / 00001 / 03113
d D 1.40 95 / 10 / 04 16:05:47 tross 40 39
c rop_[sub] image_to_raster()
e
s 00095 / 00017 / 03019
d D 1.39 95 / 10 / 04 12:27:49 vinz 39 38
c aggiunto il rop_shrink
e
s 00007 / 00007 / 03029
d D 1.38 95 / 09 / 25 02:26:09 tross 38 37
c corretto baco(poco visibile)nei rop_zoom_out... _rgbm()
e
s 00001 / 00004 / 03035
d D 1.37 95 / 09 / 20 15:57:00 tross 37 36
c migliorate rop_custom_fill_cmap_ramp / buffer
e
s 00060 / 00000 / 02979
d D 1.36 95 / 09 / 19 17:22:55 tross 36 35
c rop_custom_fill_cmap_ramp / buffer
e
s 00002 / 00006 / 02977
d D 1.35 95 / 07 / 28 21:35:43 tross 35 34
c estetica
e
s 00004 / 00000 / 02979
d D 1.34 95 / 07 / 28 17:17:40 grisu 34 33
c corretto un baco sull' offset della cmap
e
s 00001 / 00001 / 02978
d D 1.33 95 / 07 / 28 15:22:33 tross 33 32
c corretto baco di un controllo in rop_fill_cmap_buffer
e
s 00119 / 00005 / 02860
d D 1.32 95 / 07 / 27 21:36:31 tross 32 31
c rop_fill_cmap_ramp / buffer
e
s 00275 / 00022 / 02590
d D 1.31 95 / 07 / 27 00:05:00 tross 31 30
c rop_zoom_out_cm16_rgbm, rop_zoom_out_rgbm
e
s 00003 / 00001 / 02609
d D 1.30 95 / 07 / 09 22:23:39 tross 30 29
c messaggio in rop_zoom_out access violation
e
s 00043 / 00034 / 02567
d D 1.29 95 / 07 / 04 01:50:38 tross 29 28
c rop_zoom_out a scacchiera, cmap_offset presottratto a varie funz
e
s 00531 / 00005 / 02070
d D 1.28 95 / 07 / 04 00:46:11 tross 28 27
c con rop_zoom_out funzionante per cm16_rgb_
e
s 00003 / 00001 / 02072
d D 1.27 95 / 07 / 03 15:38:32 tross 27 26
c messaggio completo in caso di access violation
e
s 00086 / 00000 / 01987
d D 1.26 94 / 12 / 28 21:07:43 tross 26 25
c aggiunta rop_copy_90_rgbm
e
s 00043 / 00000 / 01944
d D 1.25 94 / 11 / 30 22:03:25 tross 25 24
c aggiunto rop_add / remove_white_to / from_cmap
e
s 00001 / 00001 / 01943
d D 1.24 94 / 10 / 26 00:28:46 tross 24 23
c corretto baco rop_copy_rgb_rgbm
e
s 00147 / 00014 / 01797
d D 1.23 94 / 09 / 16 19:45:57 tross 23 22
c cm8
e
s 00231 / 00000 / 01580
d D 1.22 94 / 09 / 16 00:02:27 tross 22 21
c rop_copy_90_bw / gr8_rgbm
e
s 00243 / 00027 / 01337
d D 1.21 94 / 09 / 11 20:52:53 tross 21 20
c con rop_copy_90-- > cm16
e
s 00243 / 00000 / 01121
d D 1.20 94 / 09 / 05 23:18:47 tross 20 19
c iniziato rop_reduce
e
s 00059 / 00000 / 01062
d D 1.19 94 / 06 / 07 07:01:19 tross 19 18
c rop_copy WB->RGBM
e
s 00096 / 00004 / 00966
d D 1.18 94 / 06 / 01 00:42:00 tross 18 17
c con cura dimagrante per entrare nella cassetta
e
s 00124 / 00001 / 00846
d D 1.17 94 / 04 / 29 23:15:12 tross 17 16
c rop_copy_90_bw_gr8
e
s 00009 / 00009 / 00838
d D 1.16 94 / 04 / 14 23:21:49 tross 16 15
c wrap((+7) / 8)
e
s 00155 / 00001 / 00692
d D 1.15 94 / 04 / 06 16:19:14 tross 15 14
c rop_copy_90_bw piu' veloce
e
s 00273 / 00068 / 00420
d D 1.14 94 / 04 / 06 03:25:39 tross 14 13
c rop_copy_90 pare funzionare per bw e gr8
e
s 00003 / 00003 / 00485
d D 1.13 94 / 03 / 31 19:38:31 tross 13 12
c 
e
s 00012 / 00008 / 00476
d D 1.12 94 / 03 / 30 21:06:15 tross 12 11
c 
e
s 00001 / 00001 / 00483
d D 1.11 94 / 03 / 30 20:46:54 tross 11 10
c 
e
s 00030 / 00048 / 00454
d D 1.10 94 / 03 / 30 20:45:37 tross 10 9
c rimesso a posto il wrap(in pixel)
e
s 00007 / 00000 / 00495
d D 1.9 94 / 03 / 30 17:30:50 tross 9 8
c rop_pixbytes
e
s 00021 / 00006 / 00474
d D 1.8 94 / 03 / 13 17:41:53 tross 8 7
c corretto baco su rop_copy tra dimensioni diverse
e
s 00005 / 00001 / 00475
d D 1.7 94 / 03 / 11 14:04:27 tross 7 6
c bachetto rop_copy, per 3.01j
e
s 00187 / 00001 / 00289
d D 1.6 94 / 03 / 11 13:48:45 tross 6 5
c per 3.01j
e
s 00024 / 00027 / 00266
d D 1.5 94 / 03 / 02 15:14:56 tross 5 4
c cmap per copy bw->cm16 sempre lunga 256
e
s 00125 / 00008 / 00168
d D 1.4 94 / 02 / 28 15:53:37 tross 4 3
c rop_copy per RAS_BW e RAS_WB
e
s 00002 / 00000 / 00174
d D 1.3 94 / 02 / 19 22:17:18 tross 3 2
c per fullwarn su os_4
e
s 00024 / 00019 / 00150
d D 1.2 94 / 02 / 10 14:04:52 tross 2 1
c cambiati i RAS_
e
s 00169 / 00000 / 00000
d D 1.1 94 / 02 / 04 22:02:58 tross 1 0
c date and time created 94 / 02 / 04 22:02:58 by tross
e
u
U
f e 0
t
T
I 14
D 32

#ifdef DEBUG
#include "stopwatch.h"
#endif

E 32
E 14
I 1
#include <stdio.h>
#include <string.h>
I 40
#include <stdlib.h>
E 40
I 32
#include <assert.h>
E 32
#include "toonz.h"
I 51
#include "tmsg.h"
E 51
D 39
#include "raster.h"
E 39
I 39
D 40
#include "rasterwork.h"
E 40
I 40
#include "raster.h"
E 40
E 39
#include "raster_p.h"

I 99
#define MEMORY_PRINTF
E 99
I 32
#define STW_DISABLE
#include "stopwatch.h"

I 61
#define BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) \
	(((UCHAR *)(BUF))[(((X) + (BITOFFS)) >> 3) + (Y) * (BYTEWRAP)])

#define GET_BIT(X, Y, BUF, BYTEWRAP, BITOFFS) \
	((BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) >> (7 - (((X) + (BITOFFS)) & 7))) & (UCHAR)1)

#define SET_BIT_0(X, Y, BUF, BYTEWRAP, BITOFFS) \
	(BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) &= ~(1 << (7 - (((X) + (BITOFFS)) & 7))))

#define SET_BIT_1(X, Y, BUF, BYTEWRAP, BITOFFS) \
	(BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) |= (1 << (7 - (((X) + (BITOFFS)) & 7))))

#define BITCPY(XO, YO, BUFO, BYTEWRAPO, BITOFFSO, XI, YI, BUFI, BYTEWRAPI, BITOFFSI) \
	{                                                                                \
		if (GET_BIT(XI, YI, BUFI, BYTEWRAPI, BITOFFSI))                              \
			SET_BIT_1(XO, YO, BUFO, BYTEWRAPO, BITOFFSO);                            \
		else                                                                         \
			SET_BIT_0(XO, YO, BUFO, BYTEWRAPO, BITOFFSO);                            \
	}

I 62
#define GET_BWBIT(BIT, BUF) \
	(((BUF)[(BIT) >> 3] >> (7 - ((BIT)&7))) & 1)

I 84
#define MAGICFAC (257U * 256U + 1U)

#define MAP24 PIX_CM24_PENMAP_COLMAP_TO_RGBM
#define MAP24_64 PIX_CM24_PENMAP_COLMAP_TO_RGBM64

I 95
#define PIX_RGB16_FROM_USHORT(R, G, B)                                \
	(((((R)*BYTE_FROM_USHORT_MAGICFAC) + (1 << 23)) >> 16) & 0xf800 | \
	 ((((G)*BYTE_FROM_USHORT_MAGICFAC) + (1 << 23)) >> 21) & 0x07e0 | \
	 ((((B)*BYTE_FROM_USHORT_MAGICFAC) + (1 << 23)) >> 27))

D 96
#define PIX_RGB16_FROM_RGBX64(L) (PIX_RGB16_FROM_USHORT((L).r, (L).g, (L).b))
E 96
I 96
#define PIX_XRGB1555_FROM_USHORT(R, G, B)                             \
	(((((R)*BYTE_FROM_USHORT_MAGICFAC) + (1 << 23)) >> 17) & 0x7c00 | \
	 ((((G)*BYTE_FROM_USHORT_MAGICFAC) + (1 << 23)) >> 22) & 0x03e0 | \
	 ((((B)*BYTE_FROM_USHORT_MAGICFAC) + (1 << 23)) >> 27))
E 96

I 96
#define PIX_RGB16_FROM_RGBX64(L) (PIX_RGB16_FROM_USHORT((L).r, (L).g, (L).b))
#define PIX_XRGB1555_FROM_RGBX64(L) (PIX_XRGB1555_FROM_USHORT((L).r, (L).g, (L).b))

E 96
E 95
E 84
I 66
D 74

E 74
E 66
E 62
	/*---------------------------------------------------------------------------*/

E 61
D 52

E 52
E 32
I 6
D 14
	/* TOGLIERE QUESTA ROBA (chiedere a Walter) */
E 14 static void rop_copy_90_bw(RASTER *rin, RASTER *rout,
											 int x1, int y1, int x2, int y2,
											 int newx, int newy,
D 14 int ninety, int flip);
E 14
I 14
		           int mirror, int ninety);
E 14 static void rop_copy_90_gr8(RASTER *rin, RASTER *rout,
								  int x1, int y1, int x2, int y2,
								  int newx, int newy,
D 14 int ninety, int flip);
E 14
I 14
		            int mirror, int ninety);
I 21 static void rop_copy_90_gr8_cm16(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy,
									   int mirror, int ninety);
I 84 static void rop_copy_90_gr8_cm24(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy,
									   int mirror, int ninety);
E 84
I 22 static void rop_copy_90_gr8_rgbm(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy,
										int mirror, int ninety);
I 55 static void rop_copy_90_gr8_rgb16(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy,
										int mirror, int ninety);
E 55
I 23 static void rop_copy_90_cm8_cm16(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy,
										int mirror, int ninety);
I 84 static void rop_copy_90_cm8_cm24(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy,
									   int mirror, int ninety);
E 84
E 23
E 22
E 21
I 17 static void rop_copy_90_bw_gr8(RASTER *rin, RASTER *rout,
									  int x1, int y1, int x2, int y2,
									  int newx, int newy,
									  int mirror, int ninety);
I 21 static void rop_copy_90_bw_cm16(RASTER *rin, RASTER *rout,
									  int x1, int y1, int x2, int y2,
									  int newx, int newy,
									  int mirror, int ninety);
I 84 static void rop_copy_90_bw_cm24(RASTER *rin, RASTER *rout,
									  int x1, int y1, int x2, int y2,
									  int newx, int newy,
									  int mirror, int ninety);
E 84
I 55 static void rop_copy_90_bw_rgb16(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy,
										int mirror, int ninety);
E 55
I 22 static void rop_copy_90_bw_rgbm(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy,
									   int mirror, int ninety);
I 26 static void rop_copy_90_rgbm(RASTER *rin, RASTER *rout,
								   int x1, int y1, int x2, int y2,
								   int newx, int newy,
								   int mirror, int ninety);
I 63 static void rop_copy_90_rgb_rgb16(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy,
										int mirror, int ninety);
E 63
I 43 static void rop_copy_90_rgb_rgbm(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy,
										int mirror, int ninety);
E 43
I 40

I 104 static void rop_copy_bw(RASTER *rin, RASTER *rout,
								int x1, int y1, int x2, int y2,
								int newx, int newy);

E 104
	/*---------------------------------------------------------------------------*/

I 88
D 89 static LPIXEL
rop_premult(LPIXEL color)
{
	UINT m, mm;
	LPIXEL new_color;

	m = color.m;
	if (m == 255)
		new_color = color;
	else if (m == 0) {
		new_color.r = 0;
		new_color.g = 0;
		new_color.b = 0;
		new_color.m = 0;
	} else {
		mm = m * MAGICFAC;
		new_color.r = (color.r * mm + (1U << 23)) >> 24;
		new_color.g = (color.g * mm + (1U << 23)) >> 24;
		new_color.b = (color.b * mm + (1U << 23)) >> 24;
		new_color.m = m;
	}
	return new_color;
}

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

E 89
E 88
D 79 void rop_image_to_raster(IMAGE *img, RASTER *ras, int build_cmap)
E 79
I 79 void rop_image_to_raster(IMAGE *img, RASTER *ras, int get_cmap)
E 79
{
	rop_subimage_to_raster(img, 0, 0, img->pixmap.xsize - 1, img->pixmap.ysize - 1,
D 79 ras, build_cmap);
E 79
I 79
			ras, get_cmap);
E 79
}

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

void rop_subimage_to_raster (IMAGE *img,
                             int img_x0, int img_y0, int img_x1, int img_y1,
D 79
                             RASTER *ras, int build_cmap)
E 79
I 79
                             RASTER *ras, int get_cmap)
E 79
{
	int i;

	NOT_LESS_THAN(0, img_x0)
	NOT_LESS_THAN(0, img_y0)
	NOT_MORE_THAN(img->pixmap.xsize - 1, img_x1)
	NOT_MORE_THAN(img->pixmap.ysize - 1, img_y1)
	assert(img_x0 <= img_x1);
	assert(img_y0 <= img_y1);
	memset(ras, 0, sizeof(*ras));
	switch (img->type) {
		CASE CMAPPED : ras->type = RAS_CM16;
		D 76 ras->buffer = (USHORT *)img->pixmap.buffer + img_x0
E 76
I 76 ras->native_buffer = ras->buffer = (USHORT *)img->pixmap.buffer + img_x0
E 76 + img_y0 * img->pixmap.xsize;
		I 84 CASE CMAPPED24 : ras->type = RAS_CM24;
		ras->native_buffer = ras->buffer = (ULONG *)img->pixmap.buffer + img_x0 + img_y0 * img->pixmap.xsize;
		E 84 CASE RGB : ras->type = RAS_RGBM;
		D 76 ras->buffer = (ULONG *)img->pixmap.buffer + img_x0
E 76
I 76
D 94 ras->native_buffer = ras->buffer = (ULONG *)img->pixmap.buffer + img_x0
E 94
I 94 ras->native_buffer = ras->buffer = (LPIXEL *)img->pixmap.buffer + img_x0
E 94
E 76 + img_y0 * img->pixmap.xsize;
		I 94 CASE RGB64 : ras->type = RAS_RGBM64;
		ras->native_buffer = ras->buffer = (SPIXEL *)img->pixmap.buffer + img_x0 + img_y0 * img->pixmap.xsize;
		E 94
D 78 DEFAULT : assert(FALSE);
		E 78
I 78 DEFAULT : abort();
		E 78
	}
	I 89 ras->extra_mask = img->pixmap.extra_mask;
	if (img->type != CMAPPED24 && img->pixmap.extra_mask)
		ras->native_extra = ras->extra = img->pixmap.extra + img_x0 + img_y0 * img->pixmap.xsize;
	else
		ras->native_extra = ras->extra = NIL;

	E 89 ras->wrap = img->pixmap.xsize;
	ras->lx = img_x1 - img_x0 + 1;
	ras->ly = img_y1 - img_y0 + 1;
	D 56 ras->glob_matte = 0xff;
	if (ras->type == RAS_CM16)
		E 56
I 56
D 84 if (ras->type == RAS_CM8 || ras->type == RAS_CM16)
E 84
I 84 if (ras->type == RAS_CM8 || ras->type == RAS_CM16 || ras->type == RAS_CM24)
E 84
E 56
		{
			D 56 ras->cmap.offset = img->cmap.offset;
			ras->cmap.size = img->cmap.size;
			E 56
I 56
D 82 ras->cmap.size = img->cmap.size;
			E 82 ras->cmap.info = img->cmap.info;
			E 56
D 79 if (build_cmap)
			{
				TMALLOC(ras->cmap.buffer, ras->cmap.size)
				for (i = 0; i < ras->cmap.size; i++) {
					D 60 ras->cmap.buffer[i].r = img->cmap.buffer[i].red;
					ras->cmap.buffer[i].g = img->cmap.buffer[i].green;
					ras->cmap.buffer[i].b = img->cmap.buffer[i].blue;
					ras->cmap.buffer[i].m = img->cmap.buffer[i].matte;
					E 60
I 60 ras->cmap.buffer[i].r = img->cmap.buffer[i].r;
					ras->cmap.buffer[i].g = img->cmap.buffer[i].g;
					ras->cmap.buffer[i].b = img->cmap.buffer[i].b;
					ras->cmap.buffer[i].m = img->cmap.buffer[i].m;
					E 60
				}
			}
			E 79
I 79 if (get_cmap)
D 84 ras->cmap.buffer = img->cmap.buffer;
			E 84
I 84
			{
				ras->cmap.buffer = img->cmap.buffer;
				ras->cmap.penbuffer = img->cmap.penbuffer;
				ras->cmap.colbuffer = img->cmap.colbuffer;
			}
			E 84
E 79 else D 84 ras->cmap.buffer = NIL;
			E 84
I 84
			{
				ras->cmap.buffer = NIL;
				ras->cmap.penbuffer = NIL;
				ras->cmap.colbuffer = NIL;
			}
			E 84
		}
}
E 40
E 26
E 22
E 21
E 17
E 14

E 6
	/*---------------------------------------------------------------------------*/

I 88
	/* ATTENZIONE !!!!! Esiste una copia esatta di questa func 
 in sources/util/image/timage/timg.c, per evitare che la image dipenda dalla
 raster; ogni modifica di questa va anche riportata li'. Vincenzo */
 
E 88 int
rop_pixbits(RAS_TYPE rastertype)
{
	D 2
		/* attenzione: appena entra il primo tipo non multiplo di 8 bits
 * tutto il codice di questo pacchetto va ricontrollato da cima a fondo
 */

E 2 switch (rastertype)
	{
		D 2 CASE RAS_BW : return 8;
		CASE RAS_CM : return 16;
		E 2
I 2
D 39 CASE RAS_BW : return 1;
		CASE RAS_WB : return 1;
		CASE RAS_GR8 : return 8;
		I 23 CASE RAS_CM8 : return 8;
		E 23 CASE RAS_CM16 : return 16;
		CASE RAS_RGB : return 24;
		CASE RAS_RGB_ : return 32;
		E 2 CASE RAS_RGBM : return 32;
		E 39
I 39 CASE RAS_BW : return 1;
		CASE RAS_MBW16 : return 16;
		CASE RAS_WB : return 1;
		CASE RAS_GR8 : return 8;
		I 90 CASE RAS_GR16 : return 16;
		E 90 CASE RAS_CM8 : return 8;
		D 83 CASE RAS_UNICM8 : return 8;
		E 83
I 72 CASE RAS_CM8S8 : return 8;
		CASE RAS_CM8S4 : return 8;
		E 72 CASE RAS_CM16 : return 16;
		I 98 CASE RAS_CM16S12 : return 16;
		E 98
D 83 CASE RAS_UNICM16 : return 16;
		I 53 CASE RAS_RGB16 : return 16;
		E 83
I 72 CASE RAS_CM16S8 : return 16;
		CASE RAS_CM16S4 : return 16;
		I 84 CASE RAS_CM24 : return 32;
		E 84
I 83 CASE RAS_RGB16 : return 16;
		I 96
D 97 CASE RAS_XRGB1555 : return 16;
		E 97
I 97 CASE RAS_RLEBW : return 1;
		E 97
E 96
E 83
E 72
E 53 CASE RAS_RGB : return 24;
		CASE RAS_RGB_ : return 32;
		CASE RAS_RGBM : return 32;
		I 58 CASE RAS_RGBM64 : return 64;
		CASE RAS_RGB_64 : return 64;
		E 58
E 39 DEFAULT : msg(MSG_IE, "rop_pixbits: invalid rastertype");
	}
	I 3 return 0;
	E 3
}

I 39

E 39
	/*---------------------------------------------------------------------------*/

I 9 int
rop_pixbytes(RAS_TYPE rastertype)
{
	return (rop_pixbits(rastertype) + 7) >> 3;
}

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

E 9 int rop_fillerbits(RAS_TYPE rastertype)
{
	switch (rastertype) {
		D 2 CASE RAS_BW : return FALSE;
		CASE RAS_CM : return FALSE;
		E 2
I 2
D 39 CASE RAS_BW : return TRUE;
		CASE RAS_WB : return TRUE;
		CASE RAS_GR8 : return FALSE;
		I 23 CASE RAS_CM8 : return FALSE;
		E 23 CASE RAS_CM16 : return FALSE;
		CASE RAS_RGB : return FALSE;
		CASE RAS_RGB_ : return FALSE;
		E 2 CASE RAS_RGBM : return FALSE;
		E 39
I 39
D 84 CASE RAS_BW : return TRUE;
		CASE RAS_WB : return TRUE;
		CASE RAS_MBW16 : return FALSE;
		CASE RAS_GR8 : return FALSE;
		CASE RAS_CM8 : return FALSE;
		D 83 CASE RAS_UNICM8 : return FALSE;
		E 83 CASE RAS_CM16 : return FALSE;
		D 83 CASE RAS_UNICM16 : return FALSE;
		E 83
I 53 CASE RAS_RGB16 : return FALSE;
		E 53 CASE RAS_RGB : return FALSE;
		CASE RAS_RGB_ : return FALSE;
		CASE RAS_RGBM : return FALSE;
		I 59 CASE RAS_RGBM64 : return FALSE;
		E 59
E 39 DEFAULT : msg(MSG_IE, "rop_fillerbits: invalid rastertype");
		E 84
I 84 CASE RAS_BW : return TRUE;
		CASE RAS_WB : return TRUE;
	DEFAULT:
		return FALSE;
		E 84
	}
	I 3 return 0;
	E 3
}

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

I 53 RAS_TYPE rop_standard_ras_type_of_pix_type(PIX_TYPE pix_type)
{
	switch (pix_type) {
		D 96 CASE PIX_NONE : return RAS_NONE;
		CASE PIX_BW : return RAS_BW;
		CASE PIX_WB : return RAS_WB;
		CASE PIX_GR8 : return RAS_GR8;
		CASE PIX_CM8 : return RAS_CM8;
		CASE PIX_CM16 : return RAS_CM16;
		I 84 CASE PIX_CM24 : return RAS_CM24;
		E 84
I 72 CASE PIX_CM8S8 : return RAS_CM8S8;
		CASE PIX_CM8S4 : return RAS_CM8S4;
		CASE PIX_CM16S8 : return RAS_CM16S8;
		CASE PIX_CM16S4 : return RAS_CM16S4;
		E 72 CASE PIX_RGB16 : return RAS_RGB16;
		CASE PIX_RGB : return RAS_RGB;
		CASE PIX_RGB_ : return RAS_RGB_;
		CASE PIX_RGBM : return RAS_RGBM;
		E 96
I 96 CASE PIX_NONE : return RAS_NONE;
		CASE PIX_BW : return RAS_BW;
		CASE PIX_WB : return RAS_WB;
		CASE PIX_GR8 : return RAS_GR8;
		CASE PIX_CM8 : return RAS_CM8;
		CASE PIX_CM16 : return RAS_CM16;
		CASE PIX_CM24 : return RAS_CM24;
		CASE PIX_CM8S8 : return RAS_CM8S8;
		CASE PIX_CM8S4 : return RAS_CM8S4;
		I 98 CASE PIX_CM16S12 : return RAS_CM16S12;
		E 98 CASE PIX_CM16S8 : return RAS_CM16S8;
		CASE PIX_CM16S4 : return RAS_CM16S4;
		CASE PIX_RGB16 : return RAS_RGB16;
		D 97 CASE PIX_XRGB1555 : return RAS_XRGB1555;
		E 97 CASE PIX_RGB : return RAS_RGB;
		CASE PIX_RGB_ : return RAS_RGB_;
		CASE PIX_RGBM : return RAS_RGBM;
		E 96 DEFAULT :
D 63 assert(FALSE);
		return RAS_NONE;
		E 63
I 63
D 78 assert(FALSE);
		E 78
I 78 abort();
		E 78
E 63
	}
	I 63 return RAS_NONE;
	E 63
}

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

PIX_TYPE rop_pix_type_of_ras_type(RAS_TYPE ras_type)
{
	switch (ras_type) {
		D 96 CASE RAS_NONE : return PIX_NONE;
		CASE RAS_BW : return PIX_BW;
		CASE RAS_WB : return PIX_WB;
		CASE RAS_GR8 : return PIX_GR8;
		I 90 CASE RAS_GR16 : return PIX_RGB16;
		E 90 CASE RAS_CM8 : return PIX_CM8;
		CASE RAS_CM16 : return PIX_CM16;
		CASE RAS_RGB16 : return PIX_RGB16;
		CASE RAS_RGB : return PIX_RGB;
		CASE RAS_RGB_ : return PIX_RGB_;
		CASE RAS_RGBM : return PIX_RGBM;
		CASE RAS_MBW16 : return PIX_BW;
		D 83 CASE RAS_UNICM8 : return PIX_CM8;
		CASE RAS_UNICM16 : return PIX_CM16;
		E 83
I 72 CASE RAS_CM8S8 : return PIX_CM8S8;
		CASE RAS_CM8S4 : return PIX_CM8S4;
		CASE RAS_CM16S8 : return PIX_CM16S8;
		CASE RAS_CM16S4 : return PIX_CM16S4;
		I 84 CASE RAS_CM24 : return PIX_CM24;
		E 96
I 96 CASE RAS_NONE : return PIX_NONE;
		CASE RAS_BW : return PIX_BW;
		CASE RAS_WB : return PIX_WB;
		CASE RAS_GR8 : return PIX_GR8;
		CASE RAS_GR16 : return PIX_RGB16;
		CASE RAS_CM8 : return PIX_CM8;
		CASE RAS_CM16 : return PIX_CM16;
		CASE RAS_RGB16 : return PIX_RGB16;
		D 97 CASE RAS_XRGB1555 : return PIX_XRGB1555;
		E 97 CASE RAS_RGB : return PIX_RGB;
		CASE RAS_RGB_ : return PIX_RGB_;
		CASE RAS_RGBM : return PIX_RGBM;
		CASE RAS_MBW16 : return PIX_BW;
		CASE RAS_CM8S8 : return PIX_CM8S8;
		CASE RAS_CM8S4 : return PIX_CM8S4;
		I 98 CASE RAS_CM16S12 : return PIX_CM16S12;
		E 98 CASE RAS_CM16S8 : return PIX_CM16S8;
		CASE RAS_CM16S4 : return PIX_CM16S4;
		CASE RAS_CM24 : return PIX_CM24;
		E 96
E 84
E 72 DEFAULT :
D 63 assert(FALSE);
		return PIX_NONE;
		E 63
I 63
D 78 assert(FALSE);
		E 78
I 78 abort();
		E 78
E 63
	}
	I 63 return PIX_NONE;
	E 63
}

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

I 74 void rop_premultiply(RASTER *rin, RASTER *rout)
{
	int x, y, wrapin, wrapout, lx, ly;
	LPIXEL *in, *out, val, transp;
	SPIXEL *in64, *out64, val64, transp64;
	UINT m;

	D 84
#define MAGICFAC (257U * 256U + 1U)
E 84
#define PREMULT(V, M)                            \
	{                                            \
		UINT mm = (M)*MAGICFAC;                  \
		(V).r = ((V).r * mm + (1U << 23)) >> 24; \
		(V).g = ((V).g * mm + (1U << 23)) >> 24; \
		(V).b = ((V).b * mm + (1U << 23)) >> 24; \
	}

#define PREMULT64(V, M)                               \
	{                                                 \
		double mf = (double)(M) * (1.0 / 65535.0);    \
		(V).r = (USHORT)((double)((V).r) * mf + 0.5); \
		(V).g = (USHORT)((double)((V).g) * mf + 0.5); \
		(V).b = (USHORT)((double)((V).b) * mf + 0.5); \
	}

		assert(rin->lx == rout->lx && rin->ly == rout->ly);
	wrapin = rin->wrap;
	wrapout = rout->wrap;
	lx = rin->lx;
	ly = rin->ly;
	switch (RASRAS(rin->type, rout->type)) {
		CASE RASRAS(RAS_RGBM64, RAS_RGBM64) : transp64.r = transp64.g = transp64.b = transp64.m = 0;
		D 75 for (y = ly; y > 0; y--)
E 75
I 75 for (y = 0; y < ly; y++)
E 75
		{
			in64 = ((SPIXEL *)rin->buffer) + y * wrapin;
			out64 = ((SPIXEL *)rout->buffer) + y * wrapout;
			D 75 for (x = lx; x > 0; x--)
E 75
I 75 for (x = 0; x < lx; x++)
E 75
			{
				val64 = *in64++;
				m = val64.m;
				if (!m)
					*out64++ = transp64;
				D 104 else if (m == 255U)
E 104
I 104 else if (m == 0xffff)
E 104
					*out64++ = val64;
				else
				{
					PREMULT64(val64, m)
					*out64++ = val64;
				}
			}
		}
		CASE RASRAS(RAS_RGBM, RAS_RGBM) : transp.r = transp.g = transp.b = transp.m = 0;
		D 75 for (y = ly; y > 0; y--)
E 75
I 75 for (y = 0; y < ly; y++)
E 75
		{
			in = ((LPIXEL *)rin->buffer) + y * wrapin;
			out = ((LPIXEL *)rout->buffer) + y * wrapout;
			D 75 for (x = lx; x > 0; x--)
E 75
I 75 for (x = 0; x < lx; x++)
E 75
			{
				val = *in++;
				m = val.m;
				if (!m)
					*out++ = transp;
				else if (m == 255U)
					*out++ = val;
				else {
					PREMULT(val, m)
					*out++ = val;
				}
			}
		}
	DEFAULT:
		D 78 assert(FALSE);
		E 78
I 78 abort();
		E 78
	}
	I 89 if (rout->extra_mask)
		rop_copy_extra(rin, rout, 0, 0, lx - 1, ly - 1, 0, 0);
	E 89
}

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

E 74
E 53
I 41 static void rop_copy_same(RASTER *rin, RASTER *rout,
								 int x1, int y1, int x2, int y2,
								 int newx, int newy)
{
	UCHAR *rowin, *rowout;
	int rowsize, bytewrapin, bytewrapout, d;
	int pixbits_in, pixbits_out;
	int pixbytes_in, pixbytes_out;

	I 104 if (((rin->type == RAS_BW) &&
				(rout->type == RAS_BW)) ||
			   ((rin->type == RAS_WB) &&
				(rout->type == RAS_WB)))
	{
		rop_copy_bw(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}

	E 104 pixbits_in = rop_pixbits(rin->type);
	pixbytes_in = rop_pixbytes(rin->type);
	pixbits_out = rop_pixbits(rout->type);
	pixbytes_out = rop_pixbytes(rout->type);

	/* pixsize compatibili */
	assert(pixbits_in == pixbits_out);

	/* per adesso niente pixel non multipli di 8 bits */
	assert(!rop_fillerbits(rin->type));
	assert(!rop_fillerbits(rout->type));

	/* copia */
	rowsize = pixbytes_in * (x2 - x1 + 1);
	bytewrapin = rin->wrap * pixbytes_in;
	bytewrapout = rout->wrap * pixbytes_out;
	rowin = (UCHAR *)rin->buffer + y1 * bytewrapin + ((x1 * pixbits_in) >> 3);
	rowout = (UCHAR *)rout->buffer + newy * bytewrapout + ((newx * pixbits_out) >> 3);
	d = y2 - y1 + 1;
	while (d-- > 0) {
		memmove(rowout, rowin, rowsize);
		rowin += bytewrapin;
		rowout += bytewrapout;
	}
	I 89 if (rin->type == RAS_CM24 && rout->type == RAS_CM24)
		CLEAR_NEW_EXTRA_BITS_OF_RECT(rout, newx, newy, newx + x2 - x1, newy + y2 - y1, rin)
}

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

void rop_copy_extra(RASTER *rin, RASTER *rout,
					int x1, int y1, int x2, int y2,
					int newx, int newy)
{
	UCHAR *rowin, *rowout, *pixin, *pixout;
	ULONG *rowin24, *rowout24, *pixin24, *pixout24;
	int wrapin, wrapout, x, y, lx, ly, tmp;

	if (!rout->extra_mask)
		return;

	if (x1 > x2) {
		tmp = x1;
		x1 = x2;
		x2 = tmp;
	}
	if (y1 > y2) {
		tmp = y1;
		y1 = y2;
		y2 = tmp;
	}
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	if (rin->extra_mask) {
		wrapin = rin->wrap;
		wrapout = rout->wrap;
		if (rin->type == RAS_CM24) {
			rowin24 = (ULONG *)rin->buffer + x1 + y1 * wrapin;
			if (rout->type == RAS_CM24) {
				rowout24 = (ULONG *)rout->buffer + newx + newy * wrapout;
				for (y = 0; y < ly; y++) {
					pixin24 = rowin24;
					pixout24 = rowout24;
					for (x = 0; x < lx; x++) {
						*pixout24 = *pixout24 & 0x00ffffff | *pixin24 & 0xff000000;
						pixin24++;
						pixout24++;
					}
					rowin24 += wrapin;
					rowout24 += wrapout;
				}
			} else {
				rowout = rout->extra + newx + newy * wrapout;
				for (y = 0; y < ly; y++) {
					pixin24 = rowin24;
					pixout = rowout;
					for (x = 0; x < lx; x++) {
						*pixout = (UCHAR)(*pixin24 >> 24);
						pixin24++;
						pixout++;
					}
					rowin24 += wrapin;
					rowout += wrapout;
				}
			}
		} else {
			rowin = rin->extra + x1 + y1 * wrapin;
			if (rout->type == RAS_CM24) {
				rowout24 = (ULONG *)rout->buffer + newx + newy * wrapout;
				for (y = 0; y < ly; y++) {
					pixin = rowin;
					pixout24 = rowout24;
					for (x = 0; x < lx; x++) {
						*pixout24 = *pixout24 & 0x00ffffff | *pixin << 24;
						pixin++;
						pixout24++;
					}
					rowin += wrapin;
					rowout24 += wrapout;
				}
			} else {
				rowout = rout->extra + newx + newy * wrapout;
				for (y = 0; y < ly; y++) {
					memmove(rowout, rowin, lx);
					rowin += wrapin;
					rowout += wrapout;
				}
			}
		}
	}
	CLEAR_NEW_EXTRA_BITS_OF_RECT(rout, newx, newy, newx + lx - 1, newy + ly - 1, rin)
	E 89
}

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

E 41
I 18 static void rop_copy_gr8_rgbm(RASTER *rin, RASTER *rout,
									 int x1, int y1, int x2, int y2,
									 int newx, int newy)
{
	LPIXEL *rowout, *pixout;
	UCHAR *rowin, *pixin;
	int wrapin, wrapout;
	int x, lx, ly;
	LPIXEL tmp;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (UCHAR *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;

	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			tmp.r = *pixin;
			tmp.g = *pixin;
			tmp.b = *pixin;
			tmp.m = 0xff;
			*pixout++ = tmp;
			pixin++;
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

I 20
D 84 static void rop_reduce_gr8_rgbm(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy, int factor)
{
	printf("rop_reduce_gr8_rgbm not implemented yet\n");
}

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

E 84
I 28
static void rop_zoom_out_gr8_rgbm(RASTER *rin, RASTER *rout,
D 31
                                int x1, int y1, int x2, int y2,
			        int newx, int newy, int factor)
E 31
I 31
                                  int x1, int y1, int x2, int y2,
			          int newx, int newy, int abs_zoom_level)
E 31
{
	D 47 printf("rop_zoom_out_gr8_rgbm not implemented yet\n");
	E 47
I 47 UCHAR *rowin, *pixin, *in;
	LPIXEL *rowout, *pixout, valout;
	int tmp;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;
	valout.m = 0xff;

	rowin = (UCHAR *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					tmp += *in;
					in += wrapin;
					in++;
					tmp += *in;
					in -= wrapin;
					in++;
				}
				in += 2 * wrapin - factor;
			}
			valout.r = valout.g = valout.b = (tmp + fac_fac_4) >> fac_fac_2_bits;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					tmp += pixin[i + j * wrapin];
				}
			valout.r = valout.g = valout.b = (tmp + fac_xrest_2) / fac_xrest;
			*pixout = valout;
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					tmp += pixin[i + j * wrapin];
				}
			valout.r = valout.g = valout.b = (tmp + yrest_fac_2) / yrest_fac;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					tmp += pixin[i + j * wrapin];
				}
			valout.r = valout.g = valout.b = (tmp + yrest_xrest_2) / yrest_xrest;
			*pixout = valout;
		}
	}
	E 47
}

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

E 28
E 20
E 18
D 2 static void rop_copy_cm_rgbm(RASTER *rin, RASTER *rout,
								   int x1, int y1, int x2, int y2,
								   int newx, int newy)
E 2
I 2 static void rop_copy_cm16_rgbm(RASTER *rin, RASTER *rout,
									 int x1, int y1, int x2, int y2,
									 int newx, int newy)
E 2
{
	LPIXEL *rowout, *pixout, *cmap;
	USHORT *rowin, *pixin;
	D 18 int wrapin, wrapout, tmp, cmap_offset;
	E 18
I 18
D 29 int wrapin, wrapout, cmap_offset;
	E 29
I 29 int wrapin, wrapout;
	E 29
E 18 int x, lx, ly;

	D 84 if (!rin->cmap.buffer)
	{
		D 2 printf("### INTERNAL ERROR - rop_copy_2_4; missing color map\n");
		return;
		E 2
I 2 printf("### INTERNAL ERROR - rop_copy_cm16_rgbm; missing color map\n");
		return;
		E 2
	}
	E 84
D 29 cmap = rin->cmap.buffer;
	cmap_offset = rin->cmap.offset;
	E 29
I 29
D 56 cmap = rin->cmap.buffer - rin->cmap.offset;
	E 56
I 56 cmap = rin->cmap.buffer - rin->cmap.info.offset_mask;
	E 56
E 29 lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	D 8 wrapin = rin->wrap;
	wrapout = rout->wrap;
	E 8
I 8
D 10 if ((rin->wrap % sizeof(USHORT)) || (rout->wrap % sizeof(LPIXEL)))
	{
		printf("### INTERNAL ERROR - rop_copy_cm16_rgbm; bad wrap\n");
		return;
	}
	wrapin = rin->wrap / sizeof(USHORT);
	wrapout = rout->wrap / sizeof(LPIXEL);
	E 10
I 10 wrapin = rin->wrap;
	wrapout = rout->wrap;
	E 10
E 8

D 2 rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	E 2
I 2 rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	E 2

		while (ly-- > 0)
	{
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++)
			D 29
				*pixout++ = cmap[*pixin++ - cmap_offset];
		E 29
I 29
			*pixout++ = cmap[*pixin++];
		E 29 rowin += wrapin;
		rowout += wrapout;
	}
}

I 4
	/*---------------------------------------------------------------------------*/

I 84 static void
rop_copy_cm24_rgbm(RASTER *rin, RASTER *rout,
				   int x1, int y1, int x2, int y2,
				   int newx, int newy)
{
	LPIXEL *rowout, *pixout, valout, *penmap, *colmap;
	ULONG *rowin, *pixin, valin;
	I 89 UCHAR *exrow, *expix;
	E 89 int wrapin, wrapout;
	D 89 int x, lx, ly;
	E 89
I 89 int x, lx, ly, lines;
	E 89

		penmap = rin->cmap.penbuffer;
	colmap = rin->cmap.colbuffer;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	I 89 lines = ly;
	E 89 wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (ULONG *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;

	D 89 while (ly-- > 0)
E 89
I 89 if (rin->extra_mask & rout->extra_mask)
E 89
	{
		D 89 pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			valin = *pixin++;
			MAP24(valin, penmap, colmap, valout)
			*pixout++ = valout;
		}
		rowin += wrapin;
		rowout += wrapout;
		E 89
I 89 exrow = rout->extra + wrapout * newy + newx;
		while (lines-- > 0) {
			pixin = rowin;
			pixout = rowout;
			expix = exrow;
			for (x = 0; x < lx; x++) {
				valin = *pixin++;
				MAP24(valin, penmap, colmap, valout)
				*pixout++ = valout;
				*expix++ = (UCHAR)(valin >> 24);
			}
			rowin += wrapin;
			rowout += wrapout;
			exrow += wrapout;
		}
		E 89
	}
	I 89 else while (lines-- > 0)
	{
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			valin = *pixin++;
			MAP24(valin, penmap, colmap, valout)
			*pixout++ = valout;
		}
		rowin += wrapin;
		rowout += wrapout;
	}
	CLEAR_NEW_EXTRA_BITS_OF_RECT(rout, newx, newy, newx + lx - 1, newy + ly - 1, rin)
	E 89
}

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

E 84
I 58 static void rop_copy_cm16_rgbm64(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy)
{
	SPIXEL *rowout, *pixout;
	LPIXEL *cmap, src_pix;
	USHORT *rowin, *pixin;
	int wrapin, wrapout;
	int x, lx, ly;

	D 84 if (!rin->cmap.buffer)
	{
		printf("### INTERNAL ERROR - rop_copy_cm16_rgbm; missing color map\n");
		return;
	}
	E 84 cmap = rin->cmap.buffer - rin->cmap.info.offset_mask;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (SPIXEL *)rout->buffer + wrapout * newy + newx;

	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			src_pix = cmap[*pixin++];
			D 60 ROP_RGBM_TO_RGBM64(src_pix, *pixout)
E 60
I 60 PIX_RGBM_TO_RGBM64(src_pix, *pixout)
E 60 pixout++;
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

I 84 static void rop_copy_cm24_rgbm64(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy)
{
	SPIXEL *rowout, *pixout, valout;
	LPIXEL *penmap, *colmap;
	ULONG *rowin, *pixin, valin;
	I 89 UCHAR *exrow, *expix;
	E 89 int wrapin, wrapout;
	D 89 int x, lx, ly;
	E 89
I 89 int x, lx, ly, lines;
	E 89

		penmap = rin->cmap.penbuffer;
	colmap = rin->cmap.colbuffer;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	I 89 lines = ly;
	E 89 wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (ULONG *)rin->buffer + wrapin * y1 + x1;
	rowout = (SPIXEL *)rout->buffer + wrapout * newy + newx;

	D 89 while (ly-- > 0)
E 89
I 89 if (rin->extra_mask && rout->extra_mask)
E 89
	{
		D 89 pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			valin = *pixin++;
			MAP24_64(valin, penmap, colmap, valout)
			*pixout++ = valout;
		}
		rowin += wrapin;
		rowout += wrapout;
		E 89
I 89 exrow = rout->extra + wrapout * newy + newx;
		while (lines-- > 0) {
			pixin = rowin;
			pixout = rowout;
			expix = exrow;
			for (x = 0; x < lx; x++) {
				valin = *pixin++;
				MAP24_64(valin, penmap, colmap, valout)
				*pixout++ = valout;
				*expix++ = (UCHAR)(valin >> 24);
			}
			rowin += wrapin;
			rowout += wrapout;
			exrow += wrapout;
		}
		E 89
	}
	I 89 else while (lines-- > 0)
	{
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			valin = *pixin++;
			MAP24_64(valin, penmap, colmap, valout)
			*pixout++ = valout;
		}
		rowin += wrapin;
		rowout += wrapout;
	}
	CLEAR_NEW_EXTRA_BITS_OF_RECT(rout, newx, newy, newx + lx - 1, newy + ly - 1, rin)
	E 89
}

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

E 84
static void rop_copy_rgbm_rgbm64(RASTER *rin, RASTER *rout,
D 65
                               int x1, int y1, int x2, int y2,
			       int newx, int newy)
E 65
I 65
                                 int x1, int y1, int x2, int y2,
			         int newx, int newy)
E 65
{
	SPIXEL *rowout, *pixout;
	LPIXEL *rowin, *pixin;
	int wrapin, wrapout;
	int x, lx, ly;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (LPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (SPIXEL *)rout->buffer + wrapout * newy + newx;

	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			D 60 ROP_RGBM_TO_RGBM64(*pixin, *pixout)
E 60
I 60 PIX_RGBM_TO_RGBM64(*pixin, *pixout)
E 60 pixin++;
			pixout++;
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

static void rop_copy_rgbm64_rgbm(RASTER *rin, RASTER *rout,
D 65
                               int x1, int y1, int x2, int y2,
			       int newx, int newy)
E 65
I 65
                                 int x1, int y1, int x2, int y2,
			         int newx, int newy)
E 65
{
	LPIXEL *rowout, *pixout;
	SPIXEL *rowin, *pixin;
	int wrapin, wrapout;
	int x, lx, ly;
	I 65
D 66 UINT random_round;

#define BYTE_FROM_USHORT_CUSTOM_ROUNDED(X, R) \
	((((X)*BYTE_FROM_USHORT_MAGICFAC) + (R)) >> 24)

#define RGBM64_TO_RGBM_CUSTOM_ROUNDED(S, L, R)               \
	{                                                        \
		(L).r = BYTE_FROM_USHORT_CUSTOM_ROUNDED((S).r, (R)); \
		(L).g = BYTE_FROM_USHORT_CUSTOM_ROUNDED((S).g, (R)); \
		(L).b = BYTE_FROM_USHORT_CUSTOM_ROUNDED((S).b, (R)); \
		(L).m = PIX_BYTE_FROM_USHORT((S).m);                 \
	}
	E 66

D 66 tnz_random_seed(180461);
	E 66
I 66 PIX_INIT_DITHER_RGBM64_TO_RGBM
E 66
E 65

		lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (SPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;

	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			D 60 ROP_RGBM64_TO_RGBM(*pixin, *pixout)
E 60
I 60
D 65 PIX_RGBM64_TO_RGBM(*pixin, *pixout)
E 65
I 65
D 66 random_round = tnz_random_uint();
			random_round &= (1U << 24) - 1;
			RGBM64_TO_RGBM_CUSTOM_ROUNDED(*pixin, *pixout, random_round)
			E 66
I 66 PIX_DITHER_RGBM64_TO_RGBM(*pixin, *pixout) 
E 66
E 65
E 60 pixin++;
			pixout++;
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

I 95 static void rop_copy_rgbx64_rgbx(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy)
{
	LPIXEL *rowout, *pixout;
	SPIXEL *rowin, *pixin;
	int wrapin, wrapout;
	int x, lx, ly;
	UINT random_round;

	PIX_INIT_DITHER_RGBM64_TO_RGBM

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (SPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;

	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			random_round = tnz_random_uint() & ((1U << 24) - 1);
			pixout->r = PIX_DITHER_BYTE_FROM_USHORT(pixin->r, random_round);
			pixout->g = PIX_DITHER_BYTE_FROM_USHORT(pixin->g, random_round);
			pixout->b = PIX_DITHER_BYTE_FROM_USHORT(pixin->b, random_round);
			pixout->m = 0xff;
			pixin++;
			pixout++;
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

E 95
E 58
I 20
D 84 static void rop_reduce_cm16_rgbm(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy, int factor)
E 84
I 84 static void rop_zoom_out_cm16_rgbm(RASTER *rin, RASTER *rout,
										  int x1, int y1, int x2, int y2,
										  int newx, int newy, int abs_zoom_level)
E 84
{
	D 28 printf("rop_reduce_cm16_rgbm not implemented yet\n");
	E 28
I 28
D 84 USHORT *rowin, *pixin;
	E 84
I 84 USHORT *rowin, *pixin, *in;
	E 84 LPIXEL *rowout, *pixout, *cmap, valin, valout;
	int tmp_r, tmp_g, tmp_b, tmp_m;
	D 29 int wrapin, wrapout, cmap_offset;
	E 29
I 29 int wrapin, wrapout;
	E 29 int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	I 84 int factor, fac_fac_2_bits;
	E 84 int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	I 84 int fac_fac_4;
	E 84

D 29 cmap = rin->cmap.buffer;
	cmap_offset = rin->cmap.offset;
	E 29
I 29
D 56 cmap = rin->cmap.buffer - rin->cmap.offset;
	E 56
I 56 cmap = rin->cmap.buffer - rin->cmap.info.offset_mask;
	E 56
E 29 lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	I 84 factor = 1 << abs_zoom_level;
	E 84
D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	I 84 fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	E 84 yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;
	I 84 valout.m = 0xff;
	E 84

		rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			D 84 for (j = 0; j < factor; j++) for (i = 0; i < factor; i++)
E 84
I 84 in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2)
					E 84
					{
						D 29 valin = cmap[pixin[i + j * wrapin] - cmap_offset];
						E 29
I 29
D 84 valin = cmap[pixin[i + j * wrapin]];
						E 84
I 84 valin = cmap[*in];
						tmp_r += valin.r;
						tmp_g += valin.g;
						tmp_b += valin.b;
						tmp_m += valin.m;
						in += wrapin;
						in++;
						valin = cmap[*in];
						E 84
E 29 tmp_r += valin.r;
						tmp_g += valin.g;
						tmp_b += valin.b;
						tmp_m += valin.m;
						I 84 in -= wrapin;
						in++;
						E 84
					}
				D 84 valout.r = (tmp_r + fac_fac_2) / fac_fac;
				valout.g = (tmp_g + fac_fac_2) / fac_fac;
				valout.b = (tmp_b + fac_fac_2) / fac_fac;
				valout.m = (tmp_m + fac_fac_2) / fac_fac;
				E 84
I 84 in += 2 * wrapin - factor;
			}
			valout.r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
			valout.g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
			valout.b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
			valout.m = (tmp_m + fac_fac_4) >> fac_fac_2_bits;
			E 84
				*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					D 29 valin = cmap[pixin[i + j * wrapin] - cmap_offset];
					E 29
I 29 valin = cmap[pixin[i + j * wrapin]];
					E 29 tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = (tmp_r + fac_xrest_2) / fac_xrest;
			valout.g = (tmp_g + fac_xrest_2) / fac_xrest;
			valout.b = (tmp_b + fac_xrest_2) / fac_xrest;
			valout.m = (tmp_m + fac_xrest_2) / fac_xrest;
			*pixout = valout;
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					D 29 valin = cmap[pixin[i + j * wrapin] - cmap_offset];
					E 29
I 29 valin = cmap[pixin[i + j * wrapin]];
					E 29 tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = (tmp_r + yrest_fac_2) / yrest_fac;
			valout.g = (tmp_g + yrest_fac_2) / yrest_fac;
			valout.b = (tmp_b + yrest_fac_2) / yrest_fac;
			valout.m = (tmp_m + yrest_fac_2) / yrest_fac;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					D 29 valin = cmap[pixin[i + j * wrapin] - cmap_offset];
					E 29
I 29 valin = cmap[pixin[i + j * wrapin]];
					E 29 tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = (tmp_r + yrest_xrest_2) / yrest_xrest;
			valout.g = (tmp_g + yrest_xrest_2) / yrest_xrest;
			valout.b = (tmp_b + yrest_xrest_2) / yrest_xrest;
			valout.m = (tmp_m + yrest_xrest_2) / yrest_xrest;
			*pixout = valout;
		}
	}
}

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

D 84 static void rop_zoom_out_cm16_rgbm(RASTER *rin, RASTER *rout,
E 84
I 84 static void rop_zoom_out_cm24_rgbm(RASTER *rin, RASTER *rout,
E 84
D 31 int x1, int y1, int x2, int y2,
													  int newx, int newy, int factor)
E 31
I 31 int x1,
										 int y1, int x2, int y2,
										 int newx, int newy, int abs_zoom_level)
E 31
{
	D 31 printf(" rop_zoom_out_cm16_rgbm not implemented yet\n");
	E 31
I 31
D 84 USHORT *rowin, *pixin, *in;
	LPIXEL *rowout, *pixout, *cmap, valin, valout;
	E 84
I 84 ULONG *rowin, *pixin, *in, win;
	LPIXEL *rowout, *pixout, *penmap, *colmap, valin, valout;
	E 84 int tmp_r, tmp_g, tmp_b, tmp_m;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	D 56 cmap = rin->cmap.buffer - rin->cmap.offset;
	E 56
I 56
D 84 cmap = rin->cmap.buffer - rin->cmap.info.offset_mask;
	E 84
I 84 penmap = rin->cmap.penbuffer;
	colmap = rin->cmap.colbuffer;
	E 84
E 56 lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;
	valout.m = 0xff;

	D 84 rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	E 84
I 84 rowin = (ULONG *)rin->buffer + wrapin * y1 + x1;
	E 84 rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					D 84 valin = cmap[*in];
					E 84
I 84 win = *in;
					MAP24(win, penmap, colmap, valin)
					E 84 tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
					D 38 in += factor;
					in++;
					E 38
I 38 in += wrapin;
					in++;
					E 38
D 84 valin = cmap[*in];
					E 84
I 84 win = *in;
					MAP24(win, penmap, colmap, valin)
					E 84 tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
					D 38 in -= factor;
					E 38
I 38 in -= wrapin;
					E 38 in++;
				}
				in += 2 * wrapin - factor;
			}
			valout.r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
			valout.g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
			valout.b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
			valout.m = (tmp_m + fac_fac_4) >> fac_fac_2_bits;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					D 84 valin = cmap[pixin[i + j * wrapin]];
					E 84
I 84 win = pixin[i + j * wrapin];
					MAP24(win, penmap, colmap, valin)
					E 84 tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = (tmp_r + fac_xrest_2) / fac_xrest;
			valout.g = (tmp_g + fac_xrest_2) / fac_xrest;
			valout.b = (tmp_b + fac_xrest_2) / fac_xrest;
			valout.m = (tmp_m + fac_xrest_2) / fac_xrest;
			*pixout = valout;
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					D 84 valin = cmap[pixin[i + j * wrapin]];
					E 84
I 84 win = pixin[i + j * wrapin];
					MAP24(win, penmap, colmap, valin)
					E 84 tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = (tmp_r + yrest_fac_2) / yrest_fac;
			valout.g = (tmp_g + yrest_fac_2) / yrest_fac;
			valout.b = (tmp_b + yrest_fac_2) / yrest_fac;
			valout.m = (tmp_m + yrest_fac_2) / yrest_fac;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					D 84 valin = cmap[pixin[i + j * wrapin]];
					E 84
I 84 win = pixin[i + j * wrapin];
					MAP24(win, penmap, colmap, valin)
					E 84 tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = (tmp_r + yrest_xrest_2) / yrest_xrest;
			valout.g = (tmp_g + yrest_xrest_2) / yrest_xrest;
			valout.b = (tmp_b + yrest_xrest_2) / yrest_xrest;
			valout.m = (tmp_m + yrest_xrest_2) / yrest_xrest;
			*pixout = valout;
		}
	}
	E 31
}

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

D 46 static void rop_reduce_cm16_rgb_(RASTER *rin, RASTER *rout,
E 46
I 46
D 84 static void rop_reduce_cm16_rgbx(RASTER *rin, RASTER *rout,
E 46 int x1, int y1, int x2, int y2,
													int newx, int newy, int factor)
E 84
I 84 static void rop_zoom_out_cm16_rgbx(RASTER *rin, RASTER *rout,
													int x1, int y1, int x2, int y2,
													int newx, int newy, int abs_zoom_level)
E 84 {
	D 84 USHORT *rowin, *pixin;
	E 84
I 84 USHORT *rowin, *pixin, *in;
	E 84 LPIXEL *rowout, *pixout, *cmap, valin, valout;
	D 84 int tmp_r, tmp_g, tmp_b, tmp_m;
	E 84
I 84 int tmp_r, tmp_g, tmp_b;
	E 84
D 29 int wrapin, wrapout, cmap_offset;
	E 29
I 29 int wrapin, wrapout;
	E 29 int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	I 84 int factor, fac_fac_2_bits;
	E 84 int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	I 84 int fac_fac_4;
	E 84

D 29 cmap = rin->cmap.buffer;
	cmap_offset = rin->cmap.offset;
	E 29
I 29
D 56 cmap = rin->cmap.buffer - rin->cmap.offset;
	E 56
I 56 cmap = rin->cmap.buffer - rin->cmap.info.offset_mask;
	E 56
E 29 lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	I 84 factor = 1 << abs_zoom_level;
	E 84
D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	I 84 fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	E 84 yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;
	valout.m = 0xff;

	rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			D 84 tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < factor; i++)
					E 84
I 84 tmp_r = tmp_g = tmp_b = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2)
					E 84
					{
						D 29 valin = cmap[pixin[i + j * wrapin] - cmap_offset];
						E 29
I 29
D 84 valin = cmap[pixin[i + j * wrapin]];
						E 84
I 84 valin = cmap[*in];
						tmp_r += valin.r;
						tmp_g += valin.g;
						tmp_b += valin.b;
						in += wrapin;
						in++;
						valin = cmap[*in];
						E 84
E 29 tmp_r += valin.r;
						tmp_g += valin.g;
						tmp_b += valin.b;
						I 84 in -= wrapin;
						in++;
						E 84
					}
				D 84 valout.r = (tmp_r + fac_fac_2) / fac_fac;
				valout.g = (tmp_g + fac_fac_2) / fac_fac;
				valout.b = (tmp_b + fac_fac_2) / fac_fac;
				E 84
I 84 in += 2 * wrapin - factor;
			}
			valout.r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
			valout.g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
			valout.b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
			E 84
				*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			D 84 tmp_r = tmp_g = tmp_b = tmp_m = 0;
			E 84
I 84 tmp_r = tmp_g = tmp_b = 0;
			E 84 for (j = 0; j < factor; j++) for (i = 0; i < xrest; i++)
			{
				D 29 valin = cmap[pixin[i + j * wrapin] - cmap_offset];
				E 29
I 29 valin = cmap[pixin[i + j * wrapin]];
				E 29 tmp_r += valin.r;
				tmp_g += valin.g;
				tmp_b += valin.b;
			}
			valout.r = (tmp_r + fac_xrest_2) / fac_xrest;
			valout.g = (tmp_g + fac_xrest_2) / fac_xrest;
			valout.b = (tmp_b + fac_xrest_2) / fac_xrest;
			*pixout = valout;
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			D 84 tmp_r = tmp_g = tmp_b = tmp_m = 0;
			E 84
I 84 tmp_r = tmp_g = tmp_b = 0;
			E 84 for (j = 0; j < yrest; j++) for (i = 0; i < factor; i++)
			{
				D 29 valin = cmap[pixin[i + j * wrapin] - cmap_offset];
				E 29
I 29 valin = cmap[pixin[i + j * wrapin]];
				E 29 tmp_r += valin.r;
				tmp_g += valin.g;
				tmp_b += valin.b;
			}
			valout.r = (tmp_r + yrest_fac_2) / yrest_fac;
			valout.g = (tmp_g + yrest_fac_2) / yrest_fac;
			valout.b = (tmp_b + yrest_fac_2) / yrest_fac;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			D 84 tmp_r = tmp_g = tmp_b = tmp_m = 0;
			E 84
I 84 tmp_r = tmp_g = tmp_b = 0;
			E 84 for (j = 0; j < yrest; j++) for (i = 0; i < xrest; i++)
			{
				D 29 valin = cmap[pixin[i + j * wrapin] - cmap_offset];
				E 29
I 29 valin = cmap[pixin[i + j * wrapin]];
				E 29 tmp_r += valin.r;
				tmp_g += valin.g;
				tmp_b += valin.b;
			}
			valout.r = (tmp_r + yrest_xrest_2) / yrest_xrest;
			valout.g = (tmp_g + yrest_xrest_2) / yrest_xrest;
			valout.b = (tmp_b + yrest_xrest_2) / yrest_xrest;
			*pixout = valout;
		}
	}
}

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

D 46 static void rop_zoom_out_cm16_rgb_(RASTER *rin, RASTER *rout,
E 46
I 46
D 84 static void rop_zoom_out_cm16_rgbx(RASTER *rin, RASTER *rout,
E 84
I 84 static void rop_zoom_out_cm24_rgbx(RASTER *rin, RASTER *rout,
E 84
E 46 int x1, int y1, int x2, int y2, int newx, int newy, int abs_zoom_level) {
D 29
USHORT *rowin, *pixin;
E 29
I 29
D 84
USHORT *rowin, *pixin, *in;
E 29
LPIXEL *rowout, *pixout, *cmap, valin, valout;
E 84
I 84
ULONG *rowin, *pixin, *in, win;
LPIXEL *rowout, *pixout, *penmap, *colmap, valin, valout;
E 84
D 46
int tmp_r, tmp_g, tmp_b, tmp_m;
E 46
I 46
int tmp_r, tmp_g, tmp_b;
E 46
D 29
int wrapin, wrapout, cmap_offset;
E 29
I 29
int wrapin, wrapout;
E 29
int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
D 29
int factor, fac_fac_bits;
E 29
I 29
int factor, fac_fac_2_bits;
E 29
int fac_fac  , yrest_fac,   fac_xrest,   yrest_xrest;
int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
I 29
int fac_fac_4;
E 29

D 29
cmap=rin->cmap.buffer;
cmap_offset=rin->cmap.offset;
E 29
I 29
D 56
cmap=rin->cmap.buffer - rin->cmap.offset;
E 56
I 56
D 84
cmap=rin->cmap.buffer - rin->cmap.info.offset_mask;
E 84
I 84
penmap=rin->cmap.penbuffer;
colmap=rin->cmap.colbuffer;
E 84
E 56
E 29
lx=x2-x1+1;
ly=y2-y1+1;
factor = 1 << abs_zoom_level;
D 61
xrest = lx % factor;
yrest = ly % factor;
E 61
I 61
xrest = lx & (factor - 1);
yrest = ly & (factor - 1);
E 61
xlast = x2 - xrest + 1;
ylast = y2 - yrest + 1;
fac_fac     = factor * factor; fac_fac_2     = fac_fac     >> 1;
D 29
fac_fac_bits= 2 * abs_zoom_level;
E 29
I 29
fac_fac_4   = fac_fac >> 2;    fac_fac_2_bits= 2 * abs_zoom_level - 1;
E 29
yrest_fac   = yrest  * factor; yrest_fac_2   = yrest_fac   >> 1;
fac_xrest   = factor * xrest;  fac_xrest_2   = fac_xrest   >> 1;
yrest_xrest = yrest  * xrest;  yrest_xrest_2 = yrest_xrest >> 1;
wrapin  = rin ->wrap;
wrapout = rout->wrap;
valout.m = 0xff;

D 84
rowin  = (USHORT*)rin->buffer + wrapin*y1 + x1;
E 84
I 84
rowin  = (ULONG *)rin->buffer + wrapin*y1 + x1;
E 84
rowout = (LPIXEL*)rout->buffer + wrapout*newy + newx;
for (y = y1; y < ylast; y += factor)
  {
  pixin  = rowin;
  pixout = rowout;
  for (x = x1; x < xlast; x += factor)
    {
D 46
    tmp_r = tmp_g = tmp_b = tmp_m = 0;
E 46
I 46
    tmp_r = tmp_g = tmp_b = 0;
E 46
D 29
    for (j = 0; j < factor; j++)
      for (i = 0; i < factor; i++)
E 29
I 29
    in = pixin;
    for (j = 0; j < factor; j+=2)
      {
      for (i = 0; i < factor; i+=2)
E 29
        {
D 29
        valin = cmap[pixin[i + j*wrapin] - cmap_offset];
E 29
I 29
D 84
        valin = cmap[*in];
E 84
I 84
	win = *in;
        MAP24 (win, penmap, colmap, valin)
E 84
E 29
	tmp_r += valin.r;
	tmp_g += valin.g;
	tmp_b += valin.b;
I 29
D 38
	in += factor;
E 38
I 38
	in += wrapin;
E 38
        in++;
D 84
        valin = cmap[*in];
E 84
I 84
	win = *in;
        MAP24 (win, penmap, colmap, valin)
E 84
	tmp_r += valin.r;
	tmp_g += valin.g;
	tmp_b += valin.b;
D 38
	in -= factor;
E 38
I 38
	in -= wrapin;
E 38
        in++;
E 29
	}
D 29
    valout.r = (tmp_r + fac_fac_2) >> fac_fac_bits;
    valout.g = (tmp_g + fac_fac_2) >> fac_fac_bits;
    valout.b = (tmp_b + fac_fac_2) >> fac_fac_bits;
E 29
I 29
      in += 2 * wrapin - factor;
      }
    valout.r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
    valout.g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
    valout.b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
E 29
    *pixout++ = valout;
    pixin += factor;
    }
  if (xrest)
    {
D 46
    tmp_r = tmp_g = tmp_b = tmp_m = 0;
E 46
I 46
    tmp_r = tmp_g = tmp_b = 0;
E 46
    for (j = 0; j < factor; j++)
      for (i = 0; i < xrest; i++)
        {
D 29
        valin = cmap[pixin[i + j*wrapin] - cmap_offset];
E 29
I 29
D 84
        valin = cmap[pixin[i + j*wrapin]];
E 84
I 84
	win = pixin[i + j*wrapin];
        MAP24 (win, penmap, colmap, valin)
E 84
E 29
	tmp_r += valin.r;
	tmp_g += valin.g;
	tmp_b += valin.b;
	}
    valout.r = (tmp_r + fac_xrest_2) / fac_xrest;
    valout.g = (tmp_g + fac_xrest_2) / fac_xrest;
    valout.b = (tmp_b + fac_xrest_2) / fac_xrest;
    *pixout = valout;
    }
  rowin  += wrapin * factor;
  rowout += wrapout;
  }
if (yrest)
  {
  pixin  = rowin;
  pixout = rowout;
  for (x = x1; x < xlast; x += factor)
    {
D 46
    tmp_r = tmp_g = tmp_b = tmp_m = 0;
E 46
I 46
    tmp_r = tmp_g = tmp_b = 0;
E 46
    for (j = 0; j < yrest; j++)
      for (i = 0; i < factor; i++)
        {
D 29
        valin = cmap[pixin[i + j*wrapin] - cmap_offset];
E 29
I 29
D 84
        valin = cmap[pixin[i + j*wrapin]];
E 84
I 84
	win = pixin[i + j*wrapin];
        MAP24 (win, penmap, colmap, valin)
E 84
E 29
	tmp_r += valin.r;
	tmp_g += valin.g;
	tmp_b += valin.b;
	}
    valout.r = (tmp_r + yrest_fac_2) / yrest_fac;
    valout.g = (tmp_g + yrest_fac_2) / yrest_fac;
    valout.b = (tmp_b + yrest_fac_2) / yrest_fac;
    *pixout++ = valout;
    pixin += factor;
    }
  if (xrest)
    {
D 46
    tmp_r = tmp_g = tmp_b = tmp_m = 0;
E 46
I 46
    tmp_r = tmp_g = tmp_b = 0;
E 46
    for (j = 0; j < yrest; j++)
      for (i = 0; i < xrest; i++)
        {
D 29
        valin = cmap[pixin[i + j*wrapin] - cmap_offset];
E 29
I 29
D 84
        valin = cmap[pixin[i + j*wrapin]];
E 84
I 84
	win = pixin[i + j*wrapin];
        MAP24 (win, penmap, colmap, valin)
E 84
E 29
	tmp_r += valin.r;
	tmp_g += valin.g;
	tmp_b += valin.b;
	}
    valout.r = (tmp_r + yrest_xrest_2) / yrest_xrest;
    valout.g = (tmp_g + yrest_xrest_2) / yrest_xrest;
    valout.b = (tmp_b + yrest_xrest_2) / yrest_xrest;
    *pixout = valout;
    }
  }
E 28 }

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

I 81 static void rop_copy_rgb_rgb16(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy) {
USHORT *rowout, *pixout;
UCHAR  *rowin, *pixin;
int bytewrapin, wrapout;
int x, lx, ly;

lx=x2-x1+1;
ly=y2-y1+1;
bytewrapin = rin ->wrap * 3;
wrapout    = rout->wrap;

rowin  = (UCHAR*) rin ->buffer + bytewrapin * y1 + x1 * 3;
rowout = (USHORT*)rout->buffer + wrapout * newy  + newx;

while(ly-->0)
  {
   pixin=rowin;
   pixout=rowout;
   for(x=0;x<lx;x++)
     {
     *pixout++ = PIX_RGB16_FROM_BYTES(pixin[0], pixin[1], pixin[2]);
     pixin += 3;
     }
   rowin+=bytewrapin;
   rowout+=wrapout;
  } }

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

E 81
E 20
I 18 static void rop_copy_rgb_rgbm(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy) {
LPIXEL *rowout, *pixout;
UCHAR  *rowin, *pixin;
D 81
int wrapin, wrapout;
E 81
I 81
int bytewrapin, wrapout;
E 81
int x, lx, ly;
LPIXEL tmp;

lx=x2-x1+1;
ly=y2-y1+1;
D 81
wrapin  = rin ->wrap * 3;
wrapout = rout->wrap;
E 81
I 81
bytewrapin = rin ->wrap * 3;
wrapout    = rout->wrap;
E 81

D 24
rowin  = (UCHAR*) rin ->buffer + wrapin*y1    + x1;
E 24
I 24
D 81
rowin  = (UCHAR*) rin ->buffer + wrapin*y1    + x1 * 3;
E 24
rowout = (LPIXEL*)rout->buffer + wrapout*newy + newx;
E 81
I 81
rowin  = (UCHAR*) rin ->buffer + bytewrapin * y1 + x1 * 3;
rowout = (LPIXEL*)rout->buffer + wrapout * newy  + newx;
E 81

I 45
tmp.m = 0xff;
E 45
while(ly-->0)
  {
   pixin=rowin;
   pixout=rowout;
   for(x=0;x<lx;x++)
     {
     tmp.r = *pixin++;
     tmp.g = *pixin++;
     tmp.b = *pixin++;
D 45
     tmp.m = 0xff;
E 45
     *pixout++ = tmp;
     }
D 81
   rowin+=wrapin;
E 81
I 81
   rowin+=bytewrapin;
E 81
   rowout+=wrapout;
  } }

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

I 67 static void rop_copy_rgbx_rgb(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy) {
UCHAR *rowout, *pixout;
LPIXEL  *rowin, *pixin;
int wrapin, wrapout;
int x, lx, ly;

lx=x2-x1+1;
ly=y2-y1+1;
wrapin  = rin ->wrap;
wrapout = rout->wrap * 3;

rowin  = (LPIXEL*) rin ->buffer + wrapin*y1    + x1;
rowout = (UCHAR*)rout->buffer + wrapout*newy + newx * 3;

while(ly-->0)
  {
   pixin=rowin;
   pixout=rowout;
   for(x=0;x<lx;x++, pixin++)
     {
     *pixout++ = pixin->b;
     *pixout++ = pixin->g;
     *pixout++ = pixin->r;
     }
   rowin+=wrapin;
   rowout+=wrapout;
  } }

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

I 81
D 84 static void rop_reduce_rgb_rgb16(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy, int factor) { printf("rop_reduce_rgb_rgb16 not implemented yet\n"); }

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

E 81
E 67
I 20 static void rop_reduce_rgb_rgbm(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy, int factor) { printf("rop_reduce_rgb_rgbm not implemented yet\n"); }

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

E 84
I 81 static void rop_zoom_out_rgb_rgb16(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy, int abs_zoom_level) {
UCHAR  *rowin, *pixin, *in;
USHORT *rowout, *pixout;
int tmp_r, tmp_g, tmp_b;
int wrapin_pixels, wrapin_bytes, wrapout;
int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
int factor, fac_fac_2_bits;
int fac_fac  , yrest_fac,   fac_xrest,   yrest_xrest;
int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
int fac_fac_4;

lx=x2-x1+1;
ly=y2-y1+1;
factor = 1 << abs_zoom_level;
xrest = lx & (factor - 1);
yrest = ly & (factor - 1);
xlast = x2 - xrest + 1;
ylast = y2 - yrest + 1;
fac_fac     = factor * factor; fac_fac_2     = fac_fac     >> 1;
fac_fac_4   = fac_fac >> 2;    fac_fac_2_bits= 2 * abs_zoom_level - 1;
yrest_fac   = yrest  * factor; yrest_fac_2   = yrest_fac   >> 1;
fac_xrest   = factor * xrest;  fac_xrest_2   = fac_xrest   >> 1;
yrest_xrest = yrest  * xrest;  yrest_xrest_2 = yrest_xrest >> 1;
wrapin_pixels = rin->wrap;
wrapin_bytes  = wrapin_pixels * 3;
wrapout = rout->wrap;

rowin  = (UCHAR *)rin->buffer + wrapin_bytes * y1 + 3 * x1;
rowout = (USHORT*)rout->buffer + wrapout * newy + newx;
for (y = y1; y < ylast; y += factor)
  {
  pixin  = rowin;
  pixout = rowout;
  for (x = x1; x < xlast; x += factor)
    {
    tmp_r = tmp_g = tmp_b = 0;
    in = pixin;
    for (j = 0; j < factor; j+=2)
      {
      for (i = 0; i < factor; i+=2)
        {
        tmp_r += *in++;
        tmp_g += *in++;
        tmp_b += *in++;
	in += wrapin_bytes;
        tmp_r += *in++;
        tmp_g += *in++;
        tmp_b += *in++;
	in -= wrapin_bytes;
	}
      in += 6 * wrapin_pixels - 3 * factor;
      }
    tmp_r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
    tmp_g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
    tmp_b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
    *pixout++ = PIX_RGB16_FROM_BYTES (tmp_r, tmp_g, tmp_b);
    pixin += 3 * factor;
    }
  if (xrest)
    {
    tmp_r = tmp_g = tmp_b = 0;
    for (j = 0; j < factor; j++)
      for (i = 0; i < xrest; i++)
        {
	tmp_r += pixin[3*i + j*wrapin_bytes];
	tmp_g += pixin[3*i + j*wrapin_bytes + 1];
	tmp_b += pixin[3*i + j*wrapin_bytes + 2];
	}
    tmp_r = (tmp_r + fac_xrest_2) / fac_xrest;
    tmp_g = (tmp_g + fac_xrest_2) / fac_xrest;
    tmp_b = (tmp_b + fac_xrest_2) / fac_xrest;
    *pixout = PIX_RGB16_FROM_BYTES (tmp_r, tmp_g, tmp_b);
    }
  rowin  += wrapin_bytes * factor;
  rowout += wrapout;
  }
if (yrest)
  {
  pixin  = rowin;
  pixout = rowout;
  for (x = x1; x < xlast; x += factor)
    {
    tmp_r = tmp_g = tmp_b = 0;
    for (j = 0; j < yrest; j++)
      for (i = 0; i < factor; i++)
        {
	tmp_r += pixin[3*i + j*wrapin_bytes];
	tmp_g += pixin[3*i + j*wrapin_bytes + 1];
	tmp_b += pixin[3*i + j*wrapin_bytes + 2];
	}
    tmp_r = (tmp_r + yrest_fac_2) / yrest_fac;
    tmp_g = (tmp_g + yrest_fac_2) / yrest_fac;
    tmp_b = (tmp_b + yrest_fac_2) / yrest_fac;
    *pixout++ = PIX_RGB16_FROM_BYTES (tmp_r, tmp_g, tmp_b);
    pixin += 3 * factor;
    }
  if (xrest)
    {
    tmp_r = tmp_g = tmp_b = 0;
    for (j = 0; j < yrest; j++)
      for (i = 0; i < xrest; i++)
        {
	tmp_r += pixin[3*i + j*wrapin_bytes];
	tmp_g += pixin[3*i + j*wrapin_bytes + 1];
	tmp_b += pixin[3*i + j*wrapin_bytes + 2];
	}
    tmp_r = (tmp_r + yrest_xrest_2) / yrest_xrest;
    tmp_g = (tmp_g + yrest_xrest_2) / yrest_xrest;
    tmp_b = (tmp_b + yrest_xrest_2) / yrest_xrest;
    *pixout = PIX_RGB16_FROM_BYTES (tmp_r, tmp_g, tmp_b);
    }
  } }

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

E 81
I 28 static void rop_zoom_out_rgb_rgbm(RASTER *rin, RASTER *rout,
D 31 int x1, int y1, int x2, int y2, int newx, int newy, int factor)
E 31
I 31 int x1,
													   int y1, int x2, int y2, int newx, int newy, int abs_zoom_level)
E 31 {
D 48
printf ("rop_zoom_out_rgb_rgbm not implemented yet\n");
E 48
I 48
UCHAR  *rowin, *pixin, *in;
LPIXEL *rowout, *pixout, valout;
int tmp_r, tmp_g, tmp_b;
int wrapin_pixels, wrapin_bytes, wrapout;
int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
int factor, fac_fac_2_bits;
int fac_fac  , yrest_fac,   fac_xrest,   yrest_xrest;
int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
int fac_fac_4;

lx=x2-x1+1;
ly=y2-y1+1;
factor = 1 << abs_zoom_level;
D 61
xrest = lx % factor;
yrest = ly % factor;
E 61
I 61
xrest = lx & (factor - 1);
yrest = ly & (factor - 1);
E 61
xlast = x2 - xrest + 1;
ylast = y2 - yrest + 1;
fac_fac     = factor * factor; fac_fac_2     = fac_fac     >> 1;
fac_fac_4   = fac_fac >> 2;    fac_fac_2_bits= 2 * abs_zoom_level - 1;
yrest_fac   = yrest  * factor; yrest_fac_2   = yrest_fac   >> 1;
fac_xrest   = factor * xrest;  fac_xrest_2   = fac_xrest   >> 1;
yrest_xrest = yrest  * xrest;  yrest_xrest_2 = yrest_xrest >> 1;
wrapin_pixels = rin->wrap;
wrapin_bytes  = wrapin_pixels * 3;
wrapout = rout->wrap;
valout.m = 0xff;

rowin  = (UCHAR *)rin->buffer + wrapin_bytes*y1 + 3*x1;
rowout = (LPIXEL*)rout->buffer + wrapout*newy + newx;
for (y = y1; y < ylast; y += factor)
  {
  pixin  = rowin;
  pixout = rowout;
  for (x = x1; x < xlast; x += factor)
    {
    tmp_r = tmp_g = tmp_b = 0;
    in = pixin;
    for (j = 0; j < factor; j+=2)
      {
      for (i = 0; i < factor; i+=2)
        {
        tmp_r += *in++;
        tmp_g += *in++;
        tmp_b += *in++;
	in += wrapin_bytes;
        tmp_r += *in++;
        tmp_g += *in++;
        tmp_b += *in++;
	in -= wrapin_bytes;
	}
      in += 6 * wrapin_pixels - 3 * factor;
      }
    valout.r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
    valout.g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
    valout.b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
    *pixout++ = valout;
    pixin += 3 * factor;
    }
  if (xrest)
    {
    tmp_r = tmp_g = tmp_b = 0;
    for (j = 0; j < factor; j++)
      for (i = 0; i < xrest; i++)
        {
	tmp_r += pixin[3*i + j*wrapin_bytes];
	tmp_g += pixin[3*i + j*wrapin_bytes + 1];
	tmp_b += pixin[3*i + j*wrapin_bytes + 2];
	}
    valout.r = (tmp_r + fac_xrest_2) / fac_xrest;
    valout.g = (tmp_g + fac_xrest_2) / fac_xrest;
    valout.b = (tmp_b + fac_xrest_2) / fac_xrest;
    *pixout = valout;
    }
  rowin  += wrapin_bytes * factor;
  rowout += wrapout;
  }
if (yrest)
  {
  pixin  = rowin;
  pixout = rowout;
  for (x = x1; x < xlast; x += factor)
    {
    tmp_r = tmp_g = tmp_b = 0;
    for (j = 0; j < yrest; j++)
      for (i = 0; i < factor; i++)
        {
	tmp_r += pixin[3*i + j*wrapin_bytes];
	tmp_g += pixin[3*i + j*wrapin_bytes + 1];
	tmp_b += pixin[3*i + j*wrapin_bytes + 2];
	}
    valout.r = (tmp_r + yrest_fac_2) / yrest_fac;
    valout.g = (tmp_g + yrest_fac_2) / yrest_fac;
    valout.b = (tmp_b + yrest_fac_2) / yrest_fac;
    *pixout++ = valout;
D 49
    pixin += factor;
E 49
I 49
    pixin += 3 * factor;
E 49
    }
  if (xrest)
    {
    tmp_r = tmp_g = tmp_b = 0;
    for (j = 0; j < yrest; j++)
      for (i = 0; i < xrest; i++)
        {
	tmp_r += pixin[3*i + j*wrapin_bytes];
	tmp_g += pixin[3*i + j*wrapin_bytes + 1];
	tmp_b += pixin[3*i + j*wrapin_bytes + 2];
	}
    valout.r = (tmp_r + yrest_xrest_2) / yrest_xrest;
    valout.g = (tmp_g + yrest_xrest_2) / yrest_xrest;
    valout.b = (tmp_b + yrest_xrest_2) / yrest_xrest;
    *pixout = valout;
    }
  }
E 48 }

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

I 68
D 69 static void rop_copy_bw_bw(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy)
E 69
I 69 static void rop_copy_bw(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy)
E 69 {
UINT mask;
D 69
int yin, yout, byte, byte1, byte2, newbyte, bytewrapin, bytewrapout;
E 69
I 69
int yin, yout, byte, byte1, byte2, newbyte, bytewrapin, bytewrapout, rest;
E 69
UCHAR *bytein, *byteout;

D 69
if ((x1 & 7) || ((x2 + 1) & 7))
E 69
I 69
if ((x1 & 7) || (newx & 7))
E 69
  {
D 69
  msg (MSG_IE, "rop_copy_bw_bw: x coordinates must be multiples of 8");
E 69
I 69
  rop_copy_90_bw (rin, rout, x1, y1, x2, y2, newx, newy, FALSE, 0);
E 69
  return;
  }
mask = rin->type == rout->type ? 0x0 : 0xff;
byte1 = x1 >> 3;
byte2 = ((x2 + 1) >> 3) - 1;
I 69
rest  = (x2 + 1) & 7;
E 69
newbyte = newx >> 3;
bytewrapin  = (rin->wrap  + 7) >> 3;
bytewrapout = (rout->wrap + 7) >> 3;
for (yin = y1, yout = newy; yin <= y2; yin++, yout++)
  {
  bytein  = (UCHAR *)rin->buffer  + yin  * bytewrapin  + byte1;
  byteout = (UCHAR *)rout->buffer + yout * bytewrapout + newbyte;
  if (mask)
    for (byte = byte1; byte <= byte2; byte++)
      *byteout++ = *bytein++ ^ mask;
  else
    for (byte = byte1; byte <= byte2; byte++)
      *byteout++ = *bytein++;
I 69
  if (rest)
    *byteout |= (*bytein ^ mask) & (~0U << (7 - rest));
E 69
  } }

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

E 68
E 28
E 20
E 18 static void rop_copy_bw_cm16(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy) {
UCHAR  *rowin, *bytein;
USHORT *rowout, *pixout;
LPIXEL *cmap;
I 5
D 21
int i_0, i_1, i_t;
E 21
I 21
USHORT i_0, i_1, i_t;
E 21
E 5
D 18
int wrapin, wrapout, tmp, cmap_offset, bit, bit_offs, startbit;
E 18
I 18
int wrapin, wrapout, cmap_offset, bit, bit_offs, startbit;
E 18
int x, lx, ly;
D 5
int reversed;
E 5

D 68
if(!rout->cmap.buffer)
E 68
I 68
D 84
if ( !rout->cmap.buffer)
E 68
  {
D 68
   msg (MSG_IE, "rop_copy_bw_cm16: missing color map");
   return;
E 68
I 68
  msg (MSG_IE, "rop_copy_bw_cm16: missing color map");
  return;
E 68
  }
E 84
cmap=rout->cmap.buffer;
D 56
cmap_offset=rout->cmap.offset;
E 56
I 56
cmap_offset=rout->cmap.info.offset_mask;
E 56
D 5
switch (rin->type)
E 5
I 5
if (cmap[0].r==0)
E 5
  {
D 5
  CASE RAS_BW: reversed = cmap[0].r!=0;
  CASE RAS_WB: reversed = cmap[0].r==0;
  DEFAULT: msg (MSG_IE, "rop_copy_bw_cm16: invalid rastertype");
E 5
I 5
  i_0 = cmap_offset;
  i_1 = cmap_offset + 255;
E 5
  }
I 5
else
  {
  i_0 = cmap_offset + 255;
  i_1 = cmap_offset;
  }
if (rin->type==RAS_WB)
  {
  i_t = i_0;
  i_0 = i_1;
  i_1 = i_t;
  }
E 5
lx=x2-x1+1;
ly=y2-y1+1;
D 8
wrapin  = rin->wrap;
wrapout = rout->wrap;
E 8
I 8
D 10
if ((rin->wrap % sizeof(UCHAR)) || (rout->wrap % sizeof(USHORT)))
  {
   printf("### INTERNAL ERROR - rop_copy_bw_cm16; bad wrap\n");
   return;
  }
wrapin  = rin->wrap  / sizeof(UCHAR);
wrapout = rout->wrap / sizeof(USHORT);
E 8
bit_offs = rin->bit_offs;
E 10
I 10
D 16
wrapin   = rin ->wrap / 8;
E 16
I 16
D 47
wrapin   = (rin->wrap + 7) / 8;
E 47
I 47
wrapin   = (rin->wrap + 7) >> 3;
E 47
E 16
bit_offs = rin ->bit_offs;
wrapout  = rout->wrap;
E 10

rowin = (UCHAR*)rin->buffer + wrapin*y1 + ((x1 + bit_offs)>>3);
startbit = 7 - ((x1 + bit_offs) & 7);
rowout = (USHORT*)rout->buffer + wrapout*newy + newx;
while (ly-- > 0)
  {
  bytein = rowin;
  bit    = startbit;
  pixout = rowout;
D 5
  if (reversed)
    for (x = lx; x > 0; x--)
      {
      *pixout++ = cmap_offset + 1 - ((*bytein >> bit) & 1);
      if (bit==0)
        {
        bytein++;
        bit = 7;
        }
      else
        bit--;
      }
  else
    for (x = lx; x > 0; x--)
E 5
I 5
  for (x = lx; x > 0; x--)
    {
    *pixout++ = ((*bytein >> bit) & 1) ? i_1 : i_0;
    if (bit==0)
E 5
      {
D 5
      *pixout++ = cmap_offset + ((*bytein >> bit) & 1);
      if (bit==0)
        {
        bytein++;
        bit = 7;
        }
      else
        bit--;
E 5
I 5
      bytein++;
      bit = 7;
E 5
      }
I 5
    else
      bit--;
    }
E 5
  rowin  += wrapin;
  rowout += wrapout;
  } }

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

I 20
D 84 static void rop_reduce_bw_cm16(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy, int factor)
E 84
I 84 static void rop_copy_bw_cm24(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy)
E 84 {
D 84
printf ("rop_reduce_bw_cm16 not implemented yet\n");
E 84
I 84
UCHAR  *rowin, *bytein;
ULONG  *rowout, *pixout;
LPIXEL *penmap, *colmap;
ULONG  i_0, i_1, i_t;
int wrapin, wrapout, bit, bit_offs, startbit;
int x, lx, ly;

penmap=rout->cmap.penbuffer;
colmap=rout->cmap.colbuffer;
if (penmap[0].r + colmap[0].r==0)
  {
  i_0 = 0;
  i_1 = 255;
  }
else
  {
  i_0 = 255;
  i_1 = 0;
  }
if (rin->type==RAS_WB)
  {
  i_t = i_0;
  i_0 = i_1;
  i_1 = i_t;
  }
lx=x2-x1+1;
ly=y2-y1+1;
wrapin   = (rin->wrap + 7) >> 3;
bit_offs = rin ->bit_offs;
wrapout  = rout->wrap;

rowin = (UCHAR*)rin->buffer + wrapin*y1 + ((x1 + bit_offs)>>3);
startbit = 7 - ((x1 + bit_offs) & 7);
rowout = (ULONG*)rout->buffer + wrapout*newy + newx;
while (ly-- > 0)
  {
  bytein = rowin;
  bit    = startbit;
  pixout = rowout;
  for (x = lx; x > 0; x--)
    {
    *pixout++ = ((*bytein >> bit) & 1) ? i_1 : i_0;
    if (bit==0)
      {
      bytein++;
      bit = 7;
      }
    else
      bit--;
    }
  rowin  += wrapin;
  rowout += wrapout;
  }
I 89
if (rout->extra_mask)
  rop_copy_extra (rin, rout, x1, y1, x2, y2, newx, newy);
E 89
E 84 }

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

I 28 static void rop_zoom_out_bw_cm16(RASTER *rin, RASTER *rout,
D 31 int x1, int y1, int x2, int y2, int newx, int newy, int factor)
E 31
I 31 int x1,
													int y1, int x2, int y2, int newx, int newy, int abs_zoom_level)
E 31 { printf("rop_zoom_out_bw_cm16 not implemented yet\n"); }

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

I 84 static void rop_zoom_out_bw_cm24(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy, int abs_zoom_level) { printf("rop_zoom_out_bw_cm24 not implemented yet\n"); }

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

E 84
E 28
E 20
I 19 static void rop_copy_bw_rgbm(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy) {
UCHAR  *rowin, *bytein;
LPIXEL *rowout, *pixout;
LPIXEL rgb_0, rgb_1;
int wrapin, wrapout, bit, bit_offs, startbit;
int x, lx, ly;

if (rin->type==RAS_WB)
  {
  rgb_0.r = 0xff;  rgb_0.g = 0xff;  rgb_0.b = 0xff;  rgb_0.m = 0xff;
  rgb_1.r = 0x00;  rgb_1.g = 0x00;  rgb_1.b = 0x00;  rgb_1.m = 0xff;
  }
else
  {
  rgb_0.r = 0x00;  rgb_0.g = 0x00;  rgb_0.b = 0x00;  rgb_0.m = 0xff;
  rgb_1.r = 0xff;  rgb_1.g = 0xff;  rgb_1.b = 0xff;  rgb_1.m = 0xff;
  }
lx=x2-x1+1;
ly=y2-y1+1;
D 47
wrapin   = (rin->wrap + 7) / 8;
E 47
I 47
wrapin   = (rin->wrap + 7) >> 3;
E 47
bit_offs = rin ->bit_offs;
wrapout  = rout->wrap;

rowin = (UCHAR*)rin->buffer + wrapin*y1 + ((x1 + bit_offs)>>3);
startbit = 7 - ((x1 + bit_offs) & 7);
rowout = (LPIXEL*)rout->buffer + wrapout*newy + newx;
while (ly-- > 0)
  {
  bytein = rowin;
  bit    = startbit;
  pixout = rowout;
  for (x = lx; x > 0; x--)
    {
    *pixout++ = ((*bytein >> bit) & 1) ? rgb_1 : rgb_0;
    if (bit==0)
      {
      bytein++;
      bit = 7;
      }
    else
      bit--;
    }
  rowin  += wrapin;
  rowout += wrapout;
  } }

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

I 20
D 84 static void rop_reduce_bw_rgbm(RASTER *rin, RASTER *rout, int x1, int y1, int x2, int y2, int newx, int newy, int factor) { printf("rop_reduce_bw_rgbm not implemented yet\n"); }

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

E 84
I 28 static void rop_zoom_out_bw_rgbm(RASTER *rin, RASTER *rout,
D 31 int x1, int y1, int x2, int y2, int newx, int newy, int factor)
E 31
I 31 int x1,
									   int y1, int x2, int y2, int newx, int newy, int abs_zoom_level)
E 31
{
	D 61 printf("rop_zoom_out_bw_rgbm not implemented yet\n");
	E 61
I 61 UCHAR *rowin, *bytein, *in;
	LPIXEL *rowout, *pixout, valout;
	int val_0, val_1, tmp;
	int wrapin, wrapout, bitin, bit, bit_offs, startbit;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	if (rin->type == RAS_WB) {
		val_0 = 0xff;
		val_1 = 0x00;
	} else {
		val_0 = 0x00;
		val_1 = 0xff;
	}
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = (rin->wrap + 7) >> 3;
	bit_offs = rin->bit_offs;
	wrapout = rout->wrap;
	valout.m = 0xff;

	rowin = (UCHAR *)rin->buffer + wrapin * y1 + ((x1 + bit_offs) >> 3);
	startbit = 7 - ((x1 + bit_offs) & 7);
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		bytein = rowin;
		bitin = startbit;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp = 0;
			in = bytein;
			bit = bitin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					tmp += ((*in >> bit) & 1);
					in += wrapin;
					if (bit == 0) {
						in++;
						bit = 7;
					} else
						bit--;
					tmp += ((*in >> bit) & 1);
					in -= wrapin;
					if (bit == 0) {
						in++;
						bit = 7;
					} else
						bit--;
				}
				in += 2 * wrapin;
				bit += factor;
				while (bit > 7) {
					in--;
					bit -= 8;
				}
			}
			tmp = tmp * val_1 + (fac_fac_2 - tmp) * val_0;
			valout.r = valout.g = valout.b = (tmp + fac_fac_4) >> fac_fac_2_bits;
			*pixout++ = valout;
			bitin -= factor;
			while (bitin < 0) {
				bytein++;
				bitin += 8;
			}
		}
		if (xrest) {
			tmp = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					tmp += GET_BIT(i, j, bytein, wrapin, 7 - bitin);
				}
			tmp = tmp * val_1 + (fac_xrest - tmp) * val_0;
			valout.r = valout.g = valout.b = (tmp + fac_xrest_2) / fac_xrest;
			*pixout = valout;
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		bytein = rowin;
		bitin = startbit;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					tmp += GET_BIT(i, j, bytein, wrapin, 7 - bitin);
				}
			tmp = tmp * val_1 + (yrest_fac - tmp) * val_0;
			valout.r = valout.g = valout.b = (tmp + yrest_fac_2) / yrest_fac;
			*pixout++ = valout;
			bitin -= factor;
			while (bitin < 0) {
				bytein++;
				bitin += 8;
			}
		}
		if (xrest) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					tmp += GET_BIT(i, j, bytein, wrapin, 7 - bitin);
				}
			tmp = tmp * val_1 + (yrest_xrest - tmp) * val_0;
			valout.r = valout.g = valout.b = (tmp + yrest_xrest_2) / yrest_xrest;
			*pixout = valout;
		}
	}
	E 61
}

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

E 28
E 20
E 19 static void rop_copy_gr8_cm16(RASTER *rin, RASTER *rout,
									 int x1, int y1, int x2, int y2,
									 int newx, int newy)
{
	UCHAR *rowin, *bytein;
	USHORT *rowout, *pixout;
	LPIXEL *cmap;
	D 18 int wrapin, wrapout, tmp, cmap_offset;
	E 18
I 18 int wrapin, wrapout, cmap_offset;
	E 18 int x, lx, ly;
	int i, reversed;
	E 4

I 4
D 84 if (!rout->cmap.buffer)
	{
		msg(MSG_IE, "rop_copy_gr8_cm16: missing color map");
		return;
	}
	E 84 cmap = rout->cmap.buffer;
	D 56 cmap_offset = rout->cmap.offset;
	E 56
I 56 cmap_offset = rout->cmap.info.offset_mask;
	E 56 reversed = cmap[0].r != 0;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	D 8 wrapin = rin->wrap;
	wrapout = rout->wrap;
	E 8
I 8
D 10 if ((rin->wrap % sizeof(UCHAR)) || (rout->wrap % sizeof(USHORT)))
	{
		printf("### INTERNAL ERROR - rop_copy_gr8_cm16; bad wrap\n");
		return;
	}
	wrapin = rin->wrap / sizeof(UCHAR);
	wrapout = rout->wrap / sizeof(USHORT);
	E 10
I 10 wrapin = rin->wrap;
	wrapout = rout->wrap;
	E 10
E 8

		rowin = (UCHAR *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		bytein = rowin;
		pixout = rowout;
		if (reversed)
			for (x = lx; x > 0; x--)
				*pixout++ = cmap_offset + (255 - *bytein++);
		else
			for (x = lx; x > 0; x--)
				*pixout++ = cmap_offset + *bytein++;
		rowin += wrapin;
		rowout += wrapout;
	}
}

E 4
	/*---------------------------------------------------------------------------*/

I 20
D 84 static void
rop_reduce_gr8_cm16(RASTER *rin, RASTER *rout,
					int x1, int y1, int x2, int y2,
					int newx, int newy, int factor)
E 84
I 84 static void rop_copy_gr8_cm24(RASTER *rin, RASTER *rout,
									 int x1, int y1, int x2, int y2,
									 int newx, int newy)
E 84
{
	D 84 printf("rop_reduce_gr8_cm16 not implemented yet\n");
	E 84
I 84 UCHAR *rowin, *bytein;
	ULONG *rowout, *pixout;
	LPIXEL *penmap, *colmap;
	int wrapin, wrapout;
	int x, lx, ly;
	int i, reversed;

	penmap = rout->cmap.penbuffer;
	colmap = rout->cmap.colbuffer;
	reversed = penmap[0].r + colmap[0].r != 0;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (UCHAR *)rin->buffer + wrapin * y1 + x1;
	rowout = (ULONG *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		bytein = rowin;
		pixout = rowout;
		if (reversed)
			for (x = lx; x > 0; x--)
				*pixout++ = 255 - *bytein++;
		else
			for (x = lx; x > 0; x--)
				*pixout++ = *bytein++;
		rowin += wrapin;
		rowout += wrapout;
	}
	I 89 if (rout->extra_mask)
		rop_copy_extra(rin, rout, x1, y1, x2, y2, newx, newy);
	E 89
E 84
}

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

I 28
static void rop_zoom_out_gr8_cm16(RASTER *rin, RASTER *rout,
D 31
                                int x1, int y1, int x2, int y2,
			        int newx, int newy, int factor)
E 31
I 31
                                  int x1, int y1, int x2, int y2,
			          int newx, int newy, int abs_zoom_level)
E 31
{
	printf("rop_zoom_out_gr8_cm16 not implemented yet\n");
}

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

I 84 static void rop_zoom_out_gr8_cm24(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy, int abs_zoom_level)
{
	printf("rop_zoom_out_gr8_cm24 not implemented yet\n");
}

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

E 84
E 28
I 23 static void rop_copy_cm8_cm16(RASTER *rin, RASTER *rout,
									 int x1, int y1, int x2, int y2,
									 int newx, int newy)
{
	UCHAR *rowin, *pixin;
	USHORT *rowout, *pixout;
	LPIXEL *cmapin, *cmapout;
	int wrapin, wrapout, cmapin_offset, cmapout_offset, cmap_offset_delta;
	int x, lx, ly;

	D 84 if (!rin->cmap.buffer || !rout->cmap.buffer)
	{
		msg(MSG_IE, "rop_copy_cm8_cm16: missing color map");
		return;
	}
	E 84 cmapin = rin->cmap.buffer;
	cmapout = rout->cmap.buffer;
	D 56 cmapin_offset = rin->cmap.offset;
	cmapout_offset = rout->cmap.offset;
	E 56
I 56 cmapin_offset = rin->cmap.info.offset_mask;
	cmapout_offset = rout->cmap.info.offset_mask;
	E 56 cmap_offset_delta = cmapout_offset - cmapin_offset;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (UCHAR *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = lx; x > 0; x--)
			*pixout++ = *pixin++ + cmap_offset_delta;
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

E 23
D 84 static void rop_reduce_bw_gr8(RASTER *rin, RASTER *rout,
E 84
I 84 static void rop_copy_cm8_cm24(RASTER *rin, RASTER *rout,
E 84 int x1, int y1, int x2, int y2,
D 84 int newx, int newy, int factor) {
	printf("rop_reduce_bw_gr8 not implemented yet\n");
}

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

I 28 static void rop_zoom_out_bw_gr8(RASTER *rin, RASTER *rout,
D 31 int x1, int y1, int x2, int y2, int newx, int newy, int factor)
E 31
I 31 int x1,
									 int y1, int x2, int y2, int newx, int newy, int abs_zoom_level)
E 31
{
	printf("rop_zoom_out_bw_gr8 not implemented yet\n");
}

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

E 28
static void rop_reduce_gr8(RASTER *rin, RASTER *rout,
                           int x1, int y1, int x2, int y2,
			   int newx, int newy, int factor)
E 84
I 84
			      int newx, int newy)
E 84
{
	D 84 UCHAR *rowin, *bytein;
	UCHAR *rowout, *byteout;
	int tmp;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	E 84
I 84 UCHAR *rowin, *pixin;
	ULONG *rowout, *pixout;
	int wrapin, wrapout, cmapin_offset, cmap_offset_delta;
	int x, lx, ly;
	E 84

I 84 cmapin_offset = rin->cmap.info.offset_mask;
	cmap_offset_delta = -cmapin_offset;
	E 84 lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61
D 84 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61
D 28 xlast = x2 - xrest - (factor - 1);
	ylast = y2 - yrest - (factor - 1);
	E 28
I 28 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	E 84
E 28 wrapin = rin->wrap;
	wrapout = rout->wrap;

	D 84 rowin = (UCHAR *)rin->buffer + wrapin * y1 + x1;
	rowout = (UCHAR *)rout->buffer + wrapout * newy + newx;
	D 28 for (y = y1; y <= ylast; y += factor)
E 28
I 28 for (y = y1; y < ylast; y += factor)
E 84
I 84 rowin = (UCHAR *)rin->buffer + wrapin * y1 + x1;
	rowout = (ULONG *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0)
		E 84
E 28
		{
			D 84 bytein = rowin;
			byteout = rowout;
			for (x = x1; x < xlast; x += factor) {
				tmp = 0;
				for (j = 0; j < factor; j++)
					for (i = 0; i < factor; i++)
						tmp += bytein[i + j * wrapin];
				*byteout++ = tmp / (factor * factor);
				bytein += factor;
			}
			if (xrest) {
				tmp = 0;
				for (j = 0; j < factor; j++)
					for (i = 0; i < xrest; i++)
						tmp += bytein[i + j * wrapin];
				*byteout = tmp / (factor * xrest);
			}
			rowin += wrapin * factor;
			E 84
I 84 pixin = rowin;
			pixout = rowout;
			for (x = lx; x > 0; x--)
				*pixout++ = *pixin++ + cmap_offset_delta;
			rowin += wrapin;
			E 84 rowout += wrapout;
		}
	I 89 if (rout->extra_mask)
		rop_copy_extra(rin, rout, x1, y1, x2, y2, newx, newy);
	E 89
D 84 if (yrest)
	{
		bytein = rowin;
		byteout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++)
					tmp += bytein[i + j * wrapin];
			*byteout++ = tmp / (yrest * factor);
			bytein += factor;
		}
		if (xrest) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++)
					tmp += bytein[i + j * wrapin];
			*byteout = tmp / (yrest * xrest);
		}
	}
	E 84
}

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

I 28
D 84
static void rop_zoom_out_gr8(RASTER *rin, RASTER *rout,
D 31
                              int x1, int y1, int x2, int y2,
			      int newx, int newy, int factor)
E 31
I 31
                             int x1, int y1, int x2, int y2,
			     int newx, int newy, int abs_zoom_level)
E 84
I 84
static void rop_zoom_out_bw_gr8(RASTER *rin, RASTER *rout,
                                int x1, int y1, int x2, int y2,
			        int newx, int newy, int abs_zoom_level)
E 84
E 31
{
	D 84 printf("rop_zoom_out_gr8 not implemented yet\n");
	E 84
I 84 printf("rop_zoom_out_bw_gr8 not implemented yet\n");
	E 84
}

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

E 28
D 84 static void rop_reduce_cm16(RASTER *rin, RASTER *rout,
								   int x1, int y1, int x2, int y2,
								   int newx, int newy, int factor)
E 84
I 84 static void rop_zoom_out_gr8(RASTER *rin, RASTER *rout,
									int x1, int y1, int x2, int y2,
									int newx, int newy, int abs_zoom_level)
E 84
{
	D 84 printf("rop_reduce_cm16 not implemented yet\n");
	E 84
I 84 printf("rop_zoom_out_gr8 not implemented yet\n");
	E 84
}

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

I 28
static void rop_zoom_out_cm16(RASTER *rin, RASTER *rout,
D 31
                            int x1, int y1, int x2, int y2,
			    int newx, int newy, int factor)
E 31
I 31
                              int x1, int y1, int x2, int y2,
			      int newx, int newy, int abs_zoom_level)
E 31
{
	printf("rop_zoom_out_cm16 not implemented yet\n");
}

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

E 28
D 84 static void rop_reduce_rgbm(RASTER *rin, RASTER *rout,
								   int x1, int y1, int x2, int y2,
								   int newx, int newy, int factor)
E 84
I 84 static void rop_zoom_out_cm24(RASTER *rin, RASTER *rout,
									 int x1, int y1, int x2, int y2,
									 int newx, int newy, int abs_zoom_level)
E 84
{
	D 84 printf("rop_reduce_rgbm not implemented yet\n");
	E 84
I 84 printf("rop_zoom_out_cm24 not implemented yet\n");
	E 84
}

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

I 28
static void rop_zoom_out_rgbm(RASTER *rin, RASTER *rout,
D 31
                            int x1, int y1, int x2, int y2,
			    int newx, int newy, int factor)
E 31
I 31
                              int x1, int y1, int x2, int y2,
			      int newx, int newy, int abs_zoom_level)
E 31
{
	D 31 printf("rop_zoom_out_rgbm not implemented yet\n");
	E 31
I 31 LPIXEL *rowin, *pixin, *in, valin;
	LPIXEL *rowout, *pixout, valout;
	int tmp_r, tmp_g, tmp_b, tmp_m;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;
	valout.m = 0xff;

	rowin = (LPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
					D 38 in += factor;
					E 38
I 38 in += wrapin;
					E 38 in++;
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
					D 38 in -= factor;
					E 38
I 38 in -= wrapin;
					E 38 in++;
				}
				in += 2 * wrapin - factor;
			}
			valout.r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
			valout.g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
			valout.b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
			valout.m = (tmp_m + fac_fac_4) >> fac_fac_2_bits;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = (tmp_r + fac_xrest_2) / fac_xrest;
			valout.g = (tmp_g + fac_xrest_2) / fac_xrest;
			valout.b = (tmp_b + fac_xrest_2) / fac_xrest;
			valout.m = (tmp_m + fac_xrest_2) / fac_xrest;
			*pixout = valout;
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = (tmp_r + yrest_fac_2) / yrest_fac;
			valout.g = (tmp_g + yrest_fac_2) / yrest_fac;
			valout.b = (tmp_b + yrest_fac_2) / yrest_fac;
			valout.m = (tmp_m + yrest_fac_2) / yrest_fac;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = (tmp_r + yrest_xrest_2) / yrest_xrest;
			valout.g = (tmp_g + yrest_xrest_2) / yrest_xrest;
			valout.b = (tmp_b + yrest_xrest_2) / yrest_xrest;
			valout.m = (tmp_m + yrest_xrest_2) / yrest_xrest;
			*pixout = valout;
		}
	}
	E 31
}

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

I 46 static void rop_zoom_out_rgbx(RASTER *rin, RASTER *rout,
									int x1, int y1, int x2, int y2,
									int newx, int newy, int abs_zoom_level)
{
	LPIXEL *rowin, *pixin, *in, valin;
	LPIXEL *rowout, *pixout, valout;
	int tmp_r, tmp_g, tmp_b;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;
	valout.m = 0xff;

	rowin = (LPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in += wrapin;
					in++;
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in -= wrapin;
					in++;
				}
				in += 2 * wrapin - factor;
			}
			valout.r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
			valout.g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
			valout.b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			valout.r = (tmp_r + fac_xrest_2) / fac_xrest;
			valout.g = (tmp_g + fac_xrest_2) / fac_xrest;
			valout.b = (tmp_b + fac_xrest_2) / fac_xrest;
			*pixout = valout;
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			valout.r = (tmp_r + yrest_fac_2) / yrest_fac;
			valout.g = (tmp_g + yrest_fac_2) / yrest_fac;
			valout.b = (tmp_b + yrest_fac_2) / yrest_fac;
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			valout.r = (tmp_r + yrest_xrest_2) / yrest_xrest;
			valout.g = (tmp_g + yrest_xrest_2) / yrest_xrest;
			valout.b = (tmp_b + yrest_xrest_2) / yrest_xrest;
			*pixout = valout;
		}
	}
}
I 95
	/*---------------------------------------------------------------------------*/

	static void
	rop_zoom_out_rgbx64_rgbx(RASTER *rin, RASTER *rout,
							 int x1, int y1, int x2, int y2,
							 int newx, int newy, int abs_zoom_level)
{
	SPIXEL *rowin, *pixin, *in, valin;
	LPIXEL *rowout, *pixout, valout;
	int tmp_r, tmp_g, tmp_b;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;

	wrapin = rin->wrap;
	wrapout = rout->wrap;
	valout.m = 0xff;

	rowin = (SPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in += wrapin;
					in++;
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in -= wrapin;
					in++;
				}
				in += 2 * wrapin - factor;
			}
			valout.r = PIX_BYTE_FROM_USHORT((tmp_r + fac_fac_4) >> fac_fac_2_bits);
			valout.g = PIX_BYTE_FROM_USHORT((tmp_g + fac_fac_4) >> fac_fac_2_bits);
			valout.b = PIX_BYTE_FROM_USHORT((tmp_b + fac_fac_4) >> fac_fac_2_bits);
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			valout.r = PIX_BYTE_FROM_USHORT((tmp_r + fac_xrest_2) / fac_xrest);
			valout.g = PIX_BYTE_FROM_USHORT((tmp_g + fac_xrest_2) / fac_xrest);
			valout.b = PIX_BYTE_FROM_USHORT((tmp_b + fac_xrest_2) / fac_xrest);
			*pixout = valout;
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			valout.r = PIX_BYTE_FROM_USHORT((tmp_r + yrest_fac_2) / yrest_fac);
			valout.g = PIX_BYTE_FROM_USHORT((tmp_g + yrest_fac_2) / yrest_fac);
			valout.b = PIX_BYTE_FROM_USHORT((tmp_b + yrest_fac_2) / yrest_fac);
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			valout.r = PIX_BYTE_FROM_USHORT((tmp_r + yrest_xrest_2) / yrest_xrest);
			valout.g = PIX_BYTE_FROM_USHORT((tmp_g + yrest_xrest_2) / yrest_xrest);
			valout.b = PIX_BYTE_FROM_USHORT((tmp_b + yrest_xrest_2) / yrest_xrest);
			*pixout = valout;
		}
	}
}
/*---------------------------------------------------------------------------*/

static void rop_zoom_out_rgbm64_rgbm(RASTER *rin, RASTER *rout,
									 int x1, int y1, int x2, int y2,
									 int newx, int newy, int abs_zoom_level)
{
	SPIXEL *rowin, *pixin, *in, valin;
	LPIXEL *rowout, *pixout, valout;
	int tmp_r, tmp_g, tmp_b, tmp_m;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;

	wrapin = rin->wrap;
	wrapout = rout->wrap;
	E 95

I 95 rowin = (SPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
					in += wrapin;
					in++;
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
					in -= wrapin;
					in++;
				}
				in += 2 * wrapin - factor;
			}
			valout.r = PIX_BYTE_FROM_USHORT((tmp_r + fac_fac_4) >> fac_fac_2_bits);
			valout.g = PIX_BYTE_FROM_USHORT((tmp_g + fac_fac_4) >> fac_fac_2_bits);
			valout.b = PIX_BYTE_FROM_USHORT((tmp_b + fac_fac_4) >> fac_fac_2_bits);
			valout.m = PIX_BYTE_FROM_USHORT((tmp_m + fac_fac_4) >> fac_fac_2_bits);
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = PIX_BYTE_FROM_USHORT((tmp_r + fac_xrest_2) / fac_xrest);
			valout.g = PIX_BYTE_FROM_USHORT((tmp_g + fac_xrest_2) / fac_xrest);
			valout.b = PIX_BYTE_FROM_USHORT((tmp_b + fac_xrest_2) / fac_xrest);
			valout.m = PIX_BYTE_FROM_USHORT((tmp_m + fac_xrest_2) / fac_xrest);
			*pixout = valout;
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = PIX_BYTE_FROM_USHORT((tmp_r + yrest_fac_2) / yrest_fac);
			valout.g = PIX_BYTE_FROM_USHORT((tmp_g + yrest_fac_2) / yrest_fac);
			valout.b = PIX_BYTE_FROM_USHORT((tmp_b + yrest_fac_2) / yrest_fac);
			valout.m = PIX_BYTE_FROM_USHORT((tmp_m + yrest_fac_2) / yrest_fac);
			*pixout++ = valout;
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = tmp_m = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					tmp_m += valin.m;
				}
			valout.r = PIX_BYTE_FROM_USHORT((tmp_r + yrest_xrest_2) / yrest_xrest);
			valout.g = PIX_BYTE_FROM_USHORT((tmp_g + yrest_xrest_2) / yrest_xrest);
			valout.b = PIX_BYTE_FROM_USHORT((tmp_b + yrest_xrest_2) / yrest_xrest);
			valout.m = PIX_BYTE_FROM_USHORT((tmp_m + yrest_xrest_2) / yrest_xrest);
			*pixout = valout;
		}
	}
}
E 95
	/*---------------------------------------------------------------------------*/

I 54 static void
rop_copy_bw_rgb16(RASTER *rin, RASTER *rout,
				  int x1, int y1, int x2, int y2,
				  int newx, int newy)
{
	UCHAR *rowin, *bytein;
	USHORT *rowout, *pixout;
	USHORT rgb_0, rgb_1;
	int wrapin, wrapout, bit, bit_offs, startbit;
	int x, lx, ly;

	if (rin->type == RAS_WB) {
		rgb_0 = 0xffff;
		rgb_1 = 0x0000;
	} else {
		rgb_0 = 0x0000;
		rgb_1 = 0xffff;
	}
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = (rin->wrap + 7) >> 3;
	bit_offs = rin->bit_offs;
	wrapout = rout->wrap;

	rowin = (UCHAR *)rin->buffer + wrapin * y1 + ((x1 + bit_offs) >> 3);
	startbit = 7 - ((x1 + bit_offs) & 7);
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		bytein = rowin;
		bit = startbit;
		pixout = rowout;
		for (x = lx; x > 0; x--) {
			*pixout++ = ((*bytein >> bit) & 1) ? rgb_1 : rgb_0;
			if (bit == 0) {
				bytein++;
				bit = 7;
			} else
				bit--;
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

I 61 static void rop_zoom_out_bw_rgb16(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy, int abs_zoom_level)
{
	UCHAR *rowin, *bytein, *in;
	USHORT *rowout, *pixout;
	int val_0, val_1, tmp;
	int wrapin, wrapout, bitin, bit, bit_offs, startbit;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	if (rin->type == RAS_WB) {
		val_0 = 0xff;
		val_1 = 0x00;
	} else {
		val_0 = 0x00;
		val_1 = 0xff;
	}
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = (rin->wrap + 7) >> 3;
	bit_offs = rin->bit_offs;
	wrapout = rout->wrap;

	rowin = (UCHAR *)rin->buffer + wrapin * y1 + ((x1 + bit_offs) >> 3);
	startbit = 7 - ((x1 + bit_offs) & 7);
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		bytein = rowin;
		bitin = startbit;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp = 0;
			in = bytein;
			bit = bitin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					tmp += ((*in >> bit) & 1);
					in += wrapin;
					if (bit == 0) {
						in++;
						bit = 7;
					} else
						bit--;
					tmp += ((*in >> bit) & 1);
					in -= wrapin;
					if (bit == 0) {
						in++;
						bit = 7;
					} else
						bit--;
				}
				in += 2 * wrapin;
				bit += factor;
				while (bit > 7) {
					in--;
					bit -= 8;
				}
			}
			tmp = tmp * val_1 + (fac_fac_2 - tmp) * val_0;
			tmp = (tmp + fac_fac_4) >> fac_fac_2_bits;
			*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			bitin -= factor;
			while (bitin < 0) {
				bytein++;
				bitin += 8;
			}
		}
		if (xrest) {
			tmp = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					tmp += GET_BIT(i, j, bytein, wrapin, 7 - bitin);
				}
			tmp = tmp * val_1 + (fac_xrest - tmp) * val_0;
			tmp = (tmp + fac_xrest_2) / fac_xrest;
			*pixout = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		bytein = rowin;
		bitin = startbit;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					tmp += GET_BIT(i, j, bytein, wrapin, 7 - bitin);
				}
			tmp = tmp * val_1 + (yrest_fac - tmp) * val_0;
			tmp = (tmp + yrest_fac_2) / yrest_fac;
			*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			bitin -= factor;
			while (bitin < 0) {
				bytein++;
				bitin += 8;
			}
		}
		if (xrest) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					tmp += GET_BIT(i, j, bytein, wrapin, 7 - bitin);
				}
			tmp = tmp * val_1 + (yrest_xrest - tmp) * val_0;
			tmp = (tmp + yrest_xrest_2) / yrest_xrest;
			*pixout = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
		}
	}
}

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

E 61 static void rop_copy_gr8_rgb16(RASTER *rin, RASTER *rout,
									 int x1, int y1, int x2, int y2,
									 int newx, int newy)
{
	UCHAR *rowin, *pixin, val;
	USHORT *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (UCHAR *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			val = *pixin++;
			D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(val, val, val);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(val, val, val);
			E 60
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

static void rop_zoom_out_gr8_rgb16(RASTER *rin, RASTER *rout,
								   int x1, int y1, int x2, int y2,
								   int newx, int newy, int abs_zoom_level)
{
	UCHAR *rowin, *pixin, *in;
	USHORT *rowout, *pixout;
	int tmp;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (UCHAR *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					tmp += *in;
					in += wrapin;
					in++;
					tmp += *in;
					in -= wrapin;
					in++;
				}
				in += 2 * wrapin - factor;
			}
			tmp = (tmp + fac_fac_4) >> fac_fac_2_bits;
			D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60 pixin += factor;
		}
		if (xrest) {
			tmp = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					tmp += pixin[i + j * wrapin];
				}
			tmp = (tmp + fac_xrest_2) / fac_xrest;
			D 60
				*pixout = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
I 60
				*pixout = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					tmp += pixin[i + j * wrapin];
				}
			tmp = (tmp + yrest_fac_2) / yrest_fac;
			D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60 pixin += factor;
		}
		if (xrest) {
			tmp = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					tmp += pixin[i + j * wrapin];
				}
			tmp = (tmp + yrest_xrest_2) / yrest_xrest;
			D 60
				*pixout = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
I 60
				*pixout = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
		}
	}
}

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

E 54
I 52 static void rop_copy_cm16_rgb16(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy)
{
	USHORT *rowin, *pixin;
	LPIXEL *cmap, val;
	USHORT *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	D 56 cmap = rin->cmap.buffer - rin->cmap.offset;
	E 56
I 56 cmap = rin->cmap.buffer - rin->cmap.info.offset_mask;
	E 56 lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			val = cmap[*pixin++];
			D 54
				*pixout++ = BYTES_TO_RGB16(val.r, val.g, val.b);
			E 54
I 54
D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(val.r, val.g, val.b);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(val.r, val.g, val.b);
			E 60
E 54
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

I 96 static void rop_copy_cm16_xrgb1555(RASTER *rin, RASTER *rout,
										 int x1, int y1, int x2, int y2,
										 int newx, int newy)
{
	USHORT *rowin, *pixin;
	LPIXEL *cmap, val;
	USHORT *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	cmap = rin->cmap.buffer - rin->cmap.info.offset_mask;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			val = cmap[*pixin++];
			*pixout++ = PIX_XRGB1555_FROM_BYTES(val.r, val.g, val.b);
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

E 96
I 84 static void rop_copy_cm24_rgb16(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy)
{
	ULONG *rowin, *pixin, win;
	LPIXEL *penmap, *colmap, val;
	USHORT *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	penmap = rin->cmap.penbuffer;
	colmap = rin->cmap.colbuffer;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (ULONG *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	I 89

E 89 while (ly-- > 0)
	{
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			win = *pixin++;
			MAP24(win, penmap, colmap, val)
			*pixout++ = PIX_RGB16_FROM_BYTES(val.r, val.g, val.b);
		}
		rowin += wrapin;
		rowout += wrapout;
	}
	I 89 if (rout->extra_mask)
		rop_copy_extra(rin, rout, x1, y1, x2, y2, newx, newy);
	E 89
}

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

I 96 static void rop_copy_cm24_xrgb1555(RASTER *rin, RASTER *rout,
										 int x1, int y1, int x2, int y2,
										 int newx, int newy)
{
	ULONG *rowin, *pixin, win;
	LPIXEL *penmap, *colmap, val;
	USHORT *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	penmap = rin->cmap.penbuffer;
	colmap = rin->cmap.colbuffer;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (ULONG *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;

	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			win = *pixin++;
			MAP24(win, penmap, colmap, val)
			*pixout++ = PIX_XRGB1555_FROM_BYTES(val.r, val.g, val.b);
		}
		rowin += wrapin;
		rowout += wrapout;
	}
	if (rout->extra_mask)
		rop_copy_extra(rin, rout, x1, y1, x2, y2, newx, newy);
}

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

E 96
E 84 static void rop_zoom_out_cm16_rgb16(RASTER *rin, RASTER *rout,
										   int x1, int y1, int x2, int y2,
										   int newx, int newy, int abs_zoom_level)
{
	USHORT *rowin, *pixin, *in;
	LPIXEL *cmap, valin;
	USHORT *rowout, *pixout;
	int tmp_r, tmp_g, tmp_b;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	D 56 cmap = rin->cmap.buffer - rin->cmap.offset;
	E 56
I 56 cmap = rin->cmap.buffer - rin->cmap.info.offset_mask;
	E 56 lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					valin = cmap[*in];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in += wrapin;
					in++;
					valin = cmap[*in];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in -= wrapin;
					in++;
				}
				in += 2 * wrapin - factor;
			}
			tmp_r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
			tmp_g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
			tmp_b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
			D 54
				*pixout++ = BYTES_TO_RGB16(tmp_r, tmp_g, tmp_b);
			E 54
I 54
D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
E 54 pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					valin = cmap[pixin[i + j * wrapin]];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + fac_xrest_2) / fac_xrest;
			tmp_g = (tmp_g + fac_xrest_2) / fac_xrest;
			tmp_b = (tmp_b + fac_xrest_2) / fac_xrest;
			D 54
				*pixout = BYTES_TO_RGB16(tmp_r, tmp_g, tmp_b);
			E 54
I 54
D 60
				*pixout = ROP_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
I 60
				*pixout = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
E 54
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					valin = cmap[pixin[i + j * wrapin]];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + yrest_fac_2) / yrest_fac;
			tmp_g = (tmp_g + yrest_fac_2) / yrest_fac;
			tmp_b = (tmp_b + yrest_fac_2) / yrest_fac;
			D 54
				*pixout++ = BYTES_TO_RGB16(tmp_r, tmp_g, tmp_b);
			E 54
I 54
D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
E 54 pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					valin = cmap[pixin[i + j * wrapin]];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + yrest_xrest_2) / yrest_xrest;
			tmp_g = (tmp_g + yrest_xrest_2) / yrest_xrest;
			tmp_b = (tmp_b + yrest_xrest_2) / yrest_xrest;
			D 54
				*pixout = BYTES_TO_RGB16(tmp_r, tmp_g, tmp_b);
			E 54
I 54
D 60
				*pixout = ROP_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
I 60
				*pixout = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
E 54
		}
	}
}

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

I 84 static void rop_zoom_out_cm24_rgb16(RASTER *rin, RASTER *rout,
										  int x1, int y1, int x2, int y2,
										  int newx, int newy, int abs_zoom_level)
{
	ULONG *rowin, *pixin, *in, win;
	LPIXEL *penmap, *colmap, valin;
	USHORT *rowout, *pixout;
	int tmp_r, tmp_g, tmp_b;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	penmap = rin->cmap.penbuffer;
	colmap = rin->cmap.colbuffer;
	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (ULONG *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					win = *in;
					MAP24_64(win, penmap, colmap, valin)
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in += wrapin;
					in++;
					win = *in;
					MAP24_64(win, penmap, colmap, valin)
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in -= wrapin;
					in++;
				}
				in += 2 * wrapin - factor;
			}
			tmp_r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
			tmp_g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
			tmp_b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
			*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					win = pixin[i + j * wrapin];
					MAP24_64(win, penmap, colmap, valin)
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + fac_xrest_2) / fac_xrest;
			tmp_g = (tmp_g + fac_xrest_2) / fac_xrest;
			tmp_b = (tmp_b + fac_xrest_2) / fac_xrest;
			*pixout = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					win = pixin[i + j * wrapin];
					MAP24_64(win, penmap, colmap, valin)
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + yrest_fac_2) / yrest_fac;
			tmp_g = (tmp_g + yrest_fac_2) / yrest_fac;
			tmp_b = (tmp_b + yrest_fac_2) / yrest_fac;
			*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					win = pixin[i + j * wrapin];
					MAP24_64(win, penmap, colmap, valin)
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + yrest_xrest_2) / yrest_xrest;
			tmp_g = (tmp_g + yrest_xrest_2) / yrest_xrest;
			tmp_b = (tmp_b + yrest_xrest_2) / yrest_xrest;
			*pixout = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
		}
	}
}

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

E 84 static void rop_copy_rgbx_rgb16(RASTER *rin, RASTER *rout,
									  int x1, int y1, int x2, int y2,
									  int newx, int newy)
{
	LPIXEL *rowin, *pixin, val;
	USHORT *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (LPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			val = *pixin++;
			D 70
				*pixout++ = (val.r << 8) & 0xf800 | (val.g << 3) & 0x7e0 | (val.b >> 3);
			E 70
I 70
				*pixout++ = PIX_RGB16_FROM_RGBX(val);
			E 70
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}
I 95
	/*---------------------------------------------------------------------------*/
I 96
#define SWAP_SHORT(N) (((N) >> 8) | ((N) << 8))
E 96

I 96

	static void
	rop_copy_rgbx_xrgb1555(RASTER *rin, RASTER *rout,
						   int x1, int y1, int x2, int y2,
						   int newx, int newy)
{
	LPIXEL *rowin, *pixin, val;
	USHORT *rowout, *pixout, outval;
	int wrapin, wrapout;
	int x, y, lx, ly;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (LPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			val = *pixin++;
			outval = PIX_XRGB1555_FROM_RGBX(val);
			*pixout++ = SWAP_SHORT(outval);
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}
/*---------------------------------------------------------------------------*/

E 96 static void rop_copy_rgbx64_rgb16(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy)
{
	SPIXEL *rowin, *pixin, val;
	USHORT *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;
	E 95

I 95 rowin = (SPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			val = *pixin++;
			*pixout++ = PIX_RGB16_FROM_RGBX64(val);
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}
E 95
	/*---------------------------------------------------------------------------*/

I 96 static void
rop_copy_rgbx64_xrgb1555(RASTER *rin, RASTER *rout,
						 int x1, int y1, int x2, int y2,
						 int newx, int newy)
{
	SPIXEL *rowin, *pixin, val;
	USHORT *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (SPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			val = *pixin++;
			*pixout++ = PIX_XRGB1555_FROM_RGBX64(val);
		}
		rowin += wrapin;
		rowout += wrapout;
	}
}
/*---------------------------------------------------------------------------*/

E 96
I 70 static void rop_copy_rgb16_rgbm(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy)
{
	USHORT *rowin, *pixin;
	LPIXEL *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++, *pixin++, *pixout++)
			PIX_RGB16_TO_RGBM(*pixin, *pixout)
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

I 96 static void rop_copy_xrgb1555_rgbm(RASTER *rin, RASTER *rout,
										 int x1, int y1, int x2, int y2,
										 int newx, int newy)
{
	USHORT *rowin, *pixin;
	LPIXEL *rowout, *pixout;
	int wrapin, wrapout;
	int x, y, lx, ly;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (USHORT *)rin->buffer + wrapin * y1 + x1;
	rowout = (LPIXEL *)rout->buffer + wrapout * newy + newx;
	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++, *pixin++, *pixout++)
			PIX_XRGB1555_TO_RGBM(*pixin, *pixout)
		rowin += wrapin;
		rowout += wrapout;
	}
}

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

E 96
E 70 static void rop_zoom_out_rgbx_rgb16(RASTER *rin, RASTER *rout,
										   int x1, int y1, int x2, int y2,
										   int newx, int newy, int abs_zoom_level)
{
	LPIXEL *rowin, *pixin, *in, valin;
	USHORT *rowout, *pixout;
	int tmp_r, tmp_g, tmp_b;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	D 61 xrest = lx % factor;
	yrest = ly % factor;
	E 61
I 61 xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	E 61 xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (LPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in += wrapin;
					in++;
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in -= wrapin;
					in++;
				}
				in += 2 * wrapin - factor;
			}
			tmp_r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
			tmp_g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
			tmp_b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
			D 54
				*pixout++ = BYTES_TO_RGB16(tmp_r, tmp_g, tmp_b);
			E 54
I 54
D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
E 54 pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + fac_xrest_2) / fac_xrest;
			tmp_g = (tmp_g + fac_xrest_2) / fac_xrest;
			tmp_b = (tmp_b + fac_xrest_2) / fac_xrest;
			D 54
				*pixout = BYTES_TO_RGB16(tmp_r, tmp_g, tmp_b);
			E 54
I 54
D 60
				*pixout = ROP_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
I 60
				*pixout = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
E 54
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + yrest_fac_2) / yrest_fac;
			tmp_g = (tmp_g + yrest_fac_2) / yrest_fac;
			tmp_b = (tmp_b + yrest_fac_2) / yrest_fac;
			D 54
				*pixout++ = BYTES_TO_RGB16(tmp_r, tmp_g, tmp_b);
			E 54
I 54
D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
E 54 pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + yrest_xrest_2) / yrest_xrest;
			tmp_g = (tmp_g + yrest_xrest_2) / yrest_xrest;
			tmp_b = (tmp_b + yrest_xrest_2) / yrest_xrest;
			D 54
				*pixout = BYTES_TO_RGB16(tmp_r, tmp_g, tmp_b);
			E 54
I 54
D 60
				*pixout = ROP_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
I 60
				*pixout = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			E 60
E 54
		}
	}
}

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

I 95 static void rop_zoom_out_rgbx64_rgb16(RASTER *rin, RASTER *rout,
											int x1, int y1, int x2, int y2,
											int newx, int newy, int abs_zoom_level)
{
	SPIXEL *rowin, *pixin, *in, valin;
	USHORT *rowout, *pixout;
	int tmp_r, tmp_g, tmp_b;
	int wrapin, wrapout;
	int x, y, lx, ly, xlast, ylast, xrest, yrest, i, j;
	int factor, fac_fac_2_bits;
	int fac_fac, yrest_fac, fac_xrest, yrest_xrest;
	int fac_fac_2, yrest_fac_2, fac_xrest_2, yrest_xrest_2;
	int fac_fac_4;

	lx = x2 - x1 + 1;
	ly = y2 - y1 + 1;
	factor = 1 << abs_zoom_level;
	xrest = lx & (factor - 1);
	yrest = ly & (factor - 1);
	xlast = x2 - xrest + 1;
	ylast = y2 - yrest + 1;
	fac_fac = factor * factor;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	yrest_fac = yrest * factor;
	yrest_fac_2 = yrest_fac >> 1;
	fac_xrest = factor * xrest;
	fac_xrest_2 = fac_xrest >> 1;
	yrest_xrest = yrest * xrest;
	yrest_xrest_2 = yrest_xrest >> 1;
	/*dafare*/
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (SPIXEL *)rin->buffer + wrapin * y1 + x1;
	rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
	for (y = y1; y < ylast; y += factor) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in += wrapin;
					in++;
					valin = *in;
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
					in -= wrapin;
					in++;
				}
				in += 2 * wrapin - factor;
			}
			tmp_r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
			tmp_g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
			tmp_b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
			*pixout++ = PIX_RGB16_FROM_USHORT(tmp_r, tmp_g, tmp_b);
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + fac_xrest_2) / fac_xrest;
			tmp_g = (tmp_g + fac_xrest_2) / fac_xrest;
			tmp_b = (tmp_b + fac_xrest_2) / fac_xrest;
			*pixout = PIX_RGB16_FROM_USHORT(tmp_r, tmp_g, tmp_b);
		}
		rowin += wrapin * factor;
		rowout += wrapout;
	}
	if (yrest) {
		pixin = rowin;
		pixout = rowout;
		for (x = x1; x < xlast; x += factor) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < factor; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + yrest_fac_2) / yrest_fac;
			tmp_g = (tmp_g + yrest_fac_2) / yrest_fac;
			tmp_b = (tmp_b + yrest_fac_2) / yrest_fac;
			*pixout++ = PIX_RGB16_FROM_USHORT(tmp_r, tmp_g, tmp_b);
			pixin += factor;
		}
		if (xrest) {
			tmp_r = tmp_g = tmp_b = 0;
			for (j = 0; j < yrest; j++)
				for (i = 0; i < xrest; i++) {
					valin = pixin[i + j * wrapin];
					tmp_r += valin.r;
					tmp_g += valin.g;
					tmp_b += valin.b;
				}
			tmp_r = (tmp_r + yrest_xrest_2) / yrest_xrest;
			tmp_g = (tmp_g + yrest_xrest_2) / yrest_xrest;
			tmp_b = (tmp_b + yrest_xrest_2) / yrest_xrest;
			*pixout = PIX_RGB16_FROM_USHORT(tmp_r, tmp_g, tmp_b);
		}
	}
}

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

E 95
E 52
E 46
E 28
E 20

	/* copia un rettangolo da rin a rout.
 * Le coordinate sono relative ai due raster: (0, 0) corrisponde
 * al primo pixel del raster.
 * 
 */

	void
	rop_copy(RASTER *rin, RASTER *rout,
			 int x1, int y1, int x2, int y2, int newx, int newy)
{
	D 13 char *rowin, *rowout;
	E 13
I 13
D 41 UCHAR *rowin, *rowout;
	E 13
D 10 int rowsize, wrapin, wrapout, d, tmp;
	E 10
I 10 int rowsize, bytewrapin, bytewrapout, d, tmp;
	E 10
D 12 int pixbits_in, pixbits_out;
	E 12
I 12 int pixbits_in, pixbits_out;
	int pixbytes_in, pixbytes_out;
	E 41
I 41 int tmp;
	E 41
E 12
I 4 int rasras;
	E 4

		/* raddrizzo gli estremi */
		if (x1 > x2)
	{
		tmp = x1;
		x1 = x2;
		x2 = tmp;
	}
	if (y1 > y2) {
		tmp = y1;
		y1 = y2;
		y2 = tmp;
	}

	/* controllo gli sconfinamenti */
	if (x1 < 0 || y1 < 0 || x2 >= rin->lx || y2 >= rin->ly || newx < 0 || newy < 0 ||
		newx + x2 - x1 >= rout->lx || newy + y2 - y1 >= rout->ly)
		D 27
		{
			printf("### INTERNAL ERROR - rop_copy; access violation\n");
			return;
		}
	E 27
I 27
	{
		printf("### INTERNAL ERROR - rop_copy; access violation\n"
			   " ((%d,%d)(%d,%d)in(%dx%d)->(%d,%d)in(%dx%d))\n",
			   x1, y1, x2, y2, rin->lx, rin->ly, newx, newy, rout->lx, rout->ly);
		return;
	}
	E 27

D 2 if (rin->type == RAS_CM && rout->type == RAS_RGBM) 
E 2
I 2
D 4 if (rin->type == RAS_CM16 && rout->type == RAS_RGBM) 
E 2
	{
		D 2 rop_copy_cm_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);
		E 2
I 2 rop_copy_cm16_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);
		E 2 return;
	}

	E 4
D 10 pixbits_in = rop_pixbits(rin->type);
	pixbits_out = rop_pixbits(rout->type);
	E 10
I 10
D 23 pixbits_in = rop_pixbits(rin->type);
	pixbytes_in = rop_pixbytes(rin->type);
	pixbits_out = rop_pixbits(rout->type);
	pixbytes_out = rop_pixbytes(rout->type);
	E 23
E 10
D 4

E 4
I 4
D 96 rasras = RASRAS(rin->type, rout->type);
	switch (rasras)
		E 96
I 96 if (rin->type == rout->type)
			rop_copy_same(rin, rout, x1, y1, x2, y2, newx, newy);
	else E 96
	{
		I 73
D 96 CASE RASRAS(RAS_RGBM64, RAS_RGBM64) : __OR RASRAS(RAS_RGB_64, RAS_RGB_64) : __OR RASRAS(RAS_RGBM, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGBM) : __OR RASRAS(RAS_RGB_, RAS_RGB_) : __OR RASRAS(RAS_RGB, RAS_RGB) : __OR RASRAS(RAS_RGB16, RAS_RGB16) :
D 83 __OR RASRAS(RAS_UNICM16, RAS_UNICM16) :
E 83 __OR RASRAS(RAS_CM16S8, RAS_CM16S8) : __OR RASRAS(RAS_CM16S4, RAS_CM16S4) : __OR RASRAS(RAS_CM16, RAS_CM16) : __OR RASRAS(RAS_MBW16, RAS_MBW16) : __OR RASRAS(RAS_GR8, RAS_GR8) :
I 90 __OR RASRAS(RAS_GR16, RAS_GR16) :
E 90
D 83 __OR RASRAS(RAS_UNICM8, RAS_UNICM8) :
E 83 __OR RASRAS(RAS_CM8, RAS_CM8) : __OR RASRAS(RAS_CM8S8, RAS_CM8S8) : __OR RASRAS(RAS_CM8S4, RAS_CM8S4) :
I 84 __OR RASRAS(RAS_CM24, RAS_CM24) :
E 84 rop_copy_same(rin, rout, x1, y1, x2, y2, newx, newy);

		E 73
D 18 CASE RASRAS(RAS_CM16, RAS_RGBM) :
E 18
I 18 CASE RASRAS(RAS_GR8, RAS_RGB_) : __OR RASRAS(RAS_GR8, RAS_RGBM) : rop_copy_gr8_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);
		D 41 return;
		E 41

			CASE RASRAS(RAS_CM16, RAS_RGB_) : __OR RASRAS(RAS_CM16, RAS_RGBM) :
E 18 rop_copy_cm16_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);
		D 41 return;
		E 41

I 84 CASE RASRAS(RAS_CM24, RAS_RGB_) : __OR RASRAS(RAS_CM24, RAS_RGBM) : rop_copy_cm24_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		E 84
I 58 CASE RASRAS(RAS_CM16, RAS_RGB_64) : __OR RASRAS(RAS_CM16, RAS_RGBM64) : rop_copy_cm16_rgbm64(rin, rout, x1, y1, x2, y2, newx, newy);

		I 84 CASE RASRAS(RAS_CM24, RAS_RGB_64) : __OR RASRAS(RAS_CM24, RAS_RGBM64) : rop_copy_cm24_rgbm64(rin, rout, x1, y1, x2, y2, newx, newy);

		E 84 CASE RASRAS(RAS_RGBM, RAS_RGBM64) : rop_copy_rgbm_rgbm64(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_RGBM64, RAS_RGBM) : rop_copy_rgbm64_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		I 95 CASE RASRAS(RAS_RGB_64, RAS_RGB_) : __OR RASRAS(RAS_RGBM64, RAS_RGB_) : __OR RASRAS(RAS_RGB_64, RAS_RGBM) : rop_copy_rgbx64_rgbx(rin, rout, x1, y1, x2, y2, newx, newy);

		E 95
I 81 CASE RASRAS(RAS_RGB, RAS_RGB16) : rop_copy_rgb_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

		E 81
E 58
I 18 CASE RASRAS(RAS_RGB, RAS_RGB_) : __OR RASRAS(RAS_RGB, RAS_RGBM) : rop_copy_rgb_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);
		D 41 return;
		E 41

I 68 CASE RASRAS(RAS_BW, RAS_BW) : __OR RASRAS(RAS_BW, RAS_WB) : __OR RASRAS(RAS_WB, RAS_BW) : __OR RASRAS(RAS_WB, RAS_WB) :
D 69 rop_copy_bw_bw(rin, rout, x1, y1, x2, y2, newx, newy);
		E 69
I 69 rop_copy_bw(rin, rout, x1, y1, x2, y2, newx, newy);
		E 69

E 68
E 18 CASE RASRAS(RAS_BW, RAS_CM16) : __OR RASRAS(RAS_WB, RAS_CM16) : rop_copy_bw_cm16(rin, rout, x1, y1, x2, y2, newx, newy);
		I 19
D 41 return;
		E 41

I 84 CASE RASRAS(RAS_BW, RAS_CM24) : __OR RASRAS(RAS_WB, RAS_CM24) : rop_copy_bw_cm24(rin, rout, x1, y1, x2, y2, newx, newy);

		E 84 CASE RASRAS(RAS_BW, RAS_RGB_) : __OR RASRAS(RAS_BW, RAS_RGBM) : __OR RASRAS(RAS_WB, RAS_RGB_) : __OR RASRAS(RAS_WB, RAS_RGBM) : rop_copy_bw_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);
		E 19
D 41 return;
		E 41
I 6

			CASE RASRAS(RAS_GR8, RAS_CM16) : rop_copy_gr8_cm16(rin, rout, x1, y1, x2, y2, newx, newy);
		D 41 return;
		E 41
I 23

I 84 CASE RASRAS(RAS_GR8, RAS_CM24) : rop_copy_gr8_cm24(rin, rout, x1, y1, x2, y2, newx, newy);

		E 84 CASE RASRAS(RAS_CM8, RAS_CM16) : rop_copy_cm8_cm16(rin, rout, x1, y1, x2, y2, newx, newy);
		D 41 return;
		I 39 CASE RASRAS(RAS_CM16, RAS_BW) : rop_copy_cm8_cm16(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	DEFAULT:
		rop_copy_quantize(rasras, rin, rout, x1, y1, x2, y2, newx, newy);
		return;
		E 39
E 23
	}
	I 23 pixbits_in = rop_pixbits(rin->type);
	pixbytes_in = rop_pixbytes(rin->type);
	pixbits_out = rop_pixbits(rout->type);
	pixbytes_out = rop_pixbytes(rout->type);
	E 41

I 84 CASE RASRAS(RAS_CM8, RAS_CM24) : rop_copy_cm8_cm24(rin, rout, x1, y1, x2, y2, newx, newy);

	E 84
E 23
D 41
		/* pixsize compatibili */
		if (pixbits_in != pixbits_out)
	{
		printf("### INTERNAL ERROR - rop_copy; different pixel size\n");
		return;
	}

	/* per adesso niente pixel non multipli di 8 bits */
	if (rop_fillerbits(rin->type) || rop_fillerbits(rout->type)) {
		printf("### INTERNAL ERROR - rop_copy; fillerbits not allowed\n");
		return;
	}
	E 41
I 41
D 52 CASE RASRAS(RAS_GR8, RAS_GR8) : __OR RASRAS(RAS_CM8, RAS_CM8) : __OR RASRAS(RAS_CM16, RAS_CM16) : __OR RASRAS(RAS_RGB, RAS_RGB) : __OR RASRAS(RAS_RGB_, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGBM) :
E 52
I 52
D 73 CASE RASRAS(RAS_GR8, RAS_GR8) : __OR RASRAS(RAS_CM8, RAS_CM8) : __OR RASRAS(RAS_CM16, RAS_CM16) : __OR RASRAS(RAS_RGB16, RAS_RGB16) : __OR RASRAS(RAS_RGB, RAS_RGB) : __OR RASRAS(RAS_RGB_, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGBM) :
I 58 __OR RASRAS(RAS_RGBM64, RAS_RGBM64) : __OR RASRAS(RAS_RGB_64, RAS_RGB_64) :
E 58
E 52 __OR RASRAS(RAS_MBW16, RAS_MBW16) : __OR RASRAS(RAS_UNICM8, RAS_UNICM8) : __OR RASRAS(RAS_UNICM16, RAS_UNICM16) :
I 72 __OR RASRAS(RAS_CM8S8, RAS_CM8S8) : __OR RASRAS(RAS_CM8S4, RAS_CM8S4) : __OR RASRAS(RAS_CM16S8, RAS_CM16S8) : __OR RASRAS(RAS_CM16S4, RAS_CM16S4) :
E 72 rop_copy_same(rin, rout, x1, y1, x2, y2, newx, newy);

	D 71 CASE RASRAS(RAS_RGBM, RAS_UNICM16) :
E 71
I 71 CASE RASRAS(RAS_RGB_, RAS_UNICM16) : __OR RASRAS(RAS_RGBM, RAS_UNICM16) : __OR RASRAS(RAS_RGB_, RAS_UNICM8) :
E 71 __OR RASRAS(RAS_RGBM, RAS_UNICM8) :
I 71 __OR RASRAS(RAS_RGB_, RAS_GR8) :
E 71 __OR RASRAS(RAS_RGBM, RAS_GR8) :
I 71 __OR RASRAS(RAS_RGB_, RAS_MBW16) :
E 71 __OR RASRAS(RAS_RGBM, RAS_MBW16) :
I 72 __OR RASRAS(RAS_RGB_, RAS_BW) : __OR RASRAS(RAS_RGBM, RAS_BW) : __OR RASRAS(RAS_RGB16, RAS_BW) :
E 72
I 42 __OR RASRAS(RAS_CM16, RAS_UNICM16) : __OR RASRAS(RAS_CM16, RAS_UNICM8) : __OR RASRAS(RAS_CM16, RAS_GR8) : __OR RASRAS(RAS_CM16, RAS_MBW16) :
E 42 __OR RASRAS(RAS_UNICM16, RAS_UNICM8) : __OR RASRAS(RAS_UNICM16, RAS_GR8) :
I 71 __OR RASRAS(RAS_RGB_, RAS_CM16S8) : __OR RASRAS(RAS_RGBM, RAS_CM16S8) : __OR RASRAS(RAS_RGB_, RAS_CM16S4) : __OR RASRAS(RAS_RGBM, RAS_CM16S4) : __OR RASRAS(RAS_RGB_, RAS_CM8S8) : __OR RASRAS(RAS_RGBM, RAS_CM8S8) :
I 72 __OR RASRAS(RAS_RGB16, RAS_CM8S8) :
E 72 __OR RASRAS(RAS_RGB_, RAS_CM8S4) : __OR RASRAS(RAS_RGBM, RAS_CM8S4) : __OR RASRAS(RAS_CM16, RAS_CM16S8) : __OR RASRAS(RAS_CM16, RAS_CM16S4) : __OR RASRAS(RAS_CM16, RAS_CM8S8) : __OR RASRAS(RAS_CM16, RAS_CM8S4) :
E 71
D 42 __OR RASRAS(RAS_CM16, RAS_MBW16) :
E 42 rop_copy_quantize(rasras, rin, rout, x1, y1, x2, y2, newx, newy);
	E 41

E 73
I 54 CASE RASRAS(RAS_BW, RAS_RGB16) : __OR RASRAS(RAS_WB, RAS_RGB16) : rop_copy_bw_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

	CASE RASRAS(RAS_GR8, RAS_RGB16) : rop_copy_gr8_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

	E 54
I 52 CASE RASRAS(RAS_CM16, RAS_RGB16) : rop_copy_cm16_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

	I 84 CASE RASRAS(RAS_CM24, RAS_RGB16) : rop_copy_cm24_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

	E 84 CASE RASRAS(RAS_RGB_, RAS_RGB16) : __OR RASRAS(RAS_RGBM, RAS_RGB16) : rop_copy_rgbx_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);
	I 70

I 95 CASE RASRAS(RAS_RGB_64, RAS_RGB16) : __OR RASRAS(RAS_RGBM64, RAS_RGB16) : rop_copy_rgbx64_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

	E 95
D 74 CASE RASRAS(RAS_RGB16, RAS_RGBM) :
E 74
I 74 CASE RASRAS(RAS_RGB16, RAS_RGB_) : __OR RASRAS(RAS_RGB16, RAS_RGBM) :
E 74 rop_copy_rgb16_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);
	E 70

I 67 CASE RASRAS(RAS_RGB_, RAS_RGB) : __OR RASRAS(RAS_RGBM, RAS_RGB) : rop_copy_rgbx_rgb(rin, rout, x1, y1, x2, y2, newx, newy);
	I 73

D 83 CASE RASRAS(RAS_RGBM, RAS_UNICM16) : __OR RASRAS(RAS_RGBM, RAS_CM16S8) : __OR RASRAS(RAS_RGBM, RAS_CM16S4) : __OR RASRAS(RAS_RGBM, RAS_MBW16) : __OR RASRAS(RAS_RGBM, RAS_UNICM8) : __OR RASRAS(RAS_RGBM, RAS_GR8) : __OR RASRAS(RAS_RGBM, RAS_CM8S8) : __OR RASRAS(RAS_RGBM, RAS_CM8S4) : __OR RASRAS(RAS_RGBM, RAS_BW) :

																																																																																  __OR RASRAS(RAS_RGB_, RAS_UNICM16) : __OR RASRAS(RAS_RGB_, RAS_CM16S8) : __OR RASRAS(RAS_RGB_, RAS_CM16S4) : __OR RASRAS(RAS_RGB_, RAS_MBW16) : __OR RASRAS(RAS_RGB_, RAS_UNICM8) : __OR RASRAS(RAS_RGB_, RAS_GR8) : __OR RASRAS(RAS_RGB_, RAS_CM8S8) : __OR RASRAS(RAS_RGB_, RAS_CM8S4) : __OR RASRAS(RAS_RGB_, RAS_BW) :

																																																																																																																																																															 __OR RASRAS(RAS_RGB16, RAS_CM8S8) : __OR RASRAS(RAS_RGB16, RAS_BW) :

																																																																																																																																																																																  __OR RASRAS(RAS_CM16, RAS_UNICM16) : __OR RASRAS(RAS_CM16, RAS_CM16S8) : __OR RASRAS(RAS_CM16, RAS_CM16S4) : __OR RASRAS(RAS_CM16, RAS_MBW16) : __OR RASRAS(RAS_CM16, RAS_UNICM8) : __OR RASRAS(RAS_CM16, RAS_GR8) : __OR RASRAS(RAS_CM16, RAS_CM8S8) : __OR RASRAS(RAS_CM16, RAS_CM8S4) : __OR RASRAS(RAS_CM16, RAS_BW) :

																																																																																																																																																																																																																																																															 __OR RASRAS(RAS_UNICM16, RAS_UNICM8) : __OR RASRAS(RAS_UNICM16, RAS_GR8) :
E 83
I 83 CASE RASRAS(RAS_RGBM, RAS_CM16S8) : __OR RASRAS(RAS_RGBM, RAS_CM16S4) : __OR RASRAS(RAS_RGBM, RAS_MBW16) : __OR RASRAS(RAS_RGBM, RAS_GR8) :
I 90 __OR RASRAS(RAS_RGBM64, RAS_GR8) : __OR RASRAS(RAS_RGBM, RAS_GR16) : __OR RASRAS(RAS_RGBM64, RAS_GR16) :
E 90 __OR RASRAS(RAS_RGBM, RAS_CM8S8) : __OR RASRAS(RAS_RGBM, RAS_CM8S4) : __OR RASRAS(RAS_RGBM, RAS_BW) : __OR RASRAS(RAS_RGB_, RAS_CM16S8) : __OR RASRAS(RAS_RGB_, RAS_CM16S4) : __OR RASRAS(RAS_RGB_, RAS_MBW16) : __OR RASRAS(RAS_RGB_, RAS_GR8) : __OR RASRAS(RAS_RGB_, RAS_CM8S8) : __OR RASRAS(RAS_RGB_, RAS_CM8S4) : __OR RASRAS(RAS_RGB_, RAS_BW) : __OR RASRAS(RAS_RGB16, RAS_CM8S8) : __OR RASRAS(RAS_RGB16, RAS_BW) : __OR RASRAS(RAS_CM16, RAS_CM16S8) : __OR RASRAS(RAS_CM16, RAS_CM16S4) : __OR RASRAS(RAS_CM16, RAS_MBW16) : __OR RASRAS(RAS_CM16, RAS_GR8) :
I 90 __OR RASRAS(RAS_CM16, RAS_GR16) :
E 90 __OR RASRAS(RAS_CM16, RAS_CM8S8) : __OR RASRAS(RAS_CM16, RAS_CM8S4) : __OR RASRAS(RAS_CM16, RAS_BW) :
I 84 __OR RASRAS(RAS_CM24, RAS_CM16S8) : __OR RASRAS(RAS_CM24, RAS_CM16S4) : __OR RASRAS(RAS_CM24, RAS_MBW16) : __OR RASRAS(RAS_CM24, RAS_GR8) :
D 89 __OR RASRAS(RAS_CM24, RAS_CM8S8) : __OR RASRAS(RAS_CM24, RAS_CM8S4) : __OR RASRAS(RAS_CM24, RAS_BW) :
E 84
E 83 rop_copy_quantize(rasras, rin, rout, x1, y1, x2, y2, newx, newy);
	E 73

E 67
E 52
D 41
		/* copia */
D 10 rowsize = (pixbits_in * (x2 - x1 + 1)) >> 3;
	I 7
#ifdef CHE_CAVOLO_VADO_A_SCRIVERE___WALTER
E 7 wrapin = (rin->wrap * pixbits_in) >> 3;
	wrapout = (rout->wrap * pixbits_out) >> 3;
	D 7

E 7
I 7
#else
		wrapin = rin->wrap;
	wrapout = rout->wrap;
#endif
E 7 rowin = (char *)rin->buffer + y1 * wrapin + ((x1 * pixbits_in) >> 3);
	rowout = (char *)rout->buffer + newy * wrapout + ((newx * pixbits_out) >> 3);
E 10
I 10
D 11
rowsize = pixbytes_in * (x2-x1+1));
E 11
I 11 rowsize = pixbytes_in * (x2 - x1 + 1);
E 11 bytewrapin = rin->wrap * pixbytes_in;
bytewrapout = rout->wrap * pixbytes_out;
D 12 rowin = (UCHAR *)rin->buffer + y1 * wrapin + ((x1 * pixbits_in) >> 3);
rowout = (UCHAR *)rout->buffer + newy * wrapout + ((newx * pixbits_out) >> 3);
E 12
I 12 rowin = (UCHAR *)rin->buffer + y1 * bytewrapin + ((x1 * pixbits_in) >> 3);
rowout = (UCHAR *)rout->buffer + newy * bytewrapout + ((newx * pixbits_out) >> 3);
E 12
E 10 d = y2 - y1 + 1;
while (d-- > 0) {
	memmove(rowout, rowin, rowsize);
	D 10 rowin += wrapin;
	rowout += wrapout;
	E 10
I 10 rowin += bytewrapin;
	rowout += bytewrapout;
	E 41
I 41 DEFAULT :
D 52 assert(FALSE);
	E 52
I 52 assert(!"rop_copy; invalid raster combination");
	E 52
E 41
I 20
}
}

/*---------------------------------------------------------------------------*/
D 84

	/* copia un rettangolo da rin a rout.
 * Le coordinate sono relative ai due raster: (0, 0) corrisponde
 * al primo pixel del raster.
 * Riduce le dimensioni di un certo fattore facendo la media dei valori
 * dei pixel.
 */

	void
	rop_reduce(RASTER *rin, RASTER *rout,
			   int x1, int y1, int x2, int y2, int newx, int newy,
			   int factor)
{
	int tmp, newlx, newly;
	int rasras;

	if (factor == 1)
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);

	/* raddrizzo gli estremi */
	if (x1 > x2) {
		tmp = x1;
		x1 = x2;
		x2 = tmp;
	}
	if (y1 > y2) {
		tmp = y1;
		y1 = y2;
		y2 = tmp;
	}

	/* controllo gli sconfinamenti */
	newlx = (x2 - x1 + factor) / factor;
	newly = (y2 - y1 + factor) / factor;
	if (x1 < 0 || y1 < 0 || x2 >= rin->lx || y2 >= rin->ly || newx < 0 || newy < 0 ||
		newx + newlx > rout->lx || newy + newly > rout->ly) {
		printf("### INTERNAL ERROR - rop_reduce; access violation\n");
		return;
	}

	rasras = RASRAS(rin->type, rout->type);
	switch (rasras) {
		CASE RASRAS(RAS_GR8, RAS_RGB_) : __OR RASRAS(RAS_GR8, RAS_RGBM) : rop_reduce_gr8_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		CASE RASRAS(RAS_CM16, RAS_RGB_) :
D 28 __OR RASRAS(RAS_CM16, RAS_RGBM) :
E 28
I 28
D 46 rop_reduce_cm16_rgb_(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		E 46
I 46 rop_reduce_cm16_rgbx(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		E 46 return;

		CASE RASRAS(RAS_CM16, RAS_RGBM) :
E 28 rop_reduce_cm16_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		I 81 CASE RASRAS(RAS_RGB, RAS_RGB16) : rop_reduce_rgb_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		E 81 CASE RASRAS(RAS_RGB, RAS_RGB_) : __OR RASRAS(RAS_RGB, RAS_RGBM) : rop_reduce_rgb_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		CASE RASRAS(RAS_BW, RAS_CM16) : __OR RASRAS(RAS_WB, RAS_CM16) : rop_reduce_bw_cm16(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		CASE RASRAS(RAS_BW, RAS_RGB_) : __OR RASRAS(RAS_BW, RAS_RGBM) : __OR RASRAS(RAS_WB, RAS_RGB_) : __OR RASRAS(RAS_WB, RAS_RGBM) : rop_reduce_bw_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		CASE RASRAS(RAS_GR8, RAS_CM16) : rop_reduce_gr8_cm16(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		CASE RASRAS(RAS_WB, RAS_GR8) : __OR RASRAS(RAS_BW, RAS_GR8) : rop_reduce_bw_gr8(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		CASE RASRAS(RAS_GR8, RAS_GR8) : rop_reduce_gr8(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		CASE RASRAS(RAS_CM16, RAS_CM16) : rop_reduce_cm16(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

		CASE RASRAS(RAS_RGB_, RAS_RGB_) : __OR RASRAS(RAS_RGB_, RAS_RGBM) : __OR RASRAS(RAS_RGBM, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGBM) : rop_reduce_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, factor);
		return;

	DEFAULT:
		D 52 printf("### INTERNAL ERROR - rop_reduce; invalid raster combination\n");
		E 52
I 52 assert(!"rop_reduce; invalid raster combination");
		E 52
I 28
	}
}

/*---------------------------------------------------------------------------*/
E 84
I 39
	/* copia un rettangolo da rin a rout.
 * Le coordinate sono relative ai due raster: (0, 0) corrisponde
 * al primo pixel del raster.
 * Riduce le dimensioni di un fattore di subsampling pari a shrink.
 * I due raster devono essere dello stesso tipo.
 */

	void
	rop_shrink(RASTER *rin, RASTER *rout,
			   int x1, int y1, int x2, int y2, int newx, int newy,
			   int shrink)
{
	UCHAR *curr_pixin, *bufferin;
	int i, j, tmp, bpp;
	int xsize, ysize, wrapin, wrapout;
	UCHAR *curr_pixout, *bufferout;
	I 84 USHORT *curr_pixin_2, *curr_pixout_2;
	ULONG *curr_pixin_4, *curr_pixout_4;
	E 84

		if (shrink == 1) return;

	/* raddrizzo gli estremi */
	if (x1 > x2) {
		tmp = x1;
		x1 = x2;
		x2 = tmp;
	}
	if (y1 > y2) {
		tmp = y1;
		y1 = y2;
		y2 = tmp;
	}
	E 39

I 39
		/* controllo gli sconfinamenti */

		if (x1 < 0 || y1 < 0 || x2 >= rin->lx || y2 >= rin->ly ||
			newx < 0 || newy < 0 ||
			newx + (x2 - x1 + shrink) / shrink > rout->lx ||
			newy + (y2 - y1 + shrink) / shrink > rout->ly ||
			rin->type != rout->type)
	{
		printf("### INTERNAL ERROR - rop_shrink; access violation\n");
		return;
	}

	bpp = rop_pixbytes(rin->type);

	xsize = (x2 - x1 + shrink) / shrink;
	ysize = (y2 - y1 + shrink) / shrink;

	wrapin = rin->wrap * bpp;

	bufferin = (UCHAR *)(rin->buffer) + wrapin * y1 + x1 * bpp;

	wrapout = rout->wrap * bpp;
	bufferout = (UCHAR *)(rout->buffer) + wrapout * newy + newx * bpp;

	wrapin *= shrink;
	D 84 shrink *= bpp;
	E 84

		for (i = 0; i < ysize; i++)
	{
		curr_pixin = bufferin;
		curr_pixout = bufferout;
		bufferin += wrapin;
		bufferout += wrapout;

		D 84 for (j = 0; j < xsize; j++)
E 84
I 84 switch (bpp)
E 84
		{
			D 84 memcpy(curr_pixout, curr_pixin, bpp);
			curr_pixin += shrink;
			curr_pixout += bpp;
		}
	}
}

/*---------------------------------------------------------------------------*/
E 39

	/* copia un rettangolo da rin a rout.
 * Le coordinate sono relative ai due raster: (0, 0) corrisponde
 * al primo pixel del raster.
 * Riduce le dimensioni di una potenza di due facendo la media dei valori
D 29
 * dei pixel, ma solo su circa 3/4 dei pixel.
E 29
I 29
 * dei pixel, ma solo su una parte dei pixel.
E 29
 */

	void
	rop_zoom_out(RASTER *rin, RASTER *rout,
				 int x1, int y1, int x2, int y2, int newx, int newy,
				 int abs_zoom_level)
{
	int tmp, newlx, newly;
	int rasras, factor, abszl;

	abszl = abs_zoom_level;
	factor = 1 << abs_zoom_level;
	if (factor == 1)
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);

	/* raddrizzo gli estremi */
	if (x1 > x2) {
		tmp = x1;
		x1 = x2;
		x2 = tmp;
	}
	if (y1 > y2) {
		tmp = y1;
		y1 = y2;
		y2 = tmp;
	}

	/* controllo gli sconfinamenti */
	newlx = (x2 - x1 + factor) / factor;
	newly = (y2 - y1 + factor) / factor;
	if (x1 < 0 || y1 < 0 || x2 >= rin->lx || y2 >= rin->ly || newx < 0 || newy < 0 ||
		newx + newlx > rout->lx || newy + newly > rout->ly)
		D 30
		{
			printf("### INTERNAL ERROR - rop_zoom_out; access violation\n");
			return;
		}
	E 30
I 30
	{
		printf("### INTERNAL ERROR - rop_zoom_out; access violation\n"
			   " ((%d,%d)(%d,%d)in(%dx%d)->(%d,%d)in(%dx%d))\n",
			   x1, y1, x2, y2, rin->lx, rin->ly, newx, newy, rout->lx, rout->ly);
		return;
	}
	E 30

		rasras = RASRAS(rin->type, rout->type);
	switch (rasras) {
		CASE RASRAS(RAS_GR8, RAS_RGB_) : __OR RASRAS(RAS_GR8, RAS_RGBM) : rop_zoom_out_gr8_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

			CASE RASRAS(RAS_CM16, RAS_RGB_) :
D 46 rop_zoom_out_cm16_rgb_(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		E 46
I 46 rop_zoom_out_cm16_rgbx(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		E 46
D 57 return;
		E 57

			CASE RASRAS(RAS_CM16, RAS_RGBM) : rop_zoom_out_cm16_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

I 81 CASE RASRAS(RAS_RGB, RAS_RGB16) : rop_zoom_out_rgb_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

		E 81 CASE RASRAS(RAS_RGB, RAS_RGB_) : __OR RASRAS(RAS_RGB, RAS_RGBM) : rop_zoom_out_rgb_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

			CASE RASRAS(RAS_BW, RAS_CM16) : __OR RASRAS(RAS_WB, RAS_CM16) : rop_zoom_out_bw_cm16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

			CASE RASRAS(RAS_BW, RAS_RGB_) : __OR RASRAS(RAS_BW, RAS_RGBM) : __OR RASRAS(RAS_WB, RAS_RGB_) : __OR RASRAS(RAS_WB, RAS_RGBM) : rop_zoom_out_bw_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

			CASE RASRAS(RAS_GR8, RAS_CM16) : rop_zoom_out_gr8_cm16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

			CASE RASRAS(RAS_WB, RAS_GR8) : __OR RASRAS(RAS_BW, RAS_GR8) : rop_zoom_out_bw_gr8(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

			CASE RASRAS(RAS_GR8, RAS_GR8) : rop_zoom_out_gr8(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

			CASE RASRAS(RAS_CM16, RAS_CM16) : rop_zoom_out_cm16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

			CASE RASRAS(RAS_RGB_, RAS_RGB_) : __OR RASRAS(RAS_RGB_, RAS_RGBM) : __OR RASRAS(RAS_RGBM, RAS_RGB_) :
D 46 __OR RASRAS(RAS_RGBM, RAS_RGBM) :
E 46
I 46 rop_zoom_out_rgbx(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57

			CASE RASRAS(RAS_RGBM, RAS_RGBM) :
E 46 rop_zoom_out_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		D 57 return;
		E 57
I 54

I 61 CASE RASRAS(RAS_BW, RAS_RGB16) : __OR RASRAS(RAS_WB, RAS_RGB16) : rop_zoom_out_bw_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

		E 61 CASE RASRAS(RAS_GR8, RAS_RGB16) : rop_zoom_out_gr8_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);
		E 54

I 52 CASE RASRAS(RAS_CM16, RAS_RGB16) : rop_zoom_out_cm16_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

		CASE RASRAS(RAS_RGB_, RAS_RGB16) : __OR RASRAS(RAS_RGBM, RAS_RGB16) : rop_zoom_out_rgbx_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

		E 52 DEFAULT :
D 52 printf("### INTERNAL ERROR - rop_zoom_out; invalid raster combination\n");
		E 52
I 52 assert(!"rop_zoom_out; invalid raster combination");
		E 52
E 28
E 20
E 10
	}
}

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

D 14
/*   TOPPA TEMPORANEA PER INPUT, rifare completamente
 *
 *   chiedere a Walter
E 14
I 14
/* copia un rettangolo da rin a rout,
 * specchiandolo orizzontalmente se mirror e' dispari,
 * e poi ruotandolo del multiplo di novanta gradi specificato
 * da ninety in senso antiorario
E 14
 *
 */

I 14
D 17
/* RIVEDERE COMPLETAMENTE, PER ADESSO FUNZIA SOLO PER BW->BW e GR8->GR8 */
E 17
I 17
D 23
/* RIVEDERE COMPLETAMENTE, PER ADESSO FUNZIA SOLO PER POCHI TIPI DI RASTER */
E 17

E 23
E 14
void rop_copy_90(RASTER *rin, RASTER *rout,
                 int x1, int y1, int x2, int y2, int newx, int newy,
D 14
		 int ninety, int flip)
E 14
I 14
D 15
		 int mirror, int ninety)
E 15
I 15
                 int mirror, int ninety)
E 15
E 14
{
	D 13 char *rowin, *rowout;
	E 13
I 13
D 23 UCHAR *rowin, *rowout;
	E 13
D 10 int rowsize, wrapin, wrapout, d, tmp;
	E 10
I 10
D 14 int rowsize, bytewrapin, bytewrapout, d, tmp;
	E 14
I 14 int rowsize, bytewrapin, bytewrapout, d, tmp, newdx, newdy;
	E 14
E 10
D 12 int pixbits_in, pixbits_out;
	E 12
I 12 int pixbits_in, pixbits_out;
	int pixbytes_in, pixbytes_out;
	E 23
I 23 int newdx, newdy, tmp;
	E 23
E 12 int rasras;

	D 14 if (ninety != 1 || flip != 1)
	{
		printf("### INTERNAL ERROR - rop_copy_90; ?????????????????\n");
		return;
	}
	E 14
I 14 mirror &= 1;
	ninety &= 3;
	I 18

		if (!ninety && !mirror)
	{
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}
	E 18
E 14

		/* raddrizzo gli estremi */
		if (x1 > x2)
	{
		tmp = x1;
		x1 = x2;
		x2 = tmp;
	}
	if (y1 > y2) {
		tmp = y1;
		y1 = y2;
		y2 = tmp;
	}

	I 14 switch (ninety)
	{
		CASE 0 : __OR 2 : newdx = x2 - x1 + 1;
		newdy = y2 - y1 + 1;
		CASE 1 : __OR 3 : newdx = y2 - y1 + 1;
		newdy = x2 - x1 + 1;
		I 50
D 78 DEFAULT : assert(FALSE);
		newdx = newdy = 0;
		E 78
I 78 DEFAULT : abort();
		newdx = newdy = 0;
		E 78
E 50
	}

E 14
/* controllo gli sconfinamenti */
if(x1<0 || y1<0 || x2>=rin->lx || y2>=rin->ly
  || newx<0 || newy<0 || 
D 14
     newx+x2-x1>=rout->lx || newy+y2-y1>=rout->ly)
E 14
I 14
     newx+newdx>rout->lx || newy+newdy>rout->ly)
E 14
{
	printf("### INTERNAL ERROR - rop_copy_90; access violation\n");
	return;
}

D 12 pixbits_in = rop_pixbits(rin->type);
pixbits_out = rop_pixbits(rout->type);
E 12
I 12
D 23 pixbits_in = rop_pixbits(rin->type);
pixbytes_in = rop_pixbytes(rin->type);
pixbits_out = rop_pixbits(rout->type);
pixbytes_out = rop_pixbytes(rout->type);
E 23
E 12 rasras = RASRAS(rin->type, rout->type);
switch (rasras) {
	CASE RASRAS(RAS_WB, RAS_WB) : __OR RASRAS(RAS_BW, RAS_BW) :
D 14
																/*
    rop_copy_90_bw(rin, rout, x1, y1, x2, y2, newx, newy, ninety, flip);
  */
																rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
	E 14
I 14 rop_copy_90_bw(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	E 14 return;

	I 17 CASE RASRAS(RAS_WB, RAS_GR8) : __OR RASRAS(RAS_BW, RAS_GR8) : rop_copy_90_bw_gr8(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	I 21 CASE RASRAS(RAS_WB, RAS_CM16) : __OR RASRAS(RAS_BW, RAS_CM16) : rop_copy_90_bw_cm16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	I 55 CASE RASRAS(RAS_WB, RAS_RGB16) : __OR RASRAS(RAS_BW, RAS_RGB16) : rop_copy_90_bw_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);

	E 55
I 22 CASE RASRAS(RAS_WB, RAS_RGB_) : __OR RASRAS(RAS_WB, RAS_RGBM) : __OR RASRAS(RAS_BW, RAS_RGB_) : __OR RASRAS(RAS_BW, RAS_RGBM) : rop_copy_90_bw_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	E 22
E 21
E 17 CASE RASRAS(RAS_GR8, RAS_GR8) :
D 14
									   /*
    rop_copy_90_gr8(rin, rout, x1, y1, x2, y2, newx, newy, ninety, flip);
  */
									   rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
	E 14
I 14 rop_copy_90_gr8(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	E 14 return;

	I 21 CASE RASRAS(RAS_GR8, RAS_CM16) : rop_copy_90_gr8_cm16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	I 55 CASE RASRAS(RAS_GR8, RAS_RGB16) : rop_copy_90_gr8_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	E 55
I 22 CASE RASRAS(RAS_GR8, RAS_RGB_) : __OR RASRAS(RAS_GR8, RAS_RGBM) : rop_copy_90_gr8_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	I 23 CASE RASRAS(RAS_CM8, RAS_CM16) : rop_copy_90_cm8_cm16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	I 26 CASE RASRAS(RAS_RGB_, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGBM) : rop_copy_90_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	I 63 CASE RASRAS(RAS_RGB, RAS_RGB16) : rop_copy_90_rgb_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	E 63
I 45 CASE RASRAS(RAS_RGB, RAS_RGB_) :
E 45
I 43
D 64 CASE RASRAS(RAS_RGB, RAS_RGBM) :
E 64
I 64 __OR RASRAS(RAS_RGB, RAS_RGBM) :
E 64 rop_copy_90_rgb_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
	return;

	E 43
E 26
E 23
E 22
E 21 DEFAULT :
D 45 printf("### INTERNAL ERROR - rop_copy_90; ?????????????????\n");
	E 45
I 45
D 78 assert(FALSE);
	E 78
I 78 abort();
	E 78
E 45
    
E 6
}
I 6
D 21

	/* QUI NON CI SI ARRIVA */

E 6
E 4
	/* pixsize compatibili */
	if (pixbits_in != pixbits_out)
{
	printf("### INTERNAL ERROR - rop_copy; different pixel size\n");
	return;
}

/* per adesso niente pixel non multipli di 8 bits */
D 2 if (pixbits_in & 7)
{
	printf("### INTERNAL ERROR - rop_copy; byte fraction pixels\n");
	E 2
I 2 if (rop_fillerbits(rin->type) || rop_fillerbits(rout->type))
	{
		printf("### INTERNAL ERROR - rop_copy; fillerbits not allowed\n");
		E 2 return;
	}
	D 4
  
E 4
I 4

E 4
		/* copia */
		rowsize = (pixbits_in * (x2 - x1 + 1)) >> 3;
	D 10 wrapin = (rin->wrap * pixbits_in) >> 3;
	wrapout = (rout->wrap * pixbits_out) >> 3;
	E 10
I 10 bytewrapin = rin->wrap * pixbytes_in;
	bytewrapout = rout->wrap * pixbytes_out;
	E 10

D 10 rowin = (char *)rin->buffer + y1 * wrapin + ((x1 * pixbits_in) >> 3);
	rowout = (char *)rout->buffer + newy * wrapout + ((newx * pixbits_out) >> 3);
	E 10
I 10
D 12 rowin = (UCHAR *)rin->buffer + y1 * wrapin + ((x1 * pixbits_in) >> 3);
	rowout = (UCHAR *)rout->buffer + newy * wrapout + ((newx * pixbits_out) >> 3);
	E 12
I 12 rowin = (UCHAR *)rin->buffer + y1 * bytewrapin + ((x1 * pixbits_in) >> 3);
	rowout = (UCHAR *)rout->buffer + newy * bytewrapout + ((newx * pixbits_out) >> 3);
	E 12
E 10 d = y2 - y1 + 1;
	while (d-- > 0) {
		memmove(rowout, rowin, rowsize);
		D 10 rowin += wrapin;
		rowout += wrapout;
		E 10
I 10 rowin += bytewrapin;
		rowout += bytewrapout;
		E 10
	}
	E 21
}

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

I 15
#ifdef VERSIONE_LENTA

E 15
I 6
static void rop_copy_90_bw(RASTER *rin, RASTER *rout,
                           int x1, int y1, int x2, int y2,
			   int newx, int newy,
D 14
		           int ninety, int flip)
E 14
I 14
		           int mirror, int ninety)
E 14
{
	D 14
#ifdef WALTER

		UCHAR *rowin,
		*bytein;
	LPIXEL *cmap;
	int wrapin, wrapout, tmp, cmap_offset, bit, bit_offs, startbit;
	int x, lx, ly;

#define SET_BIT(BYTE, BIT, VAL)     \
	{                               \
		if (VAL)                    \
			*BYTE |= (1 << (BIT));  \
		else                        \
			*BYTE &= ~(1 << (BIT)); \
	}
	E 14
I 14 UCHAR *bufin, *bufout;
	int bytewrapin, bytewrapout, bitoffsin, bitoffsout, wrapin;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudx, dudy, dvdx, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	D 61
#define BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) \
	(((UCHAR *)(BUF))[(((X) + (BITOFFS)) >> 3) + (Y) * (BYTEWRAP)])

#define GET_BIT(X, Y, BUF, BYTEWRAP, BITOFFS) \
	((BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) >> (7 - (((X) + (BITOFFS)) & 7))) & 1)

#define SET_BIT_0(X, Y, BUF, BYTEWRAP, BITOFFS) \
	(BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) &= ~(1 << (7 - (((X) + (BITOFFS)) & 7))))

#define SET_BIT_1(X, Y, BUF, BYTEWRAP, BITOFFS) \
	(BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) |= (1 << (7 - (((X) + (BITOFFS)) & 7))))

E 61
#ifdef DEBUG
		STW_INIT(0, "rop_copy_90_bw")
E 84
I 84 CASE 1 : for (j = 0; j < xsize; j++)
	{
		*curr_pixout = *curr_pixin;
		curr_pixin += shrink;
		curr_pixout++;
	}
	CASE 2 : curr_pixin_2 = (USHORT *)curr_pixin;
	curr_pixout_2 = (USHORT *)curr_pixout;
	for (j = 0; j < xsize; j++) {
		*curr_pixout_2 = *curr_pixin_2;
		curr_pixin_2 += shrink;
		curr_pixout_2++;
	}
	CASE 4 : curr_pixin_4 = (ULONG *)curr_pixin;
	curr_pixout_4 = (ULONG *)curr_pixout;
	for (j = 0; j < xsize; j++) {
		*curr_pixout_4 = *curr_pixin_4;
		E 84
I 84 curr_pixin_4 += shrink;
		curr_pixout_4++;
	}
DEFAULT:
	for (j = 0; j < xsize; j++) {
		memcpy(curr_pixout, curr_pixin, bpp);
		curr_pixin += shrink * bpp;
		curr_pixout += bpp;
	}
}
}
}

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

/* copia un rettangolo da rin a rout.
 * Le coordinate sono relative ai due raster: (0, 0) corrisponde
 * al primo pixel del raster.
 * Riduce le dimensioni di una potenza di due facendo la media dei valori
 * dei pixel, ma solo su una parte dei pixel.
 */

void rop_zoom_out(RASTER *rin, RASTER *rout,
				  int x1, int y1, int x2, int y2, int newx, int newy,
				  int abs_zoom_level)
{
	int tmp, newlx, newly;
	int rasras, factor, abszl;

	abszl = abs_zoom_level;
	factor = 1 << abs_zoom_level;
	if (factor == 1)
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);

	/* raddrizzo gli estremi */
	if (x1 > x2) {
		tmp = x1;
		x1 = x2;
		x2 = tmp;
	}
	if (y1 > y2) {
		tmp = y1;
		y1 = y2;
		y2 = tmp;
	}

	/* controllo gli sconfinamenti */
	newlx = (x2 - x1 + factor) / factor;
	newly = (y2 - y1 + factor) / factor;
	E 89
I 89 __OR RASRAS(RAS_CM24, RAS_CM8S8) : __OR RASRAS(RAS_CM24, RAS_CM8S4) : __OR RASRAS(RAS_CM24, RAS_BW) : rop_copy_quantize(rasras, rin, rout, x1, y1, x2, y2, newx, newy);

DEFAULT:
	assert(!"rop_copy; invalid raster combination");
	E 96
I 96 rasras = RASRAS(rin->type, rout->type);
	switch (rasras) {
		CASE RASRAS(RAS_RGBM, RAS_RGB_) : rop_copy_same(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_GR8, RAS_RGB_) : __OR RASRAS(RAS_GR8, RAS_RGBM) : rop_copy_gr8_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_CM16, RAS_RGB_) : __OR RASRAS(RAS_CM16, RAS_RGBM) : rop_copy_cm16_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_CM24, RAS_RGB_) : __OR RASRAS(RAS_CM24, RAS_RGBM) : rop_copy_cm24_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_CM16, RAS_RGB_64) : __OR RASRAS(RAS_CM16, RAS_RGBM64) : rop_copy_cm16_rgbm64(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_CM24, RAS_RGB_64) : __OR RASRAS(RAS_CM24, RAS_RGBM64) : rop_copy_cm24_rgbm64(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_RGBM, RAS_RGBM64) : rop_copy_rgbm_rgbm64(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_RGBM64, RAS_RGBM) : rop_copy_rgbm64_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_RGB_64, RAS_RGB_) : __OR RASRAS(RAS_RGBM64, RAS_RGB_) : __OR RASRAS(RAS_RGB_64, RAS_RGBM) : rop_copy_rgbx64_rgbx(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_RGB, RAS_RGB16) : rop_copy_rgb_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_RGB, RAS_RGB_) : __OR RASRAS(RAS_RGB, RAS_RGBM) : rop_copy_rgb_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		D 104 CASE RASRAS(RAS_BW, RAS_BW) : __OR RASRAS(RAS_BW, RAS_WB) :
E 104
I 104 CASE RASRAS(RAS_BW, RAS_WB) :
E 104 __OR RASRAS(RAS_WB, RAS_BW) : __OR RASRAS(RAS_WB, RAS_WB) : rop_copy_bw(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_BW, RAS_CM16) : __OR RASRAS(RAS_WB, RAS_CM16) : rop_copy_bw_cm16(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_BW, RAS_CM24) : __OR RASRAS(RAS_WB, RAS_CM24) : rop_copy_bw_cm24(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_BW, RAS_RGB_) : __OR RASRAS(RAS_BW, RAS_RGBM) : __OR RASRAS(RAS_WB, RAS_RGB_) : __OR RASRAS(RAS_WB, RAS_RGBM) : rop_copy_bw_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_GR8, RAS_CM16) : rop_copy_gr8_cm16(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_GR8, RAS_CM24) : rop_copy_gr8_cm24(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_CM8, RAS_CM16) : rop_copy_cm8_cm16(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_CM8, RAS_CM24) : rop_copy_cm8_cm24(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_BW, RAS_RGB16) : __OR RASRAS(RAS_WB, RAS_RGB16) : rop_copy_bw_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_GR8, RAS_RGB16) : rop_copy_gr8_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_CM16, RAS_RGB16) : rop_copy_cm16_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_CM24, RAS_RGB16) : rop_copy_cm24_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

		D 97 CASE RASRAS(RAS_CM16, RAS_XRGB1555) : rop_copy_cm16_xrgb1555(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_CM24, RAS_XRGB1555) : rop_copy_cm24_xrgb1555(rin, rout, x1, y1, x2, y2, newx, newy);

		E 97 CASE RASRAS(RAS_RGB_, RAS_RGB16) : __OR RASRAS(RAS_RGBM, RAS_RGB16) : rop_copy_rgbx_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

		D 97 CASE RASRAS(RAS_RGB_, RAS_XRGB1555) : __OR RASRAS(RAS_RGBM, RAS_XRGB1555) : rop_copy_rgbx_xrgb1555(rin, rout, x1, y1, x2, y2, newx, newy);

		E 97 CASE RASRAS(RAS_RGB_64, RAS_RGB16) : __OR RASRAS(RAS_RGBM64, RAS_RGB16) : rop_copy_rgbx64_rgb16(rin, rout, x1, y1, x2, y2, newx, newy);

		D 97 CASE RASRAS(RAS_RGB_64, RAS_XRGB1555) : __OR RASRAS(RAS_RGBM64, RAS_XRGB1555) : rop_copy_rgbx64_xrgb1555(rin, rout, x1, y1, x2, y2, newx, newy);

		E 97 CASE RASRAS(RAS_RGB16, RAS_RGB_) : __OR RASRAS(RAS_RGB16, RAS_RGBM) : rop_copy_rgb16_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		D 97 CASE RASRAS(RAS_XRGB1555, RAS_RGB_) : __OR RASRAS(RAS_XRGB1555, RAS_RGBM) : rop_copy_xrgb1555_rgbm(rin, rout, x1, y1, x2, y2, newx, newy);

		E 97 CASE RASRAS(RAS_RGB_, RAS_RGB) : __OR RASRAS(RAS_RGBM, RAS_RGB) : rop_copy_rgbx_rgb(rin, rout, x1, y1, x2, y2, newx, newy);

		CASE RASRAS(RAS_RGBM, RAS_CM16S8) :
I 98 __OR RASRAS(RAS_RGBM, RAS_CM16S12) :
E 98 __OR RASRAS(RAS_RGBM, RAS_CM16S4) : __OR RASRAS(RAS_RGBM, RAS_MBW16) : __OR RASRAS(RAS_RGBM, RAS_GR8) : __OR RASRAS(RAS_RGBM64, RAS_GR8) : __OR RASRAS(RAS_RGBM, RAS_GR16) : __OR RASRAS(RAS_RGBM64, RAS_GR16) : __OR RASRAS(RAS_RGBM, RAS_CM8S8) : __OR RASRAS(RAS_RGBM, RAS_CM8S4) : __OR RASRAS(RAS_RGBM, RAS_BW) : __OR RASRAS(RAS_RGB_, RAS_CM16S8) : __OR RASRAS(RAS_RGB_, RAS_CM16S4) : __OR RASRAS(RAS_RGB_, RAS_MBW16) : __OR RASRAS(RAS_RGB_, RAS_GR8) : __OR RASRAS(RAS_RGB_, RAS_CM8S8) : __OR RASRAS(RAS_RGB_, RAS_CM8S4) : __OR RASRAS(RAS_RGB_, RAS_BW) : __OR RASRAS(RAS_RGB16, RAS_CM8S8) : __OR RASRAS(RAS_RGB16, RAS_BW) :
I 98 __OR RASRAS(RAS_CM16, RAS_CM16S12) :
E 98 __OR RASRAS(RAS_CM16, RAS_CM16S8) : __OR RASRAS(RAS_CM16, RAS_CM16S4) : __OR RASRAS(RAS_CM16, RAS_MBW16) : __OR RASRAS(RAS_CM16, RAS_GR8) : __OR RASRAS(RAS_CM16, RAS_GR16) : __OR RASRAS(RAS_CM16, RAS_CM8S8) : __OR RASRAS(RAS_CM16, RAS_CM8S4) : __OR RASRAS(RAS_CM16, RAS_BW) :
I 98 __OR RASRAS(RAS_CM24, RAS_CM16S12) :
E 98 __OR RASRAS(RAS_CM24, RAS_CM16S8) : __OR RASRAS(RAS_CM24, RAS_CM16S4) : __OR RASRAS(RAS_CM24, RAS_MBW16) : __OR RASRAS(RAS_CM24, RAS_GR8) :
I 103 __OR RASRAS(RAS_CM24, RAS_GR16) :  
E 103 __OR RASRAS(RAS_CM24, RAS_CM8S8) : __OR RASRAS(RAS_CM24, RAS_CM8S4) : __OR RASRAS(RAS_CM24, RAS_BW) :
I 97 __OR RASRAS(RAS_CM8S8, RAS_RGBM) : __OR RASRAS(RAS_CM8S8, RAS_RGB_) :
I 101 __OR RASRAS(RAS_CM16S12, RAS_RGBM) : __OR RASRAS(RAS_CM16S12, RAS_RGB_) :
E 101 __OR RASRAS(RAS_RLEBW, RAS_RGB_) : __OR RASRAS(RAS_RLEBW, RAS_RGBM) :

E 97 rop_copy_quantize(rasras, rin, rout, x1, y1, x2, y2, newx, newy);

	DEFAULT:
		assert(!"rop_copy; invalid raster combination");
	}
	E 96
}
if (rout->extra_mask)
	if (!(rin->type == RAS_CM24 || rout->type == RAS_CM24))
		rop_copy_extra(rin, rout, x1, y1, x2, y2, newx, newy);
/* else e' gia' stato fatto dalle copy particolari */
}

/*---------------------------------------------------------------------------*/
/* copia un rettangolo da rin a rout.
 * Le coordinate sono relative ai due raster: (0, 0) corrisponde
 * al primo pixel del raster.
 * Riduce le dimensioni di un fattore di subsampling pari a shrink.
 * I due raster devono essere dello stesso tipo.
 */

D 94 void rop_shrink(RASTER *rin, RASTER *rout,
					  int x1, int y1, int x2, int y2, int newx, int newy,
					  int shrink)
{
	E 94
I 94 void rop_shrink(RASTER * rin, RASTER * rout,
					   int x1, int y1, int x2, int y2, int newx, int newy,
					   int shrink)
	{
		E 94 UCHAR *curr_pixin, *bufferin;
		int i, j, tmp, bpp;
		int xsize, ysize, wrapin, wrapout;
		UCHAR *curr_pixout, *bufferout;
		USHORT *curr_pixin_2, *curr_pixout_2;
		ULONG *curr_pixin_4, *curr_pixout_4;

		if (shrink == 1) {
			rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
			return;
		}
		/* raddrizzo gli estremi */
		if (x1 > x2) {
			tmp = x1;
			x1 = x2;
			x2 = tmp;
		}
		if (y1 > y2) {
			tmp = y1;
			y1 = y2;
			y2 = tmp;
		}

		/* controllo gli sconfinamenti */

		if (x1 < 0 || y1 < 0 || x2 >= rin->lx || y2 >= rin->ly ||
			newx < 0 || newy < 0 ||
			newx + (x2 - x1 + shrink) / shrink > rout->lx ||
			newy + (y2 - y1 + shrink) / shrink > rout->ly ||
			rin->type != rout->type) {
			printf("### INTERNAL ERROR - rop_shrink; access violation\n");
			return;
		}

		bpp = rop_pixbytes(rin->type);

		xsize = (x2 - x1 + shrink) / shrink;
		ysize = (y2 - y1 + shrink) / shrink;

		wrapin = rin->wrap * bpp;

		bufferin = (UCHAR *)(rin->buffer) + wrapin * y1 + x1 * bpp;

		wrapout = rout->wrap * bpp;
		bufferout = (UCHAR *)(rout->buffer) + wrapout * newy + newx * bpp;

		wrapin *= shrink;

		for (i = 0; i < ysize; i++) {
			curr_pixin = bufferin;
			curr_pixout = bufferout;
			bufferin += wrapin;
			bufferout += wrapout;

			switch (bpp) {
				CASE 1 : for (j = 0; j < xsize; j++)
				{
					*curr_pixout = *curr_pixin;
					curr_pixin += shrink;
					curr_pixout++;
				}
				CASE 2 : curr_pixin_2 = (USHORT *)curr_pixin;
				curr_pixout_2 = (USHORT *)curr_pixout;
				for (j = 0; j < xsize; j++) {
					*curr_pixout_2 = *curr_pixin_2;
					curr_pixin_2 += shrink;
					curr_pixout_2++;
				}
				CASE 4 : curr_pixin_4 = (ULONG *)curr_pixin;
				curr_pixout_4 = (ULONG *)curr_pixout;
				for (j = 0; j < xsize; j++) {
					*curr_pixout_4 = *curr_pixin_4;
					curr_pixin_4 += shrink;
					curr_pixout_4++;
				}
			DEFAULT:
				for (j = 0; j < xsize; j++) {
					memcpy(curr_pixout, curr_pixin, bpp);
					curr_pixin += shrink * bpp;
					curr_pixout += bpp;
				}
			}
		}
		if (rin->extra_mask && rout->extra_mask &&
			!(rin->type == RAS_CM24 || rout->type == RAS_CM24)) {
			wrapin = rin->wrap * shrink;
			wrapout = rout->wrap;
			bufferin = rin->extra + x1 + y1 * wrapin;
			bufferout = rout->extra + newx + newy * wrapout;
			for (i = 0; i < ysize; i++) {
				curr_pixin = bufferin;
				curr_pixout = bufferout;
				bufferin += wrapin;
				bufferout += wrapout;
				for (j = 0; j < xsize; j++) {
					*curr_pixout = *curr_pixin;
					curr_pixin += shrink;
					curr_pixout++;
				}
			}
		}
	}

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

	/* copia un rettangolo da rin a rout.
 * Le coordinate sono relative ai due raster: (0, 0) corrisponde
 * al primo pixel del raster.
 * Riduce le dimensioni di una potenza di due facendo la media dei valori
 * dei pixel, ma solo su una parte dei pixel.
 */

	void rop_zoom_out(RASTER * rin, RASTER * rout,
					  int x1, int y1, int x2, int y2, int newx, int newy,
					  int abs_zoom_level)
	{
		int tmp, newlx, newly;
		int rasras, factor, abszl;

		if (rout->extra_mask)
			assert(0);

		abszl = abs_zoom_level;
		factor = 1 << abs_zoom_level;
		if (factor == 1)
			rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);

		/* raddrizzo gli estremi */
		if (x1 > x2) {
			tmp = x1;
			x1 = x2;
			x2 = tmp;
		}
		if (y1 > y2) {
			tmp = y1;
			y1 = y2;
			y2 = tmp;
		}

		/* controllo gli sconfinamenti */
		newlx = (x2 - x1 + factor) / factor;
		newly = (y2 - y1 + factor) / factor;
		E 89 if (x1 < 0 || y1 < 0 || x2 >= rin->lx || y2 >= rin->ly || newx < 0 || newy < 0 ||
				  newx + newlx > rout->lx || newy + newly > rout->ly)
		{
			printf("### INTERNAL ERROR - rop_zoom_out; access violation\n"
				   " ((%d,%d)(%d,%d)in(%dx%d)->(%d,%d)in(%dx%d))\n",
				   x1, y1, x2, y2, rin->lx, rin->ly, newx, newy, rout->lx, rout->ly);
			return;
		}

		rasras = RASRAS(rin->type, rout->type);
		switch (rasras) {
			CASE RASRAS(RAS_GR8, RAS_RGB_) : __OR RASRAS(RAS_GR8, RAS_RGBM) : rop_zoom_out_gr8_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_CM16, RAS_RGB_) : rop_zoom_out_cm16_rgbx(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_CM24, RAS_RGB_) : rop_zoom_out_cm24_rgbx(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_CM16, RAS_RGBM) : rop_zoom_out_cm16_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_CM24, RAS_RGBM) : rop_zoom_out_cm24_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_RGB, RAS_RGB16) : rop_zoom_out_rgb_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_RGB, RAS_RGB_) : __OR RASRAS(RAS_RGB, RAS_RGBM) : rop_zoom_out_rgb_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_BW, RAS_CM16) : __OR RASRAS(RAS_WB, RAS_CM16) : rop_zoom_out_bw_cm16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_BW, RAS_CM24) : __OR RASRAS(RAS_WB, RAS_CM24) : rop_zoom_out_bw_cm24(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_BW, RAS_RGB_) : __OR RASRAS(RAS_BW, RAS_RGBM) : __OR RASRAS(RAS_WB, RAS_RGB_) : __OR RASRAS(RAS_WB, RAS_RGBM) : rop_zoom_out_bw_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_GR8, RAS_CM16) : rop_zoom_out_gr8_cm16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_GR8, RAS_CM24) : rop_zoom_out_gr8_cm24(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_WB, RAS_GR8) : __OR RASRAS(RAS_BW, RAS_GR8) : rop_zoom_out_bw_gr8(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_GR8, RAS_GR8) : rop_zoom_out_gr8(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_CM16, RAS_CM16) : rop_zoom_out_cm16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_CM16, RAS_CM24) : rop_zoom_out_cm24(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_RGB_, RAS_RGB_) : __OR RASRAS(RAS_RGB_, RAS_RGBM) : __OR RASRAS(RAS_RGBM, RAS_RGB_) : rop_zoom_out_rgbx(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_RGBM, RAS_RGBM) : rop_zoom_out_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_BW, RAS_RGB16) : __OR RASRAS(RAS_WB, RAS_RGB16) : rop_zoom_out_bw_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_GR8, RAS_RGB16) : rop_zoom_out_gr8_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_CM16, RAS_RGB16) : rop_zoom_out_cm16_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_CM24, RAS_RGB16) : rop_zoom_out_cm24_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_RGB_, RAS_RGB16) : __OR RASRAS(RAS_RGBM, RAS_RGB16) : rop_zoom_out_rgbx_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			I 95 CASE RASRAS(RAS_RGBM64, RAS_RGB_) : __OR RASRAS(RAS_RGB_64, RAS_RGB_) : __OR RASRAS(RAS_RGB_64, RAS_RGBM) : rop_zoom_out_rgbx64_rgbx(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_RGBM64, RAS_RGB16) : __OR RASRAS(RAS_RGB_64, RAS_RGB16) : rop_zoom_out_rgbx64_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			CASE RASRAS(RAS_RGBM64, RAS_RGBM) : rop_zoom_out_rgbm64_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl);

			E 95 DEFAULT : assert(!"rop_zoom_out; invalid raster combination");
		}
	}

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

	/* copia un rettangolo da rin a rout,
 * specchiandolo orizzontalmente se mirror e' dispari,
 * e poi ruotandolo del multiplo di novanta gradi specificato
 * da ninety in senso antiorario
 *
 */

	void rop_copy_90(RASTER * rin, RASTER * rout,
					 int x1, int y1, int x2, int y2, int newx, int newy,
					 int mirror, int ninety)
	{
		int newdx, newdy, tmp;
		int rasras;

		I 89 if (rout->extra_mask)
			assert(0);

		E 89 mirror &= 1;
		ninety &= 3;

		if (!ninety && !mirror) {
			rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
			return;
		}

		/* raddrizzo gli estremi */
		if (x1 > x2) {
			tmp = x1;
			x1 = x2;
			x2 = tmp;
		}
		if (y1 > y2) {
			tmp = y1;
			y1 = y2;
			y2 = tmp;
		}

		switch (ninety) {
			CASE 0 : __OR 2 : newdx = x2 - x1 + 1;
			newdy = y2 - y1 + 1;
			CASE 1 : __OR 3 : newdx = y2 - y1 + 1;
			newdy = x2 - x1 + 1;
		DEFAULT:
			abort();
			newdx = newdy = 0;
		}

		/* controllo gli sconfinamenti */
		if (x1 < 0 || y1 < 0 || x2 >= rin->lx || y2 >= rin->ly || newx < 0 || newy < 0 ||
			newx + newdx > rout->lx || newy + newdy > rout->ly) {
			printf("### INTERNAL ERROR - rop_copy_90; access violation\n");
			return;
		}

		rasras = RASRAS(rin->type, rout->type);
		switch (rasras) {
			CASE RASRAS(RAS_WB, RAS_WB) : __OR RASRAS(RAS_BW, RAS_BW) : rop_copy_90_bw(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_WB, RAS_GR8) : __OR RASRAS(RAS_BW, RAS_GR8) : rop_copy_90_bw_gr8(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_WB, RAS_CM16) : __OR RASRAS(RAS_BW, RAS_CM16) : rop_copy_90_bw_cm16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_WB, RAS_CM24) : __OR RASRAS(RAS_BW, RAS_CM24) : rop_copy_90_bw_cm24(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_WB, RAS_RGB16) : __OR RASRAS(RAS_BW, RAS_RGB16) : rop_copy_90_bw_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);

			CASE RASRAS(RAS_WB, RAS_RGB_) : __OR RASRAS(RAS_WB, RAS_RGBM) : __OR RASRAS(RAS_BW, RAS_RGB_) : __OR RASRAS(RAS_BW, RAS_RGBM) : rop_copy_90_bw_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_GR8, RAS_GR8) : rop_copy_90_gr8(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_GR8, RAS_CM16) : rop_copy_90_gr8_cm16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_GR8, RAS_CM24) : rop_copy_90_gr8_cm24(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_GR8, RAS_RGB16) : rop_copy_90_gr8_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_GR8, RAS_RGB_) : __OR RASRAS(RAS_GR8, RAS_RGBM) : rop_copy_90_gr8_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_CM8, RAS_CM16) : rop_copy_90_cm8_cm16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_CM8, RAS_CM24) : rop_copy_90_cm8_cm24(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_RGB_, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGB_) : __OR RASRAS(RAS_RGBM, RAS_RGBM) : rop_copy_90_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_RGB, RAS_RGB16) : rop_copy_90_rgb_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

			CASE RASRAS(RAS_RGB, RAS_RGB_) : __OR RASRAS(RAS_RGB, RAS_RGBM) : rop_copy_90_rgb_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);
			return;

		DEFAULT:
			abort();
		}
	}

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

#ifdef VERSIONE_LENTA

	static void rop_copy_90_bw(RASTER * rin, RASTER * rout,
							   int x1, int y1, int x2, int y2,
							   int newx, int newy,
							   int mirror, int ninety)
	{
		UCHAR *bufin, *bufout;
		int bytewrapin, bytewrapout, bitoffsin, bitoffsout, wrapin;
		int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudx, dudy, dvdx, dvdy;
		int x, y, lx, ly;
		int u1, v1, u2, v2;

#ifdef DEBUG
		STW_INIT(0, "rop_copy_90_bw")
		E 84 STW_START(0)
#endif
E 14

I 14 mirror &= 1;
		ninety &= 3;
		E 14

D 14 if (!ninety && !flip)
E 14
I 14 if (!ninety && !mirror)
E 14
		{
			rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
			return;
		}

		D 14 lx = x2 - x1 + 1;
		ly = y2 - y1 + 1;
		D 10 wrapin = rin->wrap;
		wrapout = rout->wrap;
		bit_offs = rin->bit_offs;
		E 10
I 10 wrapin = rin->wrap / 8;
		bit_offs = rin->bit_offs;
		wrapout = rout->wrap;
		E 14
I 14 u1 = x1;
		v1 = y1;
		u2 = x2;
		v2 = y2;

		su = u2 - u1;
		sv = v2 - v1;
		lu = u2 - u1 + 1;
		lv = v2 - v1 + 1;
		E 14
E 10

D 14 rowin = (UCHAR *)rin->buffer + wrapin * y1 + ((x1 + bit_offs) >> 3);
		startbit = 7 - ((x1 + bit_offs) & 7);
		rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
		while (ly-- > 0)
			E 14
I 14 if (ninety & 1)
E 14
			{
				D 14 bytein = rowin;
				bit = startbit;
				pixout = rowout;
				for (x = lx; x > 0; x--) {
	outbyte = outx
    SET_BIT (rout->buffer
    *pixout++ = ((*bytein >> bit) & 1) ? i_1 : i_0;
    if (bit==0)
E 14
I 14
  lx = lv;
  ly = lu;
				}
				else
				{
					lx = lu;
					ly = lv;
				}

				dudx = 0;
				dudy = 0;
				dvdx = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dudx = 1;
					dvdy = 1;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dvdx = -1;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dudx = -1;
					dvdy = -1;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dvdx = 1;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dudx = -1;
					dvdy = 1;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dvdx = -1;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dudx = 1;
					dvdy = -1;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dvdx = 1;
				}

				D 16 bufin = rin->buffer;
				bytewrapin = rin->wrap / 8;
				bitoffsin = rin->bit_offs;
				E 16
I 16 bufin = rin->buffer;
				D 47 bytewrapin = (rin->wrap + 7) / 8;
				E 47
I 47 bytewrapin = (rin->wrap + 7) >> 3;
				E 47 bitoffsin = rin->bit_offs;
				E 16 bufout = rout->buffer;
				D 16 bytewrapout = rout->wrap / 8;
				E 16
I 16
D 47 bytewrapout = (rout->wrap + 7) / 8;
				E 47
I 47 bytewrapout = (rout->wrap + 7) >> 3;
				E 47
E 16 bitoffsout = rout->bit_offs;

				if (dudx)
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++)
						for (u = u0, v = v0, x = newx; x < newx + lx; u += dudx, x++)
							E 14
							{
								D 14 bytein++;
								bit = 7;
								E 14
I 14 if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
									SET_BIT_1(x, y, bufout, bytewrapout, bitoffsout);
								else SET_BIT_0(x, y, bufout, bytewrapout, bitoffsout);
								E 14
							}
				D 14 else bit--;
			}
		rowin += wrapin;
		rowout += wrapout;
	}
	E 14
I 14 else for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++) for (u = u0, v = v0, x = newx; x < newx + lx; v += dvdx, x++)
	{
		if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
			SET_BIT_1(x, y, bufout, bytewrapout, bitoffsout);
		else
			SET_BIT_0(x, y, bufout, bytewrapout, bitoffsout);
		I 82
	}
	E 82
D 82
}
E 82
I 15

#ifdef DEBUG
	STW_STOP(0)
		STW_PRINT(stdout)
#endif
}

#endif

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

static void rop_copy_90_bw(RASTER *rin, RASTER *rout,
						   int x1, int y1, int x2, int y2,
						   int newx, int newy,
						   int mirror, int ninety)
{
	UCHAR *bufin, *bufout;
	UCHAR tmpbyte;
	int bytewrapin, bytewrapout, bitoffsin, bitoffsout, wrapin;
	I 83 int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudx, dudy, dvdx, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

#ifdef DEBUG
	STW_INIT(0, "rop_copy_90_bw")
	STW_START(0)
#endif

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}

	u1 = x1;
	v1 = y1;
	E 83
D 83 int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudx, dudy, dvdx, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	D 61
#define BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) \
	(((UCHAR *)(BUF))[(((X) + (BITOFFS)) >> 3) + (Y) * (BYTEWRAP)])

#define GET_BIT(X, Y, BUF, BYTEWRAP, BITOFFS) \
	((BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) >> (7 - (((X) + (BITOFFS)) & 7))) & (UCHAR)1)

#define SET_BIT_0(X, Y, BUF, BYTEWRAP, BITOFFS) \
	(BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) &= ~(1 << (7 - (((X) + (BITOFFS)) & 7))))

#define SET_BIT_1(X, Y, BUF, BYTEWRAP, BITOFFS) \
	(BUFBYTE(X, Y, BUF, BYTEWRAP, BITOFFS) |= (1 << (7 - (((X) + (BITOFFS)) & 7))))

#define BITCPY(XO, YO, BUFO, BYTEWRAPO, BITOFFSO, XI, YI, BUFI, BYTEWRAPI, BITOFFSI) \
	{                                                                                \
		if (GET_BIT(XI, YI, BUFI, BYTEWRAPI, BITOFFSI))                              \
			SET_BIT_1(XO, YO, BUFO, BYTEWRAPO, BITOFFSO);                            \
		else                                                                         \
			SET_BIT_0(XO, YO, BUFO, BYTEWRAPO, BITOFFSO);                            \
	}

E 61
#ifdef DEBUG
		STW_INIT(0, "rop_copy_90_bw")
			STW_START(0)
#endif

				mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}

	u1 = x1;
	v1 = y1;
	E 83 u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	dudx = 0;
	dudy = 0;
	dvdx = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dudx = 1;
		dvdy = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dvdx = -1;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dudx = -1;
		dvdy = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dvdx = 1;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dudx = -1;
		dvdy = 1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dvdx = -1;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dudx = 1;
		dvdy = -1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dvdx = 1;
		I 50
D 78 DEFAULT : assert(FALSE);
		u00 = v00 = dudy = dvdx = 0;
		E 78
I 78 DEFAULT : abort();
		u00 = v00 = dudy = dvdx = 0;
		E 78
E 50
	}

	D 16 bufin = rin->buffer;
	bytewrapin = rin->wrap / 8;
	bitoffsin = rin->bit_offs;
	E 16
I 16 bufin = rin->buffer;
	D 47 bytewrapin = (rin->wrap + 7) / 8;
	E 47
I 47 bytewrapin = (rin->wrap + 7) >> 3;
	E 47 bitoffsin = rin->bit_offs;
	E 16 bufout = rout->buffer;
	D 16 bytewrapout = rout->wrap / 8;
	E 16
I 16
D 47 bytewrapout = (rout->wrap + 7) / 8;
	E 47
I 47 bytewrapout = (rout->wrap + 7) >> 3;
	E 47
E 16 bitoffsout = rout->bit_offs;

	if (dudx)
		for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++) {
			u = u0;
			v = v0;
			x = newx;
			for (; x < newx + lx && ((x + bitoffsout) & 7); u += dudx, x++)
				BITCPY(x, y, bufout, bytewrapout, bitoffsout,
					   u, v, bufin, bytewrapin, bitoffsin)
			for (; x < newx + lx - 7; x += 8) {
				tmpbyte = GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 7;
				u += dudx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 6;
				u += dudx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 5;
				u += dudx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 4;
				u += dudx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 3;
				u += dudx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 2;
				u += dudx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 1;
				u += dudx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin);
				u += dudx;
				BUFBYTE(x, y, bufout, bytewrapout, bitoffsout) = tmpbyte;
			}
			for (; x < newx + lx; u += dudx, x++)
				BITCPY(x, y, bufout, bytewrapout, bitoffsout,
					   u, v, bufin, bytewrapin, bitoffsin)
		}
	else
		for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++) {
			u = u0;
			v = v0;
			x = newx;
			for (; x < newx + lx && ((x + bitoffsout) & 7); v += dvdx, x++)
				BITCPY(x, y, bufout, bytewrapout, bitoffsout,
					   u, v, bufin, bytewrapin, bitoffsin)
			for (; x < newx + lx - 7; x += 8) {
				tmpbyte = GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 7;
				v += dvdx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 6;
				v += dvdx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 5;
				v += dvdx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 4;
				v += dvdx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 3;
				v += dvdx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 2;
				v += dvdx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin) << 1;
				v += dvdx;
				tmpbyte |= GET_BIT(u, v, bufin, bytewrapin, bitoffsin);
				v += dvdx;
				BUFBYTE(x, y, bufout, bytewrapout, bitoffsout) = tmpbyte;
			}
			for (; x < newx + lx; v += dvdx, x++)
				BITCPY(x, y, bufout, bytewrapout, bitoffsout,
					   u, v, bufin, bytewrapin, bitoffsin)
		}
	E 15

#ifdef DEBUG
		STW_STOP(0)
			STW_PRINT(stdout)
#endif
}

/*---------------------------------------------------------------------------*/
E 14

I 14
#ifdef VERSIONE_LENTA

	static void
	rop_copy_90_gr8(RASTER *rin, RASTER *rout,
					int x1, int y1, int x2, int y2,
					int newx, int newy,
					int mirror, int ninety)
{
	UCHAR *bufin, *bufout;
	int wrapin, wrapout;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudx, dudy, dvdx, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

#ifdef DEBUG
	STW_INIT(0, "rop_copy_90_gr8")
	STW_START(0)
#endif
E 14

D 14
#else
E 14
I 14 mirror &= 1;
	ninety &= 3;
	E 14

D 14 if (!ninety && !flip)
E 14
I 14 if (!ninety && !mirror)
E 14
	{
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}

	I 14 u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	dudx = 0;
	dudy = 0;
	dvdx = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dudx = 1;
		dvdy = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dvdx = -1;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dudx = -1;
		dvdy = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dvdx = 1;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dudx = -1;
		dvdy = 1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dvdx = -1;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dudx = 1;
		dvdy = -1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dvdx = 1;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	if (dudx)
		for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++)
			for (u = u0, v = v0, x = newx; x < newx + lx; u += dudx, x++) {
				bufout[x + y * wrapout] = bufin[u + v * wrapin];
			}
	else
		for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++)
			for (u = u0, v = v0, x = newx; x < newx + lx; v += dvdx, x++) {
				bufout[x + y * wrapout] = bufin[u + v * wrapin];
			}

#ifdef DEBUG
	STW_STOP(0)
	STW_PRINT(stdout)
	E 14
#endif
}

I 14
#endif

E 14
/*---------------------------------------------------------------------------*/

static void rop_copy_90_gr8(RASTER *rin, RASTER *rout,
                            int x1, int y1, int x2, int y2,
			    int newx, int newy,
D 14
		            int ninety, int flip)
E 14
I 14
		            int mirror, int ninety)
E 14
{
	D 14 if (!ninety && !flip)
E 14
I 14 UCHAR * bufin, *bufout, *bytein, *byteout;
	int wrapin, wrapout;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

#ifdef DEBUG
	STW_INIT(0, "rop_copy_90_gr8")
	STW_START(0)
#endif

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror)
		E 14
		{
			rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
			return;
		}
	I 14

		u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		D 61 CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dindx = wrapin;
		I 50 DEFAULT : assert(FALSE);
		u00 = v00 = dudy = dindx = 0;
		E 50
	}

	for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
		bytein = bufin + u0 + v0 * wrapin;
		byteout = bufout + newx + y * wrapout;
		for (x = newx; x < newx + lx; x++) {
			*byteout++ = *bytein;
			bytein += dindx;
		}
	}
	I 17

#ifdef DEBUG
		STW_STOP(0)
			STW_PRINT(stdout)
#endif
}

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

I 21 static void rop_copy_90_gr8_cm16(RASTER * rin, RASTER * rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy,
									   int mirror, int ninety)
{
	UCHAR *bufin, *bytein;
	USHORT *bufout, *pixout;
	LPIXEL *cmap;
	int wrapin, wrapout, cmap_offset;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;
	int reversed;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}
	if (!rout->cmap.buffer) {
		msg(MSG_IE, "rop_copy_90_gr8_cm16: missing color map");
		return;
	}
	cmap = rout->cmap.buffer;
	D 56 cmap_offset = rout->cmap.offset;
	E 56
I 56 cmap_offset = rout->cmap.info.offset_mask;
	E 56 reversed = cmap[0].r != 0;

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dindx = wrapin;
		I 50 DEFAULT : assert(FALSE);
		u00 = v00 = dudy = dindx = 0;
		E 50
	}

	for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
		bytein = bufin + u0 + v0 * wrapin;
		pixout = bufout + newx + y * wrapout;
		if (reversed)
			for (x = newx; x < newx + lx; x++) {
				*pixout++ = cmap_offset + (255 - *bytein);
				bytein += dindx;
			}
		else
			for (x = newx; x < newx + lx; x++) {
				*pixout++ = cmap_offset + *bytein;
				bytein += dindx;
			}
		I 23
	}
}

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

static void rop_copy_90_cm8_cm16(RASTER * rin, RASTER * rout,
								 int x1, int y1, int x2, int y2,
								 int newx, int newy,
								 int mirror, int ninety)
{
	UCHAR *bufin, *pixin;
	USHORT *bufout, *pixout;
	LPIXEL *cmapin, *cmapout;
	int wrapin, wrapout, cmapin_offset, cmapout_offset, cmap_offset_delta;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}
	if (!rin->cmap.buffer || !rout->cmap.buffer) {
		msg(MSG_IE, "rop_copy_90_cm8_cm16: missing color map");
		return;
	}
	cmapin = rin->cmap.buffer;
	cmapout = rout->cmap.buffer;
	D 56 cmapin_offset = rin->cmap.offset;
	cmapout_offset = rout->cmap.offset;
	E 56
I 56 cmapin_offset = rin->cmap.info.offset_mask;
	cmapout_offset = rout->cmap.info.offset_mask;
	E 56 cmap_offset_delta = cmapout_offset - cmapin_offset;

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dindx = wrapin;
		I 50 DEFAULT : assert(FALSE);
		u00 = v00 = dudy = dindx = 0;
		E 50
	}

	for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
		pixin = bufin + u0 + v0 * wrapin;
		pixout = bufout + newx + y * wrapout;
		for (x = newx; x < newx + lx; x++) {
			*pixout++ = *pixin + cmap_offset_delta;
			pixin += dindx;
		}
		E 23
	}
}

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

I 22
D 55 static void rop_copy_90_gr8_rgbm(RASTER * rin, RASTER * rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy,
										int mirror, int ninety)
E 55
I 55 static void
rop_copy_90_gr8_rgb16(RASTER * rin, RASTER * rout,
					  int x1, int y1, int x2, int y2,
					  int newx, int newy,
					  int mirror, int ninety)
E 55
{
	UCHAR *bufin, *bytein;
	D 55 LPIXEL *bufout, *pixout, tmp;
	E 55
I 55 USHORT *bufout, *pixout;
	E 55 int wrapin, wrapout;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	E 61
I 61 CASE(0 << 2) + 2 : u00 = u1 + su;
	v00 = v1 + sv;
	dvdy = -1;
	dindx = -1;
	CASE(0 << 2) + 3 : u00 = u1 + su;
	v00 = v1;
	dudy = -1;
	dindx = wrapin;
	CASE(1 << 2) + 0 : u00 = u1 + su;
	v00 = v1;
	dvdy = 1;
	dindx = -1;
	CASE(1 << 2) + 1 : u00 = u1 + su;
	v00 = v1 + sv;
	dudy = -1;
	dindx = -wrapin;
	CASE(1 << 2) + 2 : u00 = u1;
	v00 = v1 + sv;
	dvdy = -1;
	dindx = 1;
	CASE(1 << 2) + 3 : u00 = u1;
	v00 = v1;
	dudy = 1;
	dindx = wrapin;
	D 78 DEFAULT : assert(FALSE);
	u00 = v00 = dudy = dindx = 0;
	E 78
I 78 DEFAULT : abort();
	u00 = v00 = dudy = dindx = 0;
	E 78
}

for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
	bytein = bufin + u0 + v0 * wrapin;
	byteout = bufout + newx + y * wrapout;
	for (x = newx; x < newx + lx; x++) {
		*byteout++ = *bytein;
		bytein += dindx;
		D 62
	}
}

E 62
I 62
}
}

E 62
#ifdef DEBUG
	STW_STOP(0)
		STW_PRINT(stdout)
#endif
}

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

static void rop_copy_90_gr8_cm16(RASTER *rin, RASTER *rout,
								 int x1, int y1, int x2, int y2,
								 int newx, int newy,
								 int mirror, int ninety)
{
	UCHAR *bufin, *bytein;
	USHORT *bufout, *pixout;
	LPIXEL *cmap;
	int wrapin, wrapout, cmap_offset;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;
	int reversed;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}
	D 84 if (!rout->cmap.buffer)
	{
		msg(MSG_IE, "rop_copy_90_gr8_cm16: missing color map");
		return;
	}
	E 84 cmap = rout->cmap.buffer;
	cmap_offset = rout->cmap.info.offset_mask;
	reversed = cmap[0].r != 0;

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dindx = wrapin;
		D 78 DEFAULT : assert(FALSE);
		u00 = v00 = dudy = dindx = 0;
		E 78
I 78 DEFAULT : abort();
		u00 = v00 = dudy = dindx = 0;
		E 78
	}

	for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
		bytein = bufin + u0 + v0 * wrapin;
		pixout = bufout + newx + y * wrapout;
		if (reversed)
			for (x = newx; x < newx + lx; x++) {
				*pixout++ = cmap_offset + (255 - *bytein);
				bytein += dindx;
			}
		else
			for (x = newx; x < newx + lx; x++) {
				*pixout++ = cmap_offset + *bytein;
				bytein += dindx;
			}
	}
}

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

I 84 static void rop_copy_90_gr8_cm24(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy,
									   int mirror, int ninety)
{
	UCHAR *bufin, *bytein;
	ULONG *bufout, *pixout;
	LPIXEL *penmap, *colmap;
	int wrapin, wrapout;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;
	int reversed;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}
	penmap = rout->cmap.penbuffer;
	colmap = rout->cmap.colbuffer;
	reversed = penmap[0].r + colmap[0].r != 0;

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dindx = wrapin;
	DEFAULT:
		abort();
		u00 = v00 = dudy = dindx = 0;
	}

	for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
		bytein = bufin + u0 + v0 * wrapin;
		pixout = bufout + newx + y * wrapout;
		if (reversed)
			for (x = newx; x < newx + lx; x++) {
				*pixout++ = 255 - *bytein;
				bytein += dindx;
			}
		else
			for (x = newx; x < newx + lx; x++) {
				*pixout++ = *bytein;
				bytein += dindx;
			}
	}
}

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

E 84 static void rop_copy_90_cm8_cm16(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy,
									   int mirror, int ninety)
{
	UCHAR *bufin, *pixin;
	USHORT *bufout, *pixout;
	D 84 LPIXEL *cmapin, *cmapout;
	E 84 int wrapin, wrapout, cmapin_offset, cmapout_offset, cmap_offset_delta;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}
	D 84 if (!rin->cmap.buffer || !rout->cmap.buffer)
	{
		msg(MSG_IE, "rop_copy_90_cm8_cm16: missing color map");
		return;
	}
	cmapin = rin->cmap.buffer;
	cmapout = rout->cmap.buffer;
	E 84 cmapin_offset = rin->cmap.info.offset_mask;
	cmapout_offset = rout->cmap.info.offset_mask;
	cmap_offset_delta = cmapout_offset - cmapin_offset;

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dindx = wrapin;
		D 78 DEFAULT : assert(FALSE);
		u00 = v00 = dudy = dindx = 0;
		E 78
I 78 DEFAULT : abort();
		u00 = v00 = dudy = dindx = 0;
		E 78
	}

	for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
		pixin = bufin + u0 + v0 * wrapin;
		pixout = bufout + newx + y * wrapout;
		for (x = newx; x < newx + lx; x++) {
			*pixout++ = *pixin + cmap_offset_delta;
			pixin += dindx;
		}
	}
}

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

I 84 static void rop_copy_90_cm8_cm24(RASTER *rin, RASTER *rout,
									   int x1, int y1, int x2, int y2,
									   int newx, int newy,
									   int mirror, int ninety)
{
	UCHAR *bufin, *pixin;
	ULONG *bufout, *pixout;
	int wrapin, wrapout, cmapin_offset, cmap_offset_delta;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}
	cmapin_offset = rin->cmap.info.offset_mask;
	cmap_offset_delta = -cmapin_offset;

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dindx = wrapin;
	DEFAULT:
		abort();
		u00 = v00 = dudy = dindx = 0;
	}

	for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
		pixin = bufin + u0 + v0 * wrapin;
		pixout = bufout + newx + y * wrapout;
		for (x = newx; x < newx + lx; x++) {
			*pixout++ = *pixin + cmap_offset_delta;
			pixin += dindx;
		}
	}
}

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

E 84 static void rop_copy_90_gr8_rgb16(RASTER *rin, RASTER *rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy,
										int mirror, int ninety)
{
	UCHAR *bufin, *bytein;
	USHORT *bufout, *pixout;
	int wrapin, wrapout;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	E 61 bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dindx = wrapin;
		I 50
D 78 DEFAULT : assert(FALSE);
		u00 = v00 = dudy = dindx = 0;
		E 78
I 78 DEFAULT : abort();
		u00 = v00 = dudy = dindx = 0;
		E 78
E 50
	}

	for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
		bytein = bufin + u0 + v0 * wrapin;
		pixout = bufout + newx + y * wrapout;
		for (x = newx; x < newx + lx; x++) {
			D 55 tmp.r = *bytein;
			tmp.g = *bytein;
			tmp.b = *bytein;
			I 43 tmp.m = 0xff;
			*pixout++ = tmp;
			E 55
I 55
D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(*bytein, *bytein, *bytein);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(*bytein, *bytein, *bytein);
			E 60
E 55 bytein += dindx;
		}
	}
}

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

D 55
static void rop_copy_90_rgb_rgbm(RASTER *rin, RASTER *rout,
E 55
I 55
D 56
static void rop_copy_90_gr8_rgbm(RASTER *rin, RASTER *rout,
E 55
                                 int x1, int y1, int x2, int y2,
			         int newx, int newy,
		                 int mirror, int ninety)
E 56
I 56
D 57
#ifdef DAFARE

E 57
static void rop_zoom_out_90_gr8_rgb16(RASTER *rin, RASTER *rout,
                                      int x1, int y1, int x2, int y2,
			              int newx, int newy,
		                      int abs_zoom_level,
				      int mirror, int ninety)
E 56
{
	D 55 UCHAR *bufin, *bytein, *appo;
	E 55
I 55
D 56 UCHAR *bufin, *bytein;
	E 55 LPIXEL *bufout, *pixout, tmp;
	E 56
I 56 UCHAR *bufin, *rowin, *pixin, *in;
	int tmp;
	USHORT *bufout, *rowout, *pixout;
	E 56 int wrapin, wrapout;
	D 57 int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	E 57 int u1, v1, u2, v2;
	I 56
D 57 int ulast, vlast, urest, vrest, i, j;
	E 57
I 57 int u, v, lu, lv, startu, startv;
	int p, q, lp, lq;
	int dudp, dvdp, dudq, dvdq, dindp, dindq;
	int plast, qlast, prest, qrest, i, j;
	E 57 int factor, fac_fac_2_bits;
	D 57 int fac_fac, vrest_fac, fac_urest, vrest_urest;
	int fac_fac_2, vrest_fac_2, fac_urest_2, vrest_urest_2;
	E 57
I 57 int fac_fac, qrest_fac, fac_prest, qrest_prest;
	int fac_fac_2, qrest_fac_2, fac_prest_2, qrest_prest_2;
	E 57 int fac_fac_4;
	E 56

		mirror &= 1;
	ninety &= 3;

	D 44 printf("mirror = %d ninety = %d\n", mirror, ninety);

	E 44 if (!ninety && !mirror)
	{
		D 56 rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		E 56
I 56
D 57 rop_zoom_out(rin, rout, x1, y1, x2, y2, newx, newy);
		E 57
I 57 rop_zoom_out(rin, rout, x1, y1, x2, y2, newx, newy, abs_zoom_level);
		E 57
E 56 return;
	}

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	D 57 su = u2 - u1;
	sv = v2 - v1;
	E 57 lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		D 57 lx = lv;
		ly = lu;
		E 57
I 57 lp = lv;
		lq = lu;
		E 57
	} else {
		D 57 lx = lu;
		ly = lv;
		E 57
I 57 lp = lu;
		lq = lv;
		E 57
	}
	D 57

E 57
I 56 factor = 1 << abs_zoom_level;
	D 57 urest = lu % factor;
	vrest = lv % factor;
	ulast = u2 - urest + 1;
	vlast = v2 - vrest + 1;
	E 57
I 57
D 61 prest = lp % factor;
	qrest = lq % factor;
	E 61
I 61 prest = lp & (factor - 1);
	qrest = lq & (factor - 1);
	E 61 plast = lp - prest;
	qlast = lq - qrest;
	E 57 fac_fac = factor * factor;
	fac_fac_2 = fac_fac >> 1;
	fac_fac_4 = fac_fac >> 2;
	fac_fac_2_bits = 2 * abs_zoom_level - 1;
	D 57 vrest_fac = vrest * factor;
	vrest_fac_2 = vrest_fac >> 1;
	fac_urest = factor * urest;
	fac_urest_2 = fac_urest >> 1;
	vrest_urest = vrest * urest;
	vrest_urest_2 = vrest_urest >> 1;
	E 57
I 57 qrest_fac = qrest * factor;
	qrest_fac_2 = qrest_fac >> 1;
	fac_prest = factor * prest;
	fac_prest_2 = fac_prest >> 1;
	qrest_prest = qrest * prest;
	qrest_prest_2 = qrest_prest >> 1;
	E 57

E 56 bufin = rin->buffer;
	D 55 wrapin = rin->wrap * 3; /* mi muovo di bytes */
	E 55
I 55 wrapin = rin->wrap;
	E 55 bufout = rout->buffer;
	wrapout = rout->wrap;

	D 57 dudy = 0;
	dvdy = 0;

	E 57 switch ((mirror << 2) + ninety)
	{
		D 55 CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 3;
		E 55
I 55
D 57 CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		E 55 CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		D 55 CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -3;
		E 55
I 55 CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		E 55 CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		D 55 CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -3;
		E 55
I 55 CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		E 55 CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		D 55 CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 3;
		E 55
I 55 CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = 1;
		E 55 CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dindx = wrapin;
		I 50 DEFAULT : assert(FALSE);
		u00 = v00 = dudy = dindx = 0;
		E 50
	}

	for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
		D 55 bytein = bufin + u0 * 3 + v0 * wrapin;
		E 55
I 55 bytein = bufin + u0 + v0 * wrapin;
		E 55 pixout = bufout + newx + y * wrapout;
		for (x = newx; x < newx + lx; x++) {
			D 55 appo = bytein;
			tmp.r = *appo++;
			tmp.g = *appo++;
			tmp.b = *appo;
			E 55
I 55
D 56 tmp.r = *bytein;
			tmp.g = *bytein;
			tmp.b = *bytein;
			E 55
E 43 tmp.m = 0xff;
			*pixout++ = tmp;
			E 56
I 56
				*pixout++ = ROP_RGB16_FROM_BYTES(*bytein, *bytein, *bytein);
			E 56 bytein += dindx;
		}
		E 57
I 57 CASE(0 << 2) + 0 : dudp = 1;
		dvdp = 0;
		dudq = 0;
		dvdq = 1;
		startu = u1;
		startv = v1;
		CASE(0 << 2) + 1 : dudp = 0;
		dvdp = -1;
		dudq = 1;
		dvdq = 0;
		startu = u1;
		startv = v2;
		CASE(0 << 2) + 2 : dudp = -1;
		dvdp = 0;
		dudq = 0;
		dvdq = -1;
		startu = u2;
		startv = v2;
		CASE(0 << 2) + 3 : dudp = 0;
		dvdp = 1;
		dudq = -1;
		dvdq = 0;
		startu = u2;
		startv = v1;
		CASE(1 << 2) + 0 : dudp = -1;
		dvdp = 0;
		dudq = 0;
		dvdq = 1;
		startu = u2;
		startv = v1;
		D 61 CASE(1 << 2) + 1 : dudp = 0;
		dvdp = 1;
		dudq = 1;
		dvdq = 0;
		startu = u2;
		startv = v2;
		E 61
I 61 CASE(1 << 2) + 1 : dudp = 0;
		dvdp = -1;
		dudq = -1;
		dvdq = 0;
		startu = u2;
		startv = v2;
		E 61 CASE(1 << 2) + 2 : dudp = 1;
		dvdp = 0;
		dudq = 0;
		dvdq = -1;
		startu = u1;
		startv = v2;
		D 61 CASE(1 << 2) + 3 : dudp = 0;
		dvdp = -1;
		dudq = -1;
		dvdq = 0;
		startu = u1;
		startv = v1;
		E 61
I 61 CASE(1 << 2) + 3 : dudp = 0;
		dvdp = 1;
		dudq = 1;
		dvdq = 0;
		startu = u1;
		startv = v1;
		E 61 DEFAULT :
D 78 assert(FALSE);
		dudp = dvdp = dudq = dvdq = startu = startv = 0;
		E 78
I 78 abort();
		dudp = dvdp = dudq = dvdq = startu = startv = 0;
		E 78
E 57
	}
	I 57 dindp = dudp + wrapin * dvdp;
	dindq = dudq + wrapin * dvdq;
	E 57
D 56
}

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

E 22
E 21
D 55
static void rop_copy_90_bw_gr8(RASTER *rin, RASTER *rout,
                               int x1, int y1, int x2, int y2,
			       int newx, int newy,
		               int mirror, int ninety)
E 55
I 55
static void rop_copy_90_rgb_rgbm(RASTER *rin, RASTER *rout,
                                 int x1, int y1, int x2, int y2,
			         int newx, int newy,
		                 int mirror, int ninety)
E 55
{
	D 55 UCHAR *bufin, *bufout, *bytein, *byteout;
	int bytewrapin, bitoffsin, wrapout;
	int value_for_0, value_for_1;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudy, dvdy, dudx, dvdx;
	E 55
I 55 UCHAR *bufin, *bytein, *appo;
	LPIXEL *bufout, *pixout, tmp;
	int wrapin, wrapout;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	E 55 int x, y, lx, ly;
	int u1, v1, u2, v2;

	D 55
#ifdef DEBUG
		STW_INIT(0, "rop_copy_90_bw_gr8")
			STW_START(0)
#endif

E 55 mirror &= 1;
	D 55 ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
		E 55
I 55 ninety &= 3;

		if (!ninety && !mirror) {
			rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
			return;
		}
		E 56

D 56 u1 = x1;
		v1 = y1;
		u2 = x2;
		v2 = y2;

		su = u2 - u1;
		sv = v2 - v1;
		lu = u2 - u1 + 1;
		lv = v2 - v1 + 1;

		if (ninety & 1) {
			lx = lv;
			ly = lu;
		} else {
			lx = lu;
			ly = lv;
		}

		bufin = rin->buffer;
		wrapin = rin->wrap * 3; /* mi muovo di bytes */
		bufout = rout->buffer;
		wrapout = rout->wrap;

		dudy = 0;
		dvdy = 0;

		switch ((mirror << 2) + ninety)
			E 56
I 56
D 57 rowin = (UCHAR *)rin->buffer + wrapin * v1 + u1;
		rowout = (USHORT *)rout->buffer + wrapout * newy + newx;
		for (v = v1; v < vlast; v += factor)
			E 57
I 57 rowin = (UCHAR *)rin->buffer + startu + startv * wrapin;
		rowout = (USHORT *)rout->buffer + newx + newy * wrapout;
		for (q = 0; q < qlast; q += factor)
			E 57
E 56
			{
				D 56 CASE(0 << 2) + 0 : u00 = u1;
				v00 = v1;
				dvdy = 1;
				dindx = 3;
				CASE(0 << 2) + 1 : u00 = u1;
				v00 = v1 + sv;
				dudy = 1;
				dindx = -wrapin;
				CASE(0 << 2) + 2 : u00 = u1 + su;
				v00 = v1 + sv;
				dvdy = -1;
				dindx = -3;
				CASE(0 << 2) + 3 : u00 = u1 + su;
				v00 = v1;
				dudy = -1;
				dindx = wrapin;
				CASE(1 << 2) + 0 : u00 = u1 + su;
				v00 = v1;
				dvdy = 1;
				dindx = -3;
				CASE(1 << 2) + 1 : u00 = u1 + su;
				v00 = v1 + sv;
				dudy = -1;
				dindx = -wrapin;
				CASE(1 << 2) + 2 : u00 = u1;
				v00 = v1 + sv;
				dvdy = -1;
				dindx = 3;
				CASE(1 << 2) + 3 : u00 = u1;
				v00 = v1;
				dudy = 1;
				dindx = wrapin;
			DEFAULT:
				assert(FALSE);
				u00 = v00 = dudy = dindx = 0;
				E 56
I 56 pixin = rowin;
				pixout = rowout;
				D 57 for (u = u1; u < ulast; u += factor)
E 57
I 57
D 58 for (p = 0; p < plast; p += factor)
E 57
				{
					tmp = 0;
					in = pixin;
					for (j = 0; j < factor; j += 2) {
						for (i = 0; i < factor; i += 2) {
							tmp += *in;
							D 57 in += wrapin;
							in++;
							E 57
I 57 in += dindp + dindq;
							E 57 tmp += *in;
							D 57 in -= wrapin;
							in++;
							E 57
I 57 in += dindp - dindq;
							E 57
						}
						D 57 in += 2 * wrapin - factor;
						E 57
I 57 in += 2 * dindq - factor * dindp;
						E 57
					}
					tmp = (tmp + fac_fac_4) >> fac_fac_2_bits;
					*pixout++ = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
					D 57 pixin += factor;
					E 57
I 57 pixin += factor * dindp;
					E 57
				}
				D 57 if (urest)
E 57
I 57 if (prest)
E 57
				{
					tmp = 0;
					for (j = 0; j < factor; j++)
						D 57 for (i = 0; i < urest; i++)
E 57
I 57 for (i = 0; i < prest; i++)
E 57
						{
							D 57 tmp += pixin[i + j * wrapin];
							E 57
I 57 tmp += pixin[i * dindp + j * dindq];
							E 57
						}
					D 57 tmp = (tmp + fac_urest_2) / fac_urest;
					E 57
I 57 tmp = (tmp + fac_prest_2) / fac_prest;
					E 57
						*pixout = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
				}
				D 57 rowin += wrapin * factor;
				E 57
I 57 rowin += factor * dindq;
				E 57 rowout += wrapout;
				E 56
			}
		D 56

			for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++)
E 56
I 56
D 57 if (vrest)
E 57
I 57 if (qrest)
E 57
E 56
		{
			D 56 bytein = bufin + u0 * 3 + v0 * wrapin;
			pixout = bufout + newx + y * wrapout;
			for (x = newx; x < newx + lx; x++)
				E 56
I 56 pixin = rowin;
			pixout = rowout;
			D 57 for (u = u1; u < ulast; u += factor)
E 57
I 57 for (p = 0; p < plast; p += factor)
E 57
E 56
			{
				D 56 appo = bytein;
				tmp.r = *appo++;
				tmp.g = *appo++;
				tmp.b = *appo;
				tmp.m = 0xff;
				*pixout++ = tmp;
				bytein += dindx;
				E 56
I 56 tmp = 0;
				D 57 for (j = 0; j < vrest; j++)
E 57
I 57 for (j = 0; j < qrest; j++)
E 57 for (i = 0; i < factor; i++)
				{
					D 57 tmp += pixin[i + j * wrapin];
					E 57
I 57 tmp += pixin[i * dindp + j * dindq];
					E 57
				}
				D 57 tmp = (tmp + vrest_fac_2) / vrest_fac;
				E 57
I 57 tmp = (tmp + qrest_fac_2) / qrest_fac;
				E 57
					*pixout++ = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
				D 57 pixin += factor;
				E 57
I 57 pixin += factor * dindp;
				E 57
			}
			D 57 if (urest)
E 57
I 57 if (prest)
E 57
			{
				tmp = 0;
				D 57 for (j = 0; j < vrest; j++) for (i = 0; i < urest; i++)
E 57
I 57 for (j = 0; j < qrest; j++) for (i = 0; i < prest; i++)
E 57
				{
					D 57 tmp += pixin[i + j * wrapin];
					E 57
I 57 tmp += pixin[i * dindp + j * dindq];
					E 57
				}
				D 57 tmp = (tmp + vrest_urest_2) / vrest_urest;
				E 57
I 57 tmp = (tmp + qrest_prest_2) / qrest_prest;
				E 57
					*pixout = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
				E 56
			}
		}
		D 56
	}
	E 56
D 57

E 57
D 56
		/*---------------------------------------------------------------------------*/
E 56
I 56
}
E 56

D 56
static void rop_copy_90_bw_gr8(RASTER *rin, RASTER *rout,
                               int x1, int y1, int x2, int y2,
E 56
I 56
D 57
#endif

E 57
/*---------------------------------------------------------------------------*/

static void rop_copy_90_gr8_rgbm(RASTER *rin, RASTER *rout,
                                 int x1, int y1, int x2, int y2,
			         int newx, int newy,
		                 int mirror, int ninety)
{
	UCHAR *bufin, *bytein;
	LPIXEL *bufout, *pixout, tmp;
	int wrapin, wrapout;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dvdy = 1;
		dindx = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dindx = -wrapin;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dvdy = -1;
		dindx = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dindx = wrapin;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dvdy = 1;
		dindx = -1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dindx = -wrapin;
		E 58
I 58 for (p = 0; p < plast; p += factor)
		{
			tmp = 0;
			in = pixin;
			for (j = 0; j < factor; j += 2) {
				for (i = 0; i < factor; i += 2) {
					tmp += *in;
					in += dindp + dindq;
					tmp += *in;
					in += dindp - dindq;
				}
				in += 2 * dindq - factor * dindp;
			}
			tmp = (tmp + fac_fac_4) >> fac_fac_2_bits;
			D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60 pixin += factor * dindp;
		}
		if (prest) {
			tmp = 0;
			for (j = 0; j < factor; j++)
				for (i = 0; i < prest; i++) {
					tmp += pixin[i * dindp + j * dindq];
				}
			tmp = (tmp + fac_prest_2) / fac_prest;
			D 60
				*pixout = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
I 60
				*pixout = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
		}
		rowin += factor * dindq;
		rowout += wrapout;
	}
	D 59 if (qrest)
E 59
I 59 if (qrest)
E 59
	{
		pixin = rowin;
		pixout = rowout;
		for (p = 0; p < plast; p += factor) {
			tmp = 0;
			for (j = 0; j < qrest; j++)
				for (i = 0; i < factor; i++) {
					tmp += pixin[i * dindp + j * dindq];
				}
			tmp = (tmp + qrest_fac_2) / qrest_fac;
			D 60
				*pixout++ = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
I 60
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60 pixin += factor * dindp;
		}
		if (prest) {
			tmp = 0;
			for (j = 0; j < qrest; j++)
				for (i = 0; i < prest; i++) {
					tmp += pixin[i * dindp + j * dindq];
				}
			tmp = (tmp + qrest_prest_2) / qrest_prest;
			D 60
				*pixout = ROP_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
I 60
				*pixout = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
			E 60
		}
	}
}

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

static void rop_copy_90_gr8_rgbm(RASTER *rin, RASTER *rout,
                                 int x1, int y1, int x2, int y2,
			         int newx, int newy,
		                 int mirror, int ninety)
{
	UCHAR *bufin, *bytein;
	LPIXEL *bufout, *pixout, tmp;
	int wrapin, wrapout;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	}
	D 65 else
	{
		lx = lu;
		ly = lv;
	}

	bufin = rin->buffer;
	wrapin = rin->wrap;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudy = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		E 65
I 65 else
		{
			lx = lu;
			ly = lv;
		}

		bufin = rin->buffer;
		wrapin = rin->wrap;
		bufout = rout->buffer;
		wrapout = rout->wrap;

		dudy = 0;
		dvdy = 0;

		switch ((mirror << 2) + ninety) {
			E 65 CASE(0 << 2) + 0 : u00 = u1;
			v00 = v1;
			dvdy = 1;
			dindx = 1;
			CASE(0 << 2) + 1 : u00 = u1;
			v00 = v1 + sv;
			dudy = 1;
			dindx = -wrapin;
			CASE(0 << 2) + 2 : u00 = u1 + su;
			v00 = v1 + sv;
			dvdy = -1;
			dindx = -1;
			CASE(0 << 2) + 3 : u00 = u1 + su;
			v00 = v1;
			dudy = -1;
			dindx = wrapin;
			CASE(1 << 2) + 0 : u00 = u1 + su;
			v00 = v1;
			dvdy = 1;
			dindx = -1;
			CASE(1 << 2) + 1 : u00 = u1 + su;
			v00 = v1 + sv;
			dudy = -1;
			dindx = -wrapin;
			E 58 CASE(1 << 2) + 2 : u00 = u1;
			v00 = v1 + sv;
			dvdy = -1;
			dindx = 1;
			CASE(1 << 2) + 3 : u00 = u1;
			v00 = v1;
			dudy = 1;
			dindx = wrapin;
			D 78 DEFAULT : assert(FALSE);
			u00 = v00 = dudy = dindx = 0;
			E 78
I 78 DEFAULT : abort();
			u00 = v00 = dudy = dindx = 0;
			E 78
		}

		for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
			bytein = bufin + u0 + v0 * wrapin;
			pixout = bufout + newx + y * wrapout;
			for (x = newx; x < newx + lx; x++) {
				tmp.r = *bytein;
				tmp.g = *bytein;
				tmp.b = *bytein;
				tmp.m = 0xff;
				*pixout++ = tmp;
				bytein += dindx;
			}
		}
	}

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

	I 57 static void rop_zoom_out_90_gr8_rgbm(RASTER * rin, RASTER * rout,
											   int x1, int y1, int x2, int y2,
											   int newx, int newy,
											   int abs_zoom_level,
											   int mirror, int ninety)
	{
		UCHAR *bufin, *rowin, *pixin, *in;
		int tmp;
		LPIXEL *bufout, *rowout, *pixout, valout;
		int wrapin, wrapout;
		int u1, v1, u2, v2;
		int u, v, lu, lv, startu, startv;
		int p, q, lp, lq;
		int dudp, dvdp, dudq, dvdq, dindp, dindq;
		int plast, qlast, prest, qrest, i, j;
		int factor, fac_fac_2_bits;
		int fac_fac, qrest_fac, fac_prest, qrest_prest;
		int fac_fac_2, qrest_fac_2, fac_prest_2, qrest_prest_2;
		int fac_fac_4;

		mirror &= 1;
		ninety &= 3;

		if (!ninety && !mirror) {
			rop_zoom_out(rin, rout, x1, y1, x2, y2, newx, newy, abs_zoom_level);
			return;
		}

		u1 = x1;
		v1 = y1;
		u2 = x2;
		v2 = y2;

		lu = u2 - u1 + 1;
		lv = v2 - v1 + 1;

		if (ninety & 1) {
			lp = lv;
			lq = lu;
		} else {
			lp = lu;
			lq = lv;
		}
		factor = 1 << abs_zoom_level;
		D 61 prest = lp % factor;
		qrest = lq % factor;
		E 61
I 61 prest = lp & (factor - 1);
		qrest = lq & (factor - 1);
		E 61 plast = lp - prest;
		qlast = lq - qrest;
		fac_fac = factor * factor;
		fac_fac_2 = fac_fac >> 1;
		fac_fac_4 = fac_fac >> 2;
		fac_fac_2_bits = 2 * abs_zoom_level - 1;
		qrest_fac = qrest * factor;
		qrest_fac_2 = qrest_fac >> 1;
		fac_prest = factor * prest;
		fac_prest_2 = fac_prest >> 1;
		qrest_prest = qrest * prest;
		qrest_prest_2 = qrest_prest >> 1;

		bufin = rin->buffer;
		wrapin = rin->wrap;
		bufout = rout->buffer;
		wrapout = rout->wrap;

		switch ((mirror << 2) + ninety) {
			CASE(0 << 2) + 0 : dudp = 1;
			dvdp = 0;
			dudq = 0;
			dvdq = 1;
			startu = u1;
			startv = v1;
			CASE(0 << 2) + 1 : dudp = 0;
			dvdp = -1;
			dudq = 1;
			dvdq = 0;
			startu = u1;
			startv = v2;
			CASE(0 << 2) + 2 : dudp = -1;
			dvdp = 0;
			dudq = 0;
			dvdq = -1;
			startu = u2;
			startv = v2;
			CASE(0 << 2) + 3 : dudp = 0;
			dvdp = 1;
			dudq = -1;
			dvdq = 0;
			startu = u2;
			startv = v1;
			CASE(1 << 2) + 0 : dudp = -1;
			dvdp = 0;
			dudq = 0;
			dvdq = 1;
			startu = u2;
			startv = v1;
			D 61 CASE(1 << 2) + 1 : dudp = 0;
			dvdp = 1;
			dudq = 1;
			dvdq = 0;
			startu = u2;
			startv = v2;
			E 61
I 61 CASE(1 << 2) + 1 : dudp = 0;
			dvdp = -1;
			dudq = -1;
			dvdq = 0;
			startu = u2;
			startv = v2;
			E 61 CASE(1 << 2) + 2 : dudp = 1;
			dvdp = 0;
			dudq = 0;
			dvdq = -1;
			startu = u1;
			startv = v2;
			D 61 CASE(1 << 2) + 3 : dudp = 0;
			dvdp = -1;
			dudq = -1;
			dvdq = 0;
			startu = u1;
			startv = v1;
			E 61
I 61 CASE(1 << 2) + 3 : dudp = 0;
			dvdp = 1;
			dudq = 1;
			dvdq = 0;
			startu = u1;
			startv = v1;
			E 61 DEFAULT :
D 78 assert(FALSE);
			dudp = dvdp = dudq = dvdq = startu = startv = 0;
			E 78
I 78 abort();
			dudp = dvdp = dudq = dvdq = startu = startv = 0;
			E 78
		}
		dindp = dudp + wrapin * dvdp;
		dindq = dudq + wrapin * dvdq;

		rowin = (UCHAR *)rin->buffer + startu + startv * wrapin;
		rowout = (LPIXEL *)rout->buffer + newx + newy * wrapout;
		valout.m = 0xff;
		for (q = 0; q < qlast; q += factor) {
			pixin = rowin;
			pixout = rowout;
			for (p = 0; p < plast; p += factor) {
				tmp = 0;
				in = pixin;
				for (j = 0; j < factor; j += 2) {
					for (i = 0; i < factor; i += 2) {
						tmp += *in;
						in += dindp + dindq;
						tmp += *in;
						in += dindp - dindq;
					}
					in += 2 * dindq - factor * dindp;
				}
				tmp = (tmp + fac_fac_4) >> fac_fac_2_bits;
				valout.r = valout.g = valout.b = tmp;
				*pixout++ = valout;
				pixin += factor * dindp;
			}
			if (prest) {
				tmp = 0;
				for (j = 0; j < factor; j++)
					for (i = 0; i < prest; i++) {
						tmp += pixin[i * dindp + j * dindq];
					}
				tmp = (tmp + fac_prest_2) / fac_prest;
				valout.r = valout.g = valout.b = tmp;
				*pixout++ = valout;
			}
			rowin += factor * dindq;
			rowout += wrapout;
		}
		if (qrest) {
			pixin = rowin;
			pixout = rowout;
			for (p = 0; p < plast; p += factor) {
				tmp = 0;
				for (j = 0; j < qrest; j++)
					for (i = 0; i < factor; i++) {
						tmp += pixin[i * dindp + j * dindq];
					}
				tmp = (tmp + qrest_fac_2) / qrest_fac;
				valout.r = valout.g = valout.b = tmp;
				*pixout++ = valout;
				pixin += factor * dindp;
			}
			if (prest) {
				tmp = 0;
				for (j = 0; j < qrest; j++)
					for (i = 0; i < prest; i++) {
						tmp += pixin[i * dindp + j * dindq];
					}
				tmp = (tmp + qrest_prest_2) / qrest_prest;
				valout.r = valout.g = valout.b = tmp;
				*pixout++ = valout;
			}
		}
	}

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

	I 63 static void rop_copy_90_rgb_rgb16(RASTER * rin, RASTER * rout,
											int x1, int y1, int x2, int y2,
											int newx, int newy,
											int mirror, int ninety)
	{
		UCHAR *bufin, *bytein;
		USHORT *bufout, *pixout;
		int wrapin, wrapout;
		int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
		int x, y, lx, ly;
		int u1, v1, u2, v2;

		mirror &= 1;
		ninety &= 3;

		if (!ninety && !mirror) {
			rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
			return;
		}

		u1 = x1;
		v1 = y1;
		u2 = x2;
		v2 = y2;

		su = u2 - u1;
		sv = v2 - v1;
		lu = u2 - u1 + 1;
		lv = v2 - v1 + 1;

		if (ninety & 1) {
			lx = lv;
			ly = lu;
		} else {
			lx = lu;
			ly = lv;
		}

		bufin = rin->buffer;
		wrapin = rin->wrap * 3; /* mi muovo di bytes */
		bufout = rout->buffer;
		wrapout = rout->wrap;

		dudy = 0;
		dvdy = 0;

		switch ((mirror << 2) + ninety) {
			CASE(0 << 2) + 0 : u00 = u1;
			v00 = v1;
			dvdy = 1;
			dindx = 3;
			D 81 CASE(0 << 2) + 1 : u00 = u1;
			v00 = v1 + sv;
			dudy = 1;
			dindx = -wrapin;
			CASE(0 << 2) + 2 : u00 = u1 + su;
			v00 = v1 + sv;
			dvdy = -1;
			dindx = -3;
			CASE(0 << 2) + 3 : u00 = u1 + su;
			v00 = v1;
			dudy = -1;
			dindx = wrapin;
			CASE(1 << 2) + 0 : u00 = u1 + su;
			v00 = v1;
			dvdy = 1;
			dindx = -3;
			CASE(1 << 2) + 1 : u00 = u1 + su;
			v00 = v1 + sv;
			dudy = -1;
			dindx = -wrapin;
			CASE(1 << 2) + 2 : u00 = u1;
			v00 = v1 + sv;
			dvdy = -1;
			dindx = 3;
			CASE(1 << 2) + 3 : u00 = u1;
			v00 = v1;
			dudy = 1;
			dindx = wrapin;
			D 78 DEFAULT : assert(FALSE);
			u00 = v00 = dudy = dindx = 0;
			E 78
I 78 DEFAULT : abort();
			u00 = v00 = dudy = dindx = 0;
			E 78
		}

		for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
			bytein = bufin + u0 * 3 + v0 * wrapin;
			pixout = bufout + newx + y * wrapout;
			for (x = newx; x < newx + lx; x++) {
				*pixout++ = PIX_RGB16_FROM_BYTES(bytein[0], bytein[1], bytein[2]);
				bytein += dindx;
			}
		}
	}

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

	static void rop_zoom_out_90_rgb_rgb16(RASTER * rin, RASTER * rout,
										  int x1, int y1, int x2, int y2,
										  int newx, int newy,
										  int abs_zoom_level,
										  int mirror, int ninety)
	{
		UCHAR *bufin, *rowin, *pixin, *in;
		int tmp_r, tmp_g, tmp_b;
		USHORT *bufout, *rowout, *pixout;
		int wrapin_bytes, wrapin_pixels, wrapout;
		int u1, v1, u2, v2;
		int u, v, lu, lv, startu, startv;
		int p, q, lp, lq;
		int dudp, dvdp, dudq, dvdq, dindp, dindq;
		int plast, qlast, prest, qrest, i, j;
		int factor, fac_fac_2_bits;
		int fac_fac, qrest_fac, fac_prest, qrest_prest;
		int fac_fac_2, qrest_fac_2, fac_prest_2, qrest_prest_2;
		int fac_fac_4;

		mirror &= 1;
		ninety &= 3;

		if (!ninety && !mirror) {
			rop_zoom_out(rin, rout, x1, y1, x2, y2, newx, newy, abs_zoom_level);
			return;
		}

		u1 = x1;
		v1 = y1;
		u2 = x2;
		v2 = y2;

		lu = u2 - u1 + 1;
		lv = v2 - v1 + 1;

		if (ninety & 1) {
			lp = lv;
			lq = lu;
		} else {
			lp = lu;
			lq = lv;
		}
		factor = 1 << abs_zoom_level;
		prest = lp & (factor - 1);
		qrest = lq & (factor - 1);
		plast = lp - prest;
		qlast = lq - qrest;
		fac_fac = factor * factor;
		fac_fac_2 = fac_fac >> 1;
		fac_fac_4 = fac_fac >> 2;
		fac_fac_2_bits = 2 * abs_zoom_level - 1;
		qrest_fac = qrest * factor;
		qrest_fac_2 = qrest_fac >> 1;
		fac_prest = factor * prest;
		fac_prest_2 = fac_prest >> 1;
		qrest_prest = qrest * prest;
		qrest_prest_2 = qrest_prest >> 1;

		bufin = rin->buffer;
		wrapin_pixels = rin->wrap;
		wrapin_bytes = wrapin_pixels * 3;
		bufout = rout->buffer;
		wrapout = rout->wrap;

		switch ((mirror << 2) + ninety) {
			CASE(0 << 2) + 0 : dudp = 1;
			dvdp = 0;
			dudq = 0;
			dvdq = 1;
			startu = u1;
			startv = v1;
			CASE(0 << 2) + 1 : dudp = 0;
			dvdp = -1;
			dudq = 1;
			dvdq = 0;
			startu = u1;
			startv = v2;
			CASE(0 << 2) + 2 : dudp = -1;
			dvdp = 0;
			dudq = 0;
			dvdq = -1;
			startu = u2;
			startv = v2;
			CASE(0 << 2) + 3 : dudp = 0;
			dvdp = 1;
			dudq = -1;
			dvdq = 0;
			startu = u2;
			startv = v1;
			CASE(1 << 2) + 0 : dudp = -1;
			dvdp = 0;
			dudq = 0;
			dvdq = 1;
			startu = u2;
			startv = v1;
			CASE(1 << 2) + 1 : dudp = 0;
			dvdp = -1;
			dudq = -1;
			dvdq = 0;
			startu = u2;
			startv = v2;
			CASE(1 << 2) + 2 : dudp = 1;
			dvdp = 0;
			dudq = 0;
			dvdq = -1;
			startu = u1;
			startv = v2;
			CASE(1 << 2) + 3 : dudp = 0;
			dvdp = 1;
			dudq = 1;
			dvdq = 0;
			startu = u1;
			startv = v1;
		DEFAULT:
			D 78 assert(FALSE);
			dudp = dvdp = dudq = dvdq = startu = startv = 0;
			E 78
I 78 abort();
			dudp = dvdp = dudq = dvdq = startu = startv = 0;
			E 78
		}
		dindp = (dudp + wrapin_pixels * dvdp) * 3;
		dindq = (dudq + wrapin_pixels * dvdq) * 3;

		rowin = (UCHAR *)rin->buffer + startu * 3 + startv * wrapin_bytes;
		rowout = (USHORT *)rout->buffer + newx + newy * wrapout;
		for (q = 0; q < qlast; q += factor) {
			pixin = rowin;
			pixout = rowout;
			for (p = 0; p < plast; p += factor) {
				tmp_r = tmp_g = tmp_b = 0;
				in = pixin;
				for (j = 0; j < factor; j += 2) {
					for (i = 0; i < factor; i += 2) {
						tmp_r += in[0];
						tmp_g += in[1];
						tmp_b += in[2];
						in += dindp + dindq;
						tmp_r += in[0];
						tmp_g += in[1];
						tmp_b += in[2];
						in += dindp - dindq;
					}
					in += 2 * dindq - factor * dindp;
				}
				tmp_r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
				tmp_g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
				tmp_b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
				pixin += factor * dindp;
			}
			if (prest) {
				tmp_r = tmp_g = tmp_b = 0;
				for (j = 0; j < factor; j++)
					for (i = 0; i < prest; i++) {
						tmp_r += pixin[i * dindp + j * dindq];
						tmp_g += pixin[i * dindp + j * dindq + 1];
						tmp_b += pixin[i * dindp + j * dindq + 2];
					}
				tmp_r = (tmp_r + fac_prest_2) / fac_prest;
				tmp_g = (tmp_g + fac_prest_2) / fac_prest;
				tmp_b = (tmp_b + fac_prest_2) / fac_prest;
				*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
			}
			rowin += factor * dindq;
			rowout += wrapout;
		}
		if (qrest) {
			pixin = rowin;
			pixout = rowout;
			for (p = 0; p < plast; p += factor) {
				tmp_r = tmp_g = tmp_b = 0;
				for (j = 0; j < qrest; j++)
					for (i = 0; i < factor; i++) {
						E 81
I 81 CASE(0 << 2) + 1 : u00 = u1;
						v00 = v1 + sv;
						dudy = 1;
						dindx = -wrapin;
						CASE(0 << 2) + 2 : u00 = u1 + su;
						v00 = v1 + sv;
						dvdy = -1;
						dindx = -3;
						CASE(0 << 2) + 3 : u00 = u1 + su;
						v00 = v1;
						dudy = -1;
						dindx = wrapin;
						CASE(1 << 2) + 0 : u00 = u1 + su;
						v00 = v1;
						dvdy = 1;
						dindx = -3;
						CASE(1 << 2) + 1 : u00 = u1 + su;
						v00 = v1 + sv;
						dudy = -1;
						dindx = -wrapin;
						CASE(1 << 2) + 2 : u00 = u1;
						v00 = v1 + sv;
						dvdy = -1;
						dindx = 3;
						CASE(1 << 2) + 3 : u00 = u1;
						v00 = v1;
						dudy = 1;
						dindx = wrapin;
					DEFAULT:
						abort();
						u00 = v00 = dudy = dindx = 0;
					}

				for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
					bytein = bufin + u0 * 3 + v0 * wrapin;
					pixout = bufout + newx + y * wrapout;
					for (x = newx; x < newx + lx; x++) {
						*pixout++ = PIX_RGB16_FROM_BYTES(bytein[0], bytein[1], bytein[2]);
						bytein += dindx;
					}
				}
			}

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

			static void rop_zoom_out_90_rgb_rgb16(RASTER * rin, RASTER * rout,
												  int x1, int y1, int x2, int y2,
												  int newx, int newy,
												  int abs_zoom_level,
												  int mirror, int ninety)
			{
				UCHAR *bufin, *rowin, *pixin, *in;
				int tmp_r, tmp_g, tmp_b;
				USHORT *bufout, *rowout, *pixout;
				int wrapin_bytes, wrapin_pixels, wrapout;
				int u1, v1, u2, v2;
				int u, v, lu, lv, startu, startv;
				int p, q, lp, lq;
				int dudp, dvdp, dudq, dvdq, dindp, dindq;
				int plast, qlast, prest, qrest, i, j;
				int factor, fac_fac_2_bits;
				int fac_fac, qrest_fac, fac_prest, qrest_prest;
				int fac_fac_2, qrest_fac_2, fac_prest_2, qrest_prest_2;
				int fac_fac_4;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_zoom_out(rin, rout, x1, y1, x2, y2, newx, newy, abs_zoom_level);
					return;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lp = lv;
					lq = lu;
				} else {
					lp = lu;
					lq = lv;
				}
				factor = 1 << abs_zoom_level;
				prest = lp & (factor - 1);
				qrest = lq & (factor - 1);
				plast = lp - prest;
				qlast = lq - qrest;
				fac_fac = factor * factor;
				fac_fac_2 = fac_fac >> 1;
				fac_fac_4 = fac_fac >> 2;
				fac_fac_2_bits = 2 * abs_zoom_level - 1;
				qrest_fac = qrest * factor;
				qrest_fac_2 = qrest_fac >> 1;
				fac_prest = factor * prest;
				fac_prest_2 = fac_prest >> 1;
				qrest_prest = qrest * prest;
				qrest_prest_2 = qrest_prest >> 1;

				bufin = rin->buffer;
				wrapin_pixels = rin->wrap;
				wrapin_bytes = wrapin_pixels * 3;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : dudp = 1;
					dvdp = 0;
					dudq = 0;
					dvdq = 1;
					startu = u1;
					startv = v1;
					CASE(0 << 2) + 1 : dudp = 0;
					dvdp = -1;
					dudq = 1;
					dvdq = 0;
					startu = u1;
					startv = v2;
					CASE(0 << 2) + 2 : dudp = -1;
					dvdp = 0;
					dudq = 0;
					dvdq = -1;
					startu = u2;
					startv = v2;
					CASE(0 << 2) + 3 : dudp = 0;
					dvdp = 1;
					dudq = -1;
					dvdq = 0;
					startu = u2;
					startv = v1;
					CASE(1 << 2) + 0 : dudp = -1;
					dvdp = 0;
					dudq = 0;
					dvdq = 1;
					startu = u2;
					startv = v1;
					CASE(1 << 2) + 1 : dudp = 0;
					dvdp = -1;
					dudq = -1;
					dvdq = 0;
					startu = u2;
					startv = v2;
					CASE(1 << 2) + 2 : dudp = 1;
					dvdp = 0;
					dudq = 0;
					dvdq = -1;
					startu = u1;
					startv = v2;
					CASE(1 << 2) + 3 : dudp = 0;
					dvdp = 1;
					dudq = 1;
					dvdq = 0;
					startu = u1;
					startv = v1;
				DEFAULT:
					abort();
					dudp = dvdp = dudq = dvdq = startu = startv = 0;
				}
				dindp = (dudp + wrapin_pixels * dvdp) * 3;
				dindq = (dudq + wrapin_pixels * dvdq) * 3;

				rowin = (UCHAR *)rin->buffer + startu * 3 + startv * wrapin_bytes;
				rowout = (USHORT *)rout->buffer + newx + newy * wrapout;
				for (q = 0; q < qlast; q += factor) {
					pixin = rowin;
					pixout = rowout;
					for (p = 0; p < plast; p += factor) {
						tmp_r = tmp_g = tmp_b = 0;
						in = pixin;
						for (j = 0; j < factor; j += 2) {
							for (i = 0; i < factor; i += 2) {
								tmp_r += in[0];
								tmp_g += in[1];
								tmp_b += in[2];
								in += dindp + dindq;
								tmp_r += in[0];
								tmp_g += in[1];
								tmp_b += in[2];
								in += dindp - dindq;
							}
							in += 2 * dindq - factor * dindp;
						}
						tmp_r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
						tmp_g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
						tmp_b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
						*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
						pixin += factor * dindp;
					}
					if (prest) {
						tmp_r = tmp_g = tmp_b = 0;
						for (j = 0; j < factor; j++)
							for (i = 0; i < prest; i++) {
								tmp_r += pixin[i * dindp + j * dindq];
								tmp_g += pixin[i * dindp + j * dindq + 1];
								tmp_b += pixin[i * dindp + j * dindq + 2];
							}
						tmp_r = (tmp_r + fac_prest_2) / fac_prest;
						tmp_g = (tmp_g + fac_prest_2) / fac_prest;
						tmp_b = (tmp_b + fac_prest_2) / fac_prest;
						*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
					}
					rowin += factor * dindq;
					rowout += wrapout;
				}
				if (qrest) {
					pixin = rowin;
					pixout = rowout;
					for (p = 0; p < plast; p += factor) {
						tmp_r = tmp_g = tmp_b = 0;
						for (j = 0; j < qrest; j++)
							for (i = 0; i < factor; i++) {
								E 81 tmp_r += pixin[i * dindp + j * dindq];
								tmp_g += pixin[i * dindp + j * dindq + 1];
								tmp_b += pixin[i * dindp + j * dindq + 2];
							}
						tmp_r = (tmp_r + qrest_fac_2) / qrest_fac;
						tmp_g = (tmp_g + qrest_fac_2) / qrest_fac;
						tmp_b = (tmp_b + qrest_fac_2) / qrest_fac;
						*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
						pixin += factor * dindp;
					}
					if (prest) {
						tmp_r = tmp_g = tmp_b = 0;
						for (j = 0; j < qrest; j++)
							for (i = 0; i < prest; i++) {
								tmp_r += pixin[i * dindp + j * dindq];
								tmp_g += pixin[i * dindp + j * dindq + 1];
								tmp_b += pixin[i * dindp + j * dindq + 2];
							}
						tmp_r = (tmp_r + qrest_prest_2) / qrest_prest;
						tmp_g = (tmp_g + qrest_prest_2) / qrest_prest;
						tmp_b = (tmp_b + qrest_prest_2) / qrest_prest;
						*pixout++ = PIX_RGB16_FROM_BYTES(tmp_r, tmp_g, tmp_b);
					}
				}
			}

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

			E 63
E 57 static void rop_copy_90_rgb_rgbm(RASTER * rin, RASTER * rout,
										int x1, int y1, int x2, int y2,
										int newx, int newy,
										int mirror, int ninety)
			{
				UCHAR *bufin, *bytein, *appo;
				LPIXEL *bufout, *pixout, tmp;
				int wrapin, wrapout;
				int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
				int x, y, lx, ly;
				int u1, v1, u2, v2;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
					return;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				su = u2 - u1;
				sv = v2 - v1;
				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lx = lv;
					ly = lu;
				} else {
					lx = lu;
					ly = lv;
				}

				bufin = rin->buffer;
				wrapin = rin->wrap * 3; /* mi muovo di bytes */
				bufout = rout->buffer;
				wrapout = rout->wrap;

				dudy = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dvdy = 1;
					dindx = 3;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dindx = -wrapin;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dvdy = -1;
					dindx = -3;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dindx = wrapin;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dvdy = 1;
					dindx = -3;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dindx = -wrapin;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dvdy = -1;
					dindx = 3;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dindx = wrapin;
					D 78 DEFAULT : assert(FALSE);
					u00 = v00 = dudy = dindx = 0;
					E 78
I 78 DEFAULT : abort();
					u00 = v00 = dudy = dindx = 0;
					E 78
				}

				for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
					bytein = bufin + u0 * 3 + v0 * wrapin;
					pixout = bufout + newx + y * wrapout;
					for (x = newx; x < newx + lx; x++) {
						appo = bytein;
						tmp.r = *appo++;
						tmp.g = *appo++;
						tmp.b = *appo;
						tmp.m = 0xff;
						*pixout++ = tmp;
						bytein += dindx;
					}
				}
			}

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

			I 63 static void rop_zoom_out_90_rgb_rgbm(RASTER * rin, RASTER * rout,
													   int x1, int y1, int x2, int y2,
													   int newx, int newy,
													   int abs_zoom_level,
													   int mirror, int ninety)
			{
				UCHAR *bufin, *rowin, *pixin, *in;
				int tmp_r, tmp_g, tmp_b;
				LPIXEL *bufout, *rowout, *pixout, valout;
				int wrapin_bytes, wrapin_pixels, wrapout;
				int u1, v1, u2, v2;
				int u, v, lu, lv, startu, startv;
				int p, q, lp, lq;
				int dudp, dvdp, dudq, dvdq, dindp, dindq;
				int plast, qlast, prest, qrest, i, j;
				int factor, fac_fac_2_bits;
				int fac_fac, qrest_fac, fac_prest, qrest_prest;
				int fac_fac_2, qrest_fac_2, fac_prest_2, qrest_prest_2;
				int fac_fac_4;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_zoom_out(rin, rout, x1, y1, x2, y2, newx, newy, abs_zoom_level);
					return;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lp = lv;
					lq = lu;
				} else {
					lp = lu;
					lq = lv;
				}
				factor = 1 << abs_zoom_level;
				prest = lp & (factor - 1);
				qrest = lq & (factor - 1);
				plast = lp - prest;
				qlast = lq - qrest;
				fac_fac = factor * factor;
				fac_fac_2 = fac_fac >> 1;
				fac_fac_4 = fac_fac >> 2;
				fac_fac_2_bits = 2 * abs_zoom_level - 1;
				qrest_fac = qrest * factor;
				qrest_fac_2 = qrest_fac >> 1;
				fac_prest = factor * prest;
				fac_prest_2 = fac_prest >> 1;
				qrest_prest = qrest * prest;
				qrest_prest_2 = qrest_prest >> 1;

				bufin = rin->buffer;
				wrapin_pixels = rin->wrap;
				wrapin_bytes = wrapin_pixels * 3;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : dudp = 1;
					dvdp = 0;
					dudq = 0;
					dvdq = 1;
					startu = u1;
					startv = v1;
					CASE(0 << 2) + 1 : dudp = 0;
					dvdp = -1;
					dudq = 1;
					dvdq = 0;
					startu = u1;
					startv = v2;
					CASE(0 << 2) + 2 : dudp = -1;
					dvdp = 0;
					dudq = 0;
					dvdq = -1;
					startu = u2;
					startv = v2;
					CASE(0 << 2) + 3 : dudp = 0;
					dvdp = 1;
					dudq = -1;
					dvdq = 0;
					startu = u2;
					startv = v1;
					CASE(1 << 2) + 0 : dudp = -1;
					dvdp = 0;
					dudq = 0;
					dvdq = 1;
					startu = u2;
					startv = v1;
					CASE(1 << 2) + 1 : dudp = 0;
					dvdp = -1;
					dudq = -1;
					dvdq = 0;
					startu = u2;
					startv = v2;
					CASE(1 << 2) + 2 : dudp = 1;
					dvdp = 0;
					dudq = 0;
					dvdq = -1;
					startu = u1;
					startv = v2;
					CASE(1 << 2) + 3 : dudp = 0;
					dvdp = 1;
					dudq = 1;
					dvdq = 0;
					startu = u1;
					startv = v1;
				DEFAULT:
					D 78 assert(FALSE);
					dudp = dvdp = dudq = dvdq = startu = startv = 0;
					E 78
I 78 abort();
					dudp = dvdp = dudq = dvdq = startu = startv = 0;
					E 78
				}
				dindp = (dudp + wrapin_pixels * dvdp) * 3;
				dindq = (dudq + wrapin_pixels * dvdq) * 3;

				rowin = (UCHAR *)rin->buffer + startu * 3 + startv * wrapin_bytes;
				rowout = (LPIXEL *)rout->buffer + newx + newy * wrapout;
				valout.m = 0xff;
				for (q = 0; q < qlast; q += factor) {
					pixin = rowin;
					pixout = rowout;
					for (p = 0; p < plast; p += factor) {
						tmp_r = tmp_g = tmp_b = 0;
						in = pixin;
						for (j = 0; j < factor; j += 2) {
							for (i = 0; i < factor; i += 2) {
								tmp_r += in[0];
								tmp_g += in[1];
								tmp_b += in[2];
								in += dindp + dindq;
								tmp_r += in[0];
								tmp_g += in[1];
								tmp_b += in[2];
								in += dindp - dindq;
							}
							in += 2 * dindq - factor * dindp;
						}
						valout.r = (tmp_r + fac_fac_4) >> fac_fac_2_bits;
						valout.g = (tmp_g + fac_fac_4) >> fac_fac_2_bits;
						valout.b = (tmp_b + fac_fac_4) >> fac_fac_2_bits;
						*pixout++ = valout;
						pixin += factor * dindp;
					}
					if (prest) {
						tmp_r = tmp_g = tmp_b = 0;
						for (j = 0; j < factor; j++)
							for (i = 0; i < prest; i++) {
								tmp_r += pixin[i * dindp + j * dindq];
								tmp_g += pixin[i * dindp + j * dindq + 1];
								tmp_b += pixin[i * dindp + j * dindq + 2];
							}
						valout.r = (tmp_r + fac_prest_2) / fac_prest;
						valout.g = (tmp_g + fac_prest_2) / fac_prest;
						valout.b = (tmp_b + fac_prest_2) / fac_prest;
						*pixout++ = valout;
					}
					rowin += factor * dindq;
					rowout += wrapout;
				}
				if (qrest) {
					pixin = rowin;
					pixout = rowout;
					for (p = 0; p < plast; p += factor) {
						tmp_r = tmp_g = tmp_b = 0;
						for (j = 0; j < qrest; j++)
							for (i = 0; i < factor; i++) {
								tmp_r += pixin[i * dindp + j * dindq];
								tmp_g += pixin[i * dindp + j * dindq + 1];
								tmp_b += pixin[i * dindp + j * dindq + 2];
							}
						valout.r = (tmp_r + qrest_fac_2) / qrest_fac;
						valout.g = (tmp_g + qrest_fac_2) / qrest_fac;
						valout.b = (tmp_b + qrest_fac_2) / qrest_fac;
						*pixout++ = valout;
						pixin += factor * dindp;
					}
					if (prest) {
						tmp_r = tmp_g = tmp_b = 0;
						for (j = 0; j < qrest; j++)
							for (i = 0; i < prest; i++) {
								tmp_r += pixin[i * dindp + j * dindq];
								tmp_g += pixin[i * dindp + j * dindq + 1];
								tmp_b += pixin[i * dindp + j * dindq + 2];
							}
						valout.r = (tmp_r + qrest_prest_2) / qrest_prest;
						valout.g = (tmp_g + qrest_prest_2) / qrest_prest;
						valout.b = (tmp_b + qrest_prest_2) / qrest_prest;
						*pixout++ = valout;
					}
				}
			}

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

			E 63 static void rop_copy_90_bw_gr8(RASTER * rin, RASTER * rout,
												 int x1, int y1, int x2, int y2,
E 56 int newx, int newy,
												 int mirror, int ninety)
			{
				UCHAR *bufin, *bufout, *bytein, *byteout;
				int bytewrapin, bitoffsin, wrapout;
				int value_for_0, value_for_1;
				int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudy, dvdy, dudx, dvdx;
				int x, y, lx, ly;
				int u1, v1, u2, v2;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
					return;
					E 55
				}

				switch (rin->type) {
					CASE RAS_WB : value_for_0 = 255;
					value_for_1 = 0;
					CASE RAS_BW : value_for_0 = 0;
					value_for_1 = 255;
				DEFAULT:
					printf("bad raster type in rop_copy_90_bw_gr8\n");
					return;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				su = u2 - u1;
				sv = v2 - v1;
				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lx = lv;
					ly = lu;
				} else {
					lx = lu;
					ly = lv;
				}

				bufin = rin->buffer;
				D 47 bytewrapin = (rin->wrap + 7) / 8;
				E 47
I 47 bytewrapin = (rin->wrap + 7) >> 3;
				E 47 bitoffsin = rin->bit_offs;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				dudx = 0;
				dudy = 0;
				dvdx = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dudx = 1;
					dvdy = 1;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dvdx = -1;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dudx = -1;
					dvdy = -1;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dvdx = 1;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dudx = -1;
					dvdy = 1;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dvdx = -1;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dudx = 1;
					dvdy = -1;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dvdx = 1;
					I 50
D 78 DEFAULT : assert(FALSE);
					u00 = v00 = dudy = dvdx = 0;
					E 78
I 78 DEFAULT : abort();
					u00 = v00 = dudy = dvdx = 0;
					E 78
E 50
				}

				if (dudx)
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++) {
						u = u0;
						v = v0;
						byteout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; u += dudx, x++) {
							if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*byteout++ = value_for_1;
							else
								*byteout++ = value_for_0;
						}
					}
				else
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++) {
						u = u0;
						v = v0;
						byteout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; v += dvdx, x++) {
							if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*byteout++ = value_for_1;
							else
								*byteout++ = value_for_0;
							I 21
						}
					}
				D 55

#ifdef DEBUG
					STW_STOP(0)
						STW_PRINT(stdout)
#endif
E 55
			}

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

			static void rop_copy_90_bw_cm16(RASTER * rin, RASTER * rout,
											int x1, int y1, int x2, int y2,
											int newx, int newy,
											int mirror, int ninety)
			{
				UCHAR *bufin, *bytein;
				USHORT *bufout, *pixout;
				LPIXEL *cmap;
				int bytewrapin, bitoffsin, wrapout, cmap_offset;
				USHORT value_for_0, value_for_1, value_tmp;
				int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudy, dvdy, dudx, dvdx;
				int x, y, lx, ly;
				int u1, v1, u2, v2;

				D 55
#ifdef DEBUG
					STW_INIT(0, "rop_copy_90_bw_gr8")
						STW_START(0)
#endif

E 55 mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
					return;
				}
				D 84 if (!rout->cmap.buffer)
				{
					msg(MSG_IE, "rop_copy_90_bw_cm16: missing color map");
					return;
				}
				E 84 cmap = rout->cmap.buffer;
				D 56 cmap_offset = rout->cmap.offset;
				E 56
I 56 cmap_offset = rout->cmap.info.offset_mask;
				E 56 if (cmap[0].r == 0)
				{
					value_for_0 = cmap_offset;
					value_for_1 = cmap_offset + 255;
				}
				else
				{
					value_for_0 = cmap_offset + 255;
					value_for_1 = cmap_offset;
				}
				if (rin->type == RAS_WB) {
					value_tmp = value_for_0;
					value_for_0 = value_for_1;
					value_for_1 = value_tmp;
					I 22
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				su = u2 - u1;
				sv = v2 - v1;
				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lx = lv;
					ly = lu;
				} else {
					lx = lu;
					ly = lv;
				}

				bufin = rin->buffer;
				D 47 bytewrapin = (rin->wrap + 7) / 8;
				E 47
I 47 bytewrapin = (rin->wrap + 7) >> 3;
				E 47 bitoffsin = rin->bit_offs;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				dudx = 0;
				dudy = 0;
				dvdx = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dudx = 1;
					dvdy = 1;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dvdx = -1;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dudx = -1;
					dvdy = -1;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dvdx = 1;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dudx = -1;
					dvdy = 1;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dvdx = -1;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dudx = 1;
					dvdy = -1;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dvdx = 1;
					I 50
D 78 DEFAULT : assert(FALSE);
					u00 = v00 = dudy = dvdx = 0;
					E 78
I 78 DEFAULT : abort();
					u00 = v00 = dudy = dvdx = 0;
					E 78
E 50
				}

				if (dudx)
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++) {
						u = u0;
						v = v0;
						pixout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; u += dudx, x++) {
							if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*pixout++ = value_for_1;
							else
								*pixout++ = value_for_0;
						}
					}
				else
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++) {
						u = u0;
						v = v0;
						pixout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; v += dvdx, x++) {
							if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*pixout++ = value_for_1;
							else
								*pixout++ = value_for_0;
						}
					}
				I 55
			}

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

			I 84 static void rop_copy_90_bw_cm24(RASTER * rin, RASTER * rout,
												  int x1, int y1, int x2, int y2,
												  int newx, int newy,
												  int mirror, int ninety)
			{
				UCHAR *bufin, *bytein;
				ULONG *bufout, *pixout;
				LPIXEL *penmap, *colmap;
				int bytewrapin, bitoffsin, wrapout;
				ULONG value_for_0, value_for_1, value_tmp;
				int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudy, dvdy, dudx, dvdx;
				int x, y, lx, ly;
				int u1, v1, u2, v2;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
					return;
				}
				penmap = rout->cmap.penbuffer;
				colmap = rout->cmap.colbuffer;
				if (penmap[0].r + colmap[0].r == 0) {
					value_for_0 = 0;
					value_for_1 = 255;
				} else {
					value_for_0 = 255;
					value_for_1 = 0;
				}
				if (rin->type == RAS_WB) {
					value_tmp = value_for_0;
					value_for_0 = value_for_1;
					value_for_1 = value_tmp;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				su = u2 - u1;
				sv = v2 - v1;
				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lx = lv;
					ly = lu;
				} else {
					lx = lu;
					ly = lv;
				}

				bufin = rin->buffer;
				bytewrapin = (rin->wrap + 7) >> 3;
				bitoffsin = rin->bit_offs;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				dudx = 0;
				dudy = 0;
				dvdx = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dudx = 1;
					dvdy = 1;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dvdx = -1;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dudx = -1;
					dvdy = -1;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dvdx = 1;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dudx = -1;
					dvdy = 1;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dvdx = -1;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dudx = 1;
					dvdy = -1;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dvdx = 1;
				DEFAULT:
					abort();
					u00 = v00 = dudy = dvdx = 0;
				}

				if (dudx)
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++) {
						u = u0;
						v = v0;
						pixout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; u += dudx, x++) {
							if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*pixout++ = value_for_1;
							else
								*pixout++ = value_for_0;
						}
					}
				else
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++) {
						u = u0;
						v = v0;
						pixout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; v += dvdx, x++) {
							if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*pixout++ = value_for_1;
							else
								*pixout++ = value_for_0;
						}
					}
			}

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

			E 84 static void rop_copy_90_bw_rgb16(RASTER * rin, RASTER * rout,
												   int x1, int y1, int x2, int y2,
												   int newx, int newy,
												   int mirror, int ninety)
			{
				UCHAR *bufin, *bytein;
				USHORT *bufout, *pixout;
				int bytewrapin, bitoffsin, wrapout;
				USHORT value_for_0, value_for_1;
				int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudy, dvdy, dudx, dvdx;
				int x, y, lx, ly;
				int u1, v1, u2, v2;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
					return;
				}

				switch (rin->type) {
					CASE RAS_WB : value_for_0 = 0xffff;
					value_for_1 = 0x0000;
					CASE RAS_BW : value_for_0 = 0x0000;
					value_for_1 = 0xffff;
				DEFAULT:
					printf("bad raster type in rop_copy_90_bw_rgb16\n");
					return;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				su = u2 - u1;
				sv = v2 - v1;
				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lx = lv;
					ly = lu;
				} else {
					lx = lu;
					ly = lv;
				}

				bufin = rin->buffer;
				bytewrapin = (rin->wrap + 7) >> 3;
				bitoffsin = rin->bit_offs;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				dudx = 0;
				dudy = 0;
				dvdx = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dudx = 1;
					dvdy = 1;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dvdx = -1;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dudx = -1;
					dvdy = -1;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dvdx = 1;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dudx = -1;
					dvdy = 1;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dvdx = -1;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dudx = 1;
					dvdy = -1;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dvdx = 1;
					D 78 DEFAULT : assert(FALSE);
					u00 = v00 = dudy = dvdx = 0;
					E 78
I 78 DEFAULT : abort();
					u00 = v00 = dudy = dvdx = 0;
					E 78
				}
				E 55

D 55
#ifdef DEBUG
					STW_STOP(0)
						STW_PRINT(stdout)
#endif
E 55
I 55 if (dudx) for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++)
				{
					u = u0;
					v = v0;
					pixout = bufout + newx + y * wrapout;
					for (x = newx; x < newx + lx; u += dudx, x++) {
						if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
							*pixout++ = value_for_1;
						else
							*pixout++ = value_for_0;
					}
				}
				else for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++)
				{
					u = u0;
					v = v0;
					pixout = bufout + newx + y * wrapout;
					for (x = newx; x < newx + lx; v += dvdx, x++) {
						if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
							*pixout++ = value_for_1;
						else
							*pixout++ = value_for_0;
					}
				}
				E 55
			}

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

			static void rop_copy_90_bw_rgbm(RASTER * rin, RASTER * rout,
											int x1, int y1, int x2, int y2,
											int newx, int newy,
D 52 int mirror, int ninety)
			{
				UCHAR *bufin, *bytein;
				LPIXEL *bufout, *pixout;
				int bytewrapin, bitoffsin, wrapout;
				LPIXEL value_for_0, value_for_1;
				int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudy, dvdy, dudx, dvdx;
				int x, y, lx, ly;
				int u1, v1, u2, v2;

#ifdef DEBUG
				STW_INIT(0, "rop_copy_90_bw_gr8")
				STW_START(0)
#endif

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
					return;
				}

				switch (rin->type) {
					CASE RAS_WB : value_for_0.r = 255;
					value_for_0.g = 255;
					value_for_0.b = 255;
					value_for_0.m = 255;
					value_for_1.r = 0;
					value_for_1.g = 0;
					value_for_1.b = 0;
					value_for_1.m = 255;
					CASE RAS_BW : value_for_0.r = 0;
					value_for_0.g = 0;
					value_for_0.b = 0;
					value_for_0.m = 255;
					value_for_1.r = 255;
					value_for_1.g = 255;
					value_for_1.b = 255;
					value_for_1.m = 255;
				DEFAULT:
					printf("bad raster type in rop_copy_90_bw_rgbm\n");
					return;
					E 22
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				su = u2 - u1;
				sv = v2 - v1;
				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lx = lv;
					ly = lu;
				} else {
					lx = lu;
					ly = lv;
				}

				bufin = rin->buffer;
				D 47 bytewrapin = (rin->wrap + 7) / 8;
				E 47
I 47 bytewrapin = (rin->wrap + 7) >> 3;
				E 47 bitoffsin = rin->bit_offs;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				dudx = 0;
				dudy = 0;
				dvdx = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dudx = 1;
					dvdy = 1;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dvdx = -1;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dudx = -1;
					dvdy = -1;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dvdx = 1;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dudx = -1;
					dvdy = 1;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dvdx = -1;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dudx = 1;
					dvdy = -1;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dvdx = 1;
					I 50 DEFAULT : assert(FALSE);
					u00 = v00 = dudy = dvdx = 0;
					E 50
				}

				if (dudx)
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++) {
						u = u0;
						v = v0;
						pixout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; u += dudx, x++) {
							if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*pixout++ = value_for_1;
							else
								*pixout++ = value_for_0;
						}
					}
				else
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++) {
						u = u0;
						v = v0;
						pixout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; v += dvdx, x++) {
							if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*pixout++ = value_for_1;
							else
								*pixout++ = value_for_0;
							E 21
						}
					}
				E 17

#ifdef DEBUG
					STW_STOP(0)
						STW_PRINT(stdout)
#endif
I 26
			}

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

			static void rop_copy_90_rgbm(RASTER * rin, RASTER * rout,
										 int x1, int y1, int x2, int y2,
										 int newx, int newy,
										 int mirror, int ninety)
			{
				LPIXEL *bufin, *pixin;
				LPIXEL *bufout, *pixout;
				int wrapin, wrapout;
				int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
				int x, y, lx, ly;
				int u1, v1, u2, v2;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
					return;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				su = u2 - u1;
				sv = v2 - v1;
				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lx = lv;
					ly = lu;
				} else {
					lx = lu;
					ly = lv;
				}

				bufin = rin->buffer;
				wrapin = rin->wrap;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				dudy = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dvdy = 1;
					dindx = 1;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dindx = -wrapin;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dvdy = -1;
					dindx = -1;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dindx = wrapin;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dvdy = 1;
					dindx = -1;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dindx = -wrapin;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dvdy = -1;
					dindx = 1;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dindx = wrapin;
					I 50 DEFAULT : assert(FALSE);
					u00 = v00 = dudy = dindx = 0;
					E 50
				}

				for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
					pixin = bufin + u0 + v0 * wrapin;
					pixout = bufout + newx + y * wrapout;
					for (x = newx; x < newx + lx; x++) {
						*pixout++ = *pixin;
						pixin += dindx;
					}
				}
				E 26
E 14
			}

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

			E 6 void rop_clear(RASTER * r, int x1, int y1, int x2, int y2)
			{
				D 13 char *pix;
				E 13
I 13 UCHAR *pix;
				E 13 int l, x, y, tmp, rowsize, wrap, pixbits;

				if (x1 > x2) {
					tmp = x1;
					x1 = x2;
					x2 = tmp;
				}
				if (y1 > y2) {
					tmp = y1;
					y1 = y2;
					y2 = tmp;
				}

				/* controllo gli sconfinamenti */
				if (x1 < 0 || y1 < 0 || x2 - x1 >= r->lx || y2 - y1 >= r->ly) {
					printf("### INTERNAL ERROR - rop_clear; access violation\n");
					return;
				}

				pixbits = rop_pixbits(r->type);

				/* per adesso niente pixel non multipli di 8 bits */
				D 2 if (pixbits & 7)
E 2
I 2 if (rop_fillerbits(r->type))
E 2
				{
					printf("### INTERNAL ERROR - rop_clear; byte fraction pixels\n");
					return;
				}

				wrap = (r->wrap * pixbits) >> 3;
				rowsize = ((x2 - x1 + 1) * pixbits) >> 3;
				D 10 pix = (char *)r->buffer + (((x1 + y1 * r->wrap) * pixbits) >> 3);
				E 10
I 10 pix = (UCHAR *)r->buffer + (((x1 + y1 * r->wrap) * pixbits) >> 3);
				E 10 l = y2 - y1 + 1;
				while (l-- > 0) {
					memset(pix, 0, rowsize);
					pix += wrap;
				}
			}

			D 6

E 6
				/*---------------------------------------------------------------------------*/
I 6

I 25 void rop_add_white_to_cmap(RASTER * ras)
			{
				int i;
				UCHAR m, white;

				for (i = 0; i < ras->cmap.size; i++) {
					m = ras->cmap.buffer[i].m;
					if (ras->cmap.buffer[i].r > m ||
						ras->cmap.buffer[i].g > m ||
						ras->cmap.buffer[i].b > m)
						break;
					white = (UCHAR)255 - m;
					ras->cmap.buffer[i].r += white;
					ras->cmap.buffer[i].g += white;
					ras->cmap.buffer[i].b += white;
				}
				if (i < ras->cmap.size)
					fprintf(stderr, "\7add_white: cmap is not premultiplied\n");
			}

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

			void rop_remove_white_from_cmap(RASTER * ras)
			{
				int i;
				UCHAR m, white;

				for (i = 0; i < ras->cmap.size; i++) {
					m = ras->cmap.buffer[i].m;
					white = (UCHAR)255 - m;
					ras->cmap.buffer[i].r -= white;
					ras->cmap.buffer[i].g -= white;
					ras->cmap.buffer[i].b -= white;
					if (ras->cmap.buffer[i].r > m ||
						ras->cmap.buffer[i].g > m ||
						ras->cmap.buffer[i].b > m)
						break;
				}
				if (i < ras->cmap.size)
					fprintf(stderr, "\7remove_white: cmap is not premultiplied\n");
				I 32
			}

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

			static LPIXEL premult_lpixel(LPIXEL lpixel)
			{
				int m;
				LPIXEL new_lpixel;

				m = lpixel.m;
				if (m == 255)
					return lpixel;
				else if (m == 0) {
					new_lpixel.r = 0;
					new_lpixel.g = 0;
					new_lpixel.b = 0;
					new_lpixel.m = 0;
				} else {
					new_lpixel.r = (lpixel.r * m + 127) / 255;
					new_lpixel.g = (lpixel.g * m + 127) / 255;
					new_lpixel.b = (lpixel.b * m + 127) / 255;
					new_lpixel.m = m;
				}
				return new_lpixel;
			}

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

			static LPIXEL unpremult_lpixel(LPIXEL lpixel)
			{
				int m, m_2;
				LPIXEL new_lpixel;

				m = lpixel.m;
				if (m == 255)
					return lpixel;
				else if (m == 0) {
					new_lpixel.r = 255;
					new_lpixel.g = 255;
					new_lpixel.b = 255;
					new_lpixel.m = 0;
					D 51
				}
				E 51
I 51
			}
			E 51 else
			{
				m_2 = m >> 1;
				new_lpixel.r = (lpixel.r * 255 + m_2) / m;
				new_lpixel.g = (lpixel.g * 255 + m_2) / m;
				new_lpixel.b = (lpixel.b * 255 + m_2) / m;
E 52
I 52
		                int mirror, int ninety)
{
	UCHAR *bufin, *bytein;
	LPIXEL *bufout, *pixout;
	int bytewrapin, bitoffsin, wrapout;
	LPIXEL value_for_0, value_for_1;
	int u, v, lu, lv, su, sv, u00, v00, u0, v0, dudy, dvdy, dudx, dvdx;
	int x, y, lx, ly;
	int u1, v1, u2, v2;

	D 55
#ifdef DEBUG
		STW_INIT(0, "rop_copy_90_bw_gr8")
			STW_START(0)
#endif

E 55 mirror &= 1;
	ninety &= 3;

	if (!ninety && !mirror) {
		rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
		return;
	}

	switch (rin->type) {
		CASE RAS_WB : value_for_0.r = 255;
		value_for_0.g = 255;
		value_for_0.b = 255;
		value_for_0.m = 255;
		value_for_1.r = 0;
		value_for_1.g = 0;
		value_for_1.b = 0;
		value_for_1.m = 255;
		CASE RAS_BW : value_for_0.r = 0;
		value_for_0.g = 0;
		value_for_0.b = 0;
		value_for_0.m = 255;
		value_for_1.r = 255;
		value_for_1.g = 255;
		value_for_1.b = 255;
		value_for_1.m = 255;
	DEFAULT:
		printf("bad raster type in rop_copy_90_bw_rgbm\n");
		return;
	}

	u1 = x1;
	v1 = y1;
	u2 = x2;
	v2 = y2;

	su = u2 - u1;
	sv = v2 - v1;
	lu = u2 - u1 + 1;
	lv = v2 - v1 + 1;

	if (ninety & 1) {
		lx = lv;
		ly = lu;
	} else {
		lx = lu;
		ly = lv;
	}
	D 53

		bufin = rin->buffer;
	bytewrapin = (rin->wrap + 7) >> 3;
	bitoffsin = rin->bit_offs;
	bufout = rout->buffer;
	wrapout = rout->wrap;

	dudx = 0;
	dudy = 0;
	dvdx = 0;
	dvdy = 0;

	switch ((mirror << 2) + ninety) {
		CASE(0 << 2) + 0 : u00 = u1;
		v00 = v1;
		dudx = 1;
		dvdy = 1;
		CASE(0 << 2) + 1 : u00 = u1;
		v00 = v1 + sv;
		dudy = 1;
		dvdx = -1;
		CASE(0 << 2) + 2 : u00 = u1 + su;
		v00 = v1 + sv;
		dudx = -1;
		dvdy = -1;
		CASE(0 << 2) + 3 : u00 = u1 + su;
		v00 = v1;
		dudy = -1;
		dvdx = 1;
		CASE(1 << 2) + 0 : u00 = u1 + su;
		v00 = v1;
		dudx = -1;
		dvdy = 1;
		CASE(1 << 2) + 1 : u00 = u1 + su;
		v00 = v1 + sv;
		dudy = -1;
		dvdx = -1;
		CASE(1 << 2) + 2 : u00 = u1;
		v00 = v1 + sv;
		dudx = 1;
		dvdy = -1;
		CASE(1 << 2) + 3 : u00 = u1;
		v00 = v1;
		dudy = 1;
		dvdx = 1;
	DEFAULT:
		assert(FALSE);
		u00 = v00 = dudy = dvdx = 0;
	}

	if (dudx)
		for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++) {
			u = u0;
			v = v0;
			pixout = bufout + newx + y * wrapout;
			for (x = newx; x < newx + lx; u += dudx, x++) {
				if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
					*pixout++ = value_for_1;
				else
					*pixout++ = value_for_0;
			}
		}
	else
		for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++) {
			u = u0;
			v = v0;
			pixout = bufout + newx + y * wrapout;
			for (x = newx; x < newx + lx; v += dvdx, x++) {
				E 53
I 53

					bufin = rin->buffer;
				bytewrapin = (rin->wrap + 7) >> 3;
				bitoffsin = rin->bit_offs;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				dudx = 0;
				dudy = 0;
				dvdx = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dudx = 1;
					dvdy = 1;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dvdx = -1;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dudx = -1;
					dvdy = -1;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dvdx = 1;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dudx = -1;
					dvdy = 1;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dvdx = -1;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dudx = 1;
					dvdy = -1;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dvdx = 1;
					D 78 DEFAULT : assert(FALSE);
					u00 = v00 = dudy = dvdx = 0;
					E 78
I 78 DEFAULT : abort();
					u00 = v00 = dudy = dvdx = 0;
					E 78
				}

				if (dudx)
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; v0 += dvdy, y++) {
						u = u0;
						v = v0;
						pixout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; u += dudx, x++) {
							if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*pixout++ = value_for_1;
							else
								*pixout++ = value_for_0;
						}
					}
				else
					for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, y++) {
						u = u0;
						v = v0;
						pixout = bufout + newx + y * wrapout;
						for (x = newx; x < newx + lx; v += dvdx, x++) {
							E 53 if (GET_BIT(u, v, bufin, bytewrapin, bitoffsin))
								*pixout++ = value_for_1;
							else
								*pixout++ = value_for_0;
						}
					}
				D 55

#ifdef DEBUG
					STW_STOP(0)
						STW_PRINT(stdout)
#endif
E 55
			}

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

			I 62 static void rop_zoom_out_90_bw_rgbm(RASTER * rin, RASTER * rout,
													  int x1, int y1, int x2, int y2,
													  int newx, int newy,
													  int abs_zoom_level,
													  int mirror, int ninety)
			{
				UCHAR *bufin;
				int val_0, val_1, tmp;
				LPIXEL *bufout, *rowout, *pixout, valout;
				int bitrowin, bytewrapin, bitwrapin, wrapout, bitin, bit, bit_offs, startbit;
				int u1, v1, u2, v2;
				int u, v, lu, lv, startu, startv;
				int p, q, lp, lq, s, t; /* s=p+q, t=p-q */
				int dudp, dvdp, dudq, dvdq;
				int dinbitsdp, dinbitsdq, dinbitsds, dinbitsdt;
				int plast, qlast, prest, qrest, i, j;
				int factor, fac_fac_2_bits;
				int fac_fac, qrest_fac, fac_prest, qrest_prest;
				int fac_fac_2, qrest_fac_2, fac_prest_2, qrest_prest_2;
				int fac_fac_4;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_zoom_out(rin, rout, x1, y1, x2, y2, newx, newy, abs_zoom_level);
					return;
				}

				if (rin->type == RAS_WB) {
					val_0 = 0xff;
					val_1 = 0x00;
				} else {
					val_0 = 0x00;
					val_1 = 0xff;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lp = lv;
					lq = lu;
				} else {
					lp = lu;
					lq = lv;
				}
				factor = 1 << abs_zoom_level;
				prest = lp & (factor - 1);
				qrest = lq & (factor - 1);
				plast = lp - prest;
				qlast = lq - qrest;
				fac_fac = factor * factor;
				fac_fac_2 = fac_fac >> 1;
				fac_fac_4 = fac_fac >> 2;
				fac_fac_2_bits = 2 * abs_zoom_level - 1;
				qrest_fac = qrest * factor;
				qrest_fac_2 = qrest_fac >> 1;
				fac_prest = factor * prest;
				fac_prest_2 = fac_prest >> 1;
				qrest_prest = qrest * prest;
				qrest_prest_2 = qrest_prest >> 1;

				bufin = rin->buffer;
				bytewrapin = (rin->wrap + 7) >> 3;
				bitwrapin = bytewrapin << 3;
				bit_offs = rin->bit_offs;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : dudp = 1;
					dvdp = 0;
					dudq = 0;
					dvdq = 1;
					startu = u1;
					startv = v1;
					CASE(0 << 2) + 1 : dudp = 0;
					dvdp = -1;
					dudq = 1;
					dvdq = 0;
					startu = u1;
					startv = v2;
					CASE(0 << 2) + 2 : dudp = -1;
					dvdp = 0;
					dudq = 0;
					dvdq = -1;
					startu = u2;
					startv = v2;
					CASE(0 << 2) + 3 : dudp = 0;
					dvdp = 1;
					dudq = -1;
					dvdq = 0;
					startu = u2;
					startv = v1;
					CASE(1 << 2) + 0 : dudp = -1;
					dvdp = 0;
					dudq = 0;
					dvdq = 1;
					startu = u2;
					startv = v1;
					CASE(1 << 2) + 1 : dudp = 0;
					dvdp = -1;
					dudq = -1;
					dvdq = 0;
					startu = u2;
					startv = v2;
					CASE(1 << 2) + 2 : dudp = 1;
					dvdp = 0;
					dudq = 0;
					dvdq = -1;
					startu = u1;
					startv = v2;
					CASE(1 << 2) + 3 : dudp = 0;
					dvdp = 1;
					dudq = 1;
					dvdq = 0;
					startu = u1;
					startv = v1;
				DEFAULT:
					D 78 assert(FALSE);
					dudp = dvdp = dudq = dvdq = startu = startv = 0;
					E 78
I 78 abort();
					dudp = dvdp = dudq = dvdq = startu = startv = 0;
					E 78
				}

				dinbitsdp = dudp + bitwrapin * dvdp;
				dinbitsdq = dudq + bitwrapin * dvdq;
				dinbitsds = dinbitsdp + dinbitsdq;
				dinbitsdt = dinbitsdp - dinbitsdq;

				bitrowin = bit_offs + startu + startv * bitwrapin;
				rowout = (LPIXEL *)rout->buffer + newx + newy * wrapout;
				valout.m = 0xff;
				for (q = 0; q < qlast; q += factor) {
					bitin = bitrowin;
					pixout = rowout;
					for (p = 0; p < plast; p += factor) {
						tmp = 0;
						bit = bitin;
						for (j = 0; j < factor; j += 2) {
							for (i = 0; i < factor; i += 2) {
								tmp += GET_BWBIT(bit, bufin);
								bit += dinbitsds;
								tmp += GET_BWBIT(bit, bufin);
								bit += dinbitsdt;
							}
							bit += 2 * dinbitsdq - factor * dinbitsdp;
						}
						tmp = tmp * val_1 + (fac_fac_2 - tmp) * val_0;
						tmp = (tmp + fac_fac_4) >> fac_fac_2_bits;
						valout.r = valout.g = valout.b = tmp;
						*pixout++ = valout;
						bitin += factor * dinbitsdp;
					}
					if (prest) {
						tmp = 0;
						for (j = 0; j < factor; j++)
							for (i = 0; i < prest; i++) {
								tmp += GET_BWBIT(bitin + i * dinbitsdp + j * dinbitsdq, bufin);
							}
						tmp = tmp * val_1 + (fac_prest - tmp) * val_0;
						tmp = (tmp + fac_prest_2) / fac_prest;
						valout.r = valout.g = valout.b = tmp;
						*pixout++ = valout;
					}
					bitrowin += factor * dinbitsdq;
					rowout += wrapout;
				}
				if (qrest) {
					bitin = bitrowin;
					pixout = rowout;
					for (p = 0; p < plast; p += factor) {
						tmp = 0;
						for (j = 0; j < qrest; j++)
							for (i = 0; i < factor; i++) {
								tmp += GET_BWBIT(bitin + i * dinbitsdp + j * dinbitsdq, bufin);
							}
						tmp = tmp * val_1 + (qrest_fac - tmp) * val_0;
						tmp = (tmp + qrest_fac_2) / qrest_fac;
						valout.r = valout.g = valout.b = tmp;
						*pixout++ = valout;
						bitin += factor * dinbitsdp;
					}
					if (prest) {
						tmp = 0;
						for (j = 0; j < qrest; j++)
							for (i = 0; i < prest; i++) {
								tmp += GET_BWBIT(bitin + i * dinbitsdp + j * dinbitsdq, bufin);
							}
						tmp = tmp * val_1 + (qrest_prest - tmp) * val_0;
						tmp = (tmp + qrest_prest_2) / qrest_prest;
						valout.r = valout.g = valout.b = tmp;
						*pixout++ = valout;
					}
				}
			}

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

			static void rop_zoom_out_90_bw_rgb16(RASTER * rin, RASTER * rout,
												 int x1, int y1, int x2, int y2,
												 int newx, int newy,
												 int abs_zoom_level,
												 int mirror, int ninety)
			{
				UCHAR *bufin;
				int val_0, val_1, tmp;
				USHORT *bufout, *rowout, *pixout;
				int bitrowin, bytewrapin, bitwrapin, wrapout, bitin, bit, bit_offs, startbit;
				int u1, v1, u2, v2;
				int u, v, lu, lv, startu, startv;
				int p, q, lp, lq, s, t; /* s=p+q, t=p-q */
				int dudp, dvdp, dudq, dvdq;
				int dinbitsdp, dinbitsdq, dinbitsds, dinbitsdt;
				int plast, qlast, prest, qrest, i, j;
				int factor, fac_fac_2_bits;
				int fac_fac, qrest_fac, fac_prest, qrest_prest;
				int fac_fac_2, qrest_fac_2, fac_prest_2, qrest_prest_2;
				int fac_fac_4;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_zoom_out(rin, rout, x1, y1, x2, y2, newx, newy, abs_zoom_level);
					return;
				}

				if (rin->type == RAS_WB) {
					val_0 = 0xff;
					val_1 = 0x00;
				} else {
					val_0 = 0x00;
					val_1 = 0xff;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lp = lv;
					lq = lu;
				} else {
					lp = lu;
					lq = lv;
				}
				factor = 1 << abs_zoom_level;
				prest = lp & (factor - 1);
				qrest = lq & (factor - 1);
				plast = lp - prest;
				qlast = lq - qrest;
				fac_fac = factor * factor;
				fac_fac_2 = fac_fac >> 1;
				fac_fac_4 = fac_fac >> 2;
				fac_fac_2_bits = 2 * abs_zoom_level - 1;
				qrest_fac = qrest * factor;
				qrest_fac_2 = qrest_fac >> 1;
				fac_prest = factor * prest;
				fac_prest_2 = fac_prest >> 1;
				qrest_prest = qrest * prest;
				qrest_prest_2 = qrest_prest >> 1;

				bufin = rin->buffer;
				bytewrapin = (rin->wrap + 7) >> 3;
				bitwrapin = bytewrapin << 3;
				bit_offs = rin->bit_offs;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : dudp = 1;
					dvdp = 0;
					dudq = 0;
					dvdq = 1;
					startu = u1;
					startv = v1;
					CASE(0 << 2) + 1 : dudp = 0;
					dvdp = -1;
					dudq = 1;
					dvdq = 0;
					startu = u1;
					startv = v2;
					CASE(0 << 2) + 2 : dudp = -1;
					dvdp = 0;
					dudq = 0;
					dvdq = -1;
					startu = u2;
					startv = v2;
					CASE(0 << 2) + 3 : dudp = 0;
					dvdp = 1;
					dudq = -1;
					dvdq = 0;
					startu = u2;
					startv = v1;
					CASE(1 << 2) + 0 : dudp = -1;
					dvdp = 0;
					dudq = 0;
					dvdq = 1;
					startu = u2;
					startv = v1;
					CASE(1 << 2) + 1 : dudp = 0;
					dvdp = -1;
					dudq = -1;
					dvdq = 0;
					startu = u2;
					startv = v2;
					CASE(1 << 2) + 2 : dudp = 1;
					dvdp = 0;
					dudq = 0;
					dvdq = -1;
					startu = u1;
					startv = v2;
					CASE(1 << 2) + 3 : dudp = 0;
					dvdp = 1;
					dudq = 1;
					dvdq = 0;
					startu = u1;
					startv = v1;
				DEFAULT:
					D 78 assert(FALSE);
					dudp = dvdp = dudq = dvdq = startu = startv = 0;
					E 78
I 78 abort();
					dudp = dvdp = dudq = dvdq = startu = startv = 0;
					E 78
				}

				dinbitsdp = dudp + bitwrapin * dvdp;
				dinbitsdq = dudq + bitwrapin * dvdq;
				dinbitsds = dinbitsdp + dinbitsdq;
				dinbitsdt = dinbitsdp - dinbitsdq;

				bitrowin = bit_offs + startu + startv * bitwrapin;
				rowout = (USHORT *)rout->buffer + newx + newy * wrapout;
				for (q = 0; q < qlast; q += factor) {
					bitin = bitrowin;
					pixout = rowout;
					for (p = 0; p < plast; p += factor) {
						tmp = 0;
						bit = bitin;
						for (j = 0; j < factor; j += 2) {
							for (i = 0; i < factor; i += 2) {
								tmp += GET_BWBIT(bit, bufin);
								bit += dinbitsds;
								tmp += GET_BWBIT(bit, bufin);
								bit += dinbitsdt;
							}
							bit += 2 * dinbitsdq - factor * dinbitsdp;
						}
						tmp = tmp * val_1 + (fac_fac_2 - tmp) * val_0;
						tmp = (tmp + fac_fac_4) >> fac_fac_2_bits;
						*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
						bitin += factor * dinbitsdp;
					}
					if (prest) {
						tmp = 0;
						for (j = 0; j < factor; j++)
							for (i = 0; i < prest; i++) {
								tmp += GET_BWBIT(bitin + i * dinbitsdp + j * dinbitsdq, bufin);
							}
						tmp = tmp * val_1 + (fac_prest - tmp) * val_0;
						tmp = (tmp + fac_prest_2) / fac_prest;
						*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
					}
					bitrowin += factor * dinbitsdq;
					rowout += wrapout;
				}
				if (qrest) {
					bitin = bitrowin;
					pixout = rowout;
					for (p = 0; p < plast; p += factor) {
						tmp = 0;
						for (j = 0; j < qrest; j++)
							for (i = 0; i < factor; i++) {
								tmp += GET_BWBIT(bitin + i * dinbitsdp + j * dinbitsdq, bufin);
							}
						tmp = tmp * val_1 + (qrest_fac - tmp) * val_0;
						tmp = (tmp + qrest_fac_2) / qrest_fac;
						*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
						bitin += factor * dinbitsdp;
					}
					if (prest) {
						tmp = 0;
						for (j = 0; j < qrest; j++)
							for (i = 0; i < prest; i++) {
								tmp += GET_BWBIT(bitin + i * dinbitsdp + j * dinbitsdq, bufin);
							}
						tmp = tmp * val_1 + (qrest_prest - tmp) * val_0;
						tmp = (tmp + qrest_prest_2) / qrest_prest;
						*pixout++ = PIX_RGB16_FROM_BYTES(tmp, tmp, tmp);
					}
				}
			}

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

			E 62 static void rop_copy_90_rgbm(RASTER * rin, RASTER * rout,
											   int x1, int y1, int x2, int y2,
											   int newx, int newy,
											   int mirror, int ninety)
			{
				LPIXEL *bufin, *pixin;
				LPIXEL *bufout, *pixout;
				int wrapin, wrapout;
				int u, v, lu, lv, su, sv, u00, v00, u0, v0, dindx, dudy, dvdy;
				int x, y, lx, ly;
				int u1, v1, u2, v2;

				mirror &= 1;
				ninety &= 3;

				if (!ninety && !mirror) {
					rop_copy(rin, rout, x1, y1, x2, y2, newx, newy);
					return;
				}

				u1 = x1;
				v1 = y1;
				u2 = x2;
				v2 = y2;

				su = u2 - u1;
				sv = v2 - v1;
				lu = u2 - u1 + 1;
				lv = v2 - v1 + 1;

				if (ninety & 1) {
					lx = lv;
					ly = lu;
				} else {
					lx = lu;
					ly = lv;
				}

				bufin = rin->buffer;
				wrapin = rin->wrap;
				bufout = rout->buffer;
				wrapout = rout->wrap;

				dudy = 0;
				dvdy = 0;

				switch ((mirror << 2) + ninety) {
					CASE(0 << 2) + 0 : u00 = u1;
					v00 = v1;
					dvdy = 1;
					dindx = 1;
					CASE(0 << 2) + 1 : u00 = u1;
					v00 = v1 + sv;
					dudy = 1;
					dindx = -wrapin;
					CASE(0 << 2) + 2 : u00 = u1 + su;
					v00 = v1 + sv;
					dvdy = -1;
					dindx = -1;
					CASE(0 << 2) + 3 : u00 = u1 + su;
					v00 = v1;
					dudy = -1;
					dindx = wrapin;
					CASE(1 << 2) + 0 : u00 = u1 + su;
					v00 = v1;
					dvdy = 1;
					dindx = -1;
					CASE(1 << 2) + 1 : u00 = u1 + su;
					v00 = v1 + sv;
					dudy = -1;
					dindx = -wrapin;
					CASE(1 << 2) + 2 : u00 = u1;
					v00 = v1 + sv;
					dvdy = -1;
					dindx = 1;
					CASE(1 << 2) + 3 : u00 = u1;
					v00 = v1;
					dudy = 1;
					dindx = wrapin;
					D 78 DEFAULT : assert(FALSE);
					u00 = v00 = dudy = dindx = 0;
					E 78
I 78 DEFAULT : abort();
					u00 = v00 = dudy = dindx = 0;
					E 78
				}

				for (u0 = u00, v0 = v00, y = newy; y < newy + ly; u0 += dudy, v0 += dvdy, y++) {
					pixin = bufin + u0 + v0 * wrapin;
					pixout = bufout + newx + y * wrapout;
					for (x = newx; x < newx + lx; x++) {
						*pixout++ = *pixin;
						pixin += dindx;
					}
					I 57
				}
			}

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

			/* vedi sia rop_zoom_out che rop_copy_90
 */
			void rop_zoom_out_90(RASTER * rin, RASTER * rout,
								 int x1, int y1, int x2, int y2, int newx, int newy,
								 int abs_zoom_level, int mirror, int ninety)
			{
				int tmp, newlx, newly;
				int rasras, factor, abszl;

				abszl = abs_zoom_level;
				factor = 1 << abs_zoom_level;
				if (factor == 1)
					rop_copy_90(rin, rout, x1, y1, x2, y2, newx, newy, mirror, ninety);

				/* raddrizzo gli estremi */
				if (x1 > x2) {
					tmp = x1;
					x1 = x2;
					x2 = tmp;
				}
				if (y1 > y2) {
					tmp = y1;
					y1 = y2;
					y2 = tmp;
				}

				/* controllo gli sconfinamenti */
				if (ninety & 1) {
					newlx = (y2 - y1 + factor) / factor;
					newly = (x2 - x1 + factor) / factor;
				} else {
					newlx = (x2 - x1 + factor) / factor;
					newly = (y2 - y1 + factor) / factor;
				}
				if (x1 < 0 || y1 < 0 || x2 >= rin->lx || y2 >= rin->ly || newx < 0 || newy < 0 ||
					newx + newlx > rout->lx || newy + newly > rout->ly) {
					printf("### INTERNAL ERROR - rop_zoom_out; access violation\n"
						   " ((%d,%d)(%d,%d)in(%dx%d)->(%d,%d)in(%dx%d))\n",
						   x1, y1, x2, y2, rin->lx, rin->ly, newx, newy, rout->lx, rout->ly);
					return;
				}

				rasras = RASRAS(rin->type, rout->type);
				switch (rasras) {
					I 62 CASE RASRAS(RAS_WB, RAS_RGB16) : __OR RASRAS(RAS_BW, RAS_RGB16) : rop_zoom_out_90_bw_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl,
																													 mirror, ninety);

					CASE RASRAS(RAS_WB, RAS_RGB_) : __OR RASRAS(RAS_WB, RAS_RGBM) : __OR RASRAS(RAS_BW, RAS_RGB_) : __OR RASRAS(RAS_BW, RAS_RGBM) : rop_zoom_out_90_bw_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl,
																																											mirror, ninety);

					E 62 CASE RASRAS(RAS_GR8, RAS_RGB16) : rop_zoom_out_90_gr8_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl,
																					  mirror, ninety);

					CASE RASRAS(RAS_GR8, RAS_RGB_) : __OR RASRAS(RAS_GR8, RAS_RGBM) : rop_zoom_out_90_gr8_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl,
I 63 mirror, ninety);

					CASE RASRAS(RAS_RGB, RAS_RGB16) : rop_zoom_out_90_rgb_rgb16(rin, rout, x1, y1, x2, y2, newx, newy, abszl,
																				mirror, ninety);

					CASE RASRAS(RAS_RGB, RAS_RGB_) : __OR RASRAS(RAS_RGB, RAS_RGBM) : rop_zoom_out_90_rgb_rgbm(rin, rout, x1, y1, x2, y2, newx, newy, abszl,
E 63 mirror, ninety);

				DEFAULT:
					assert(!"rop_zoom_out_90; invalid raster combination");
					E 57
				}
			}

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

			void rop_clear(RASTER * r, int x1, int y1, int x2, int y2)
			{
				UCHAR *pix;
				D 89 int l, x, y, tmp, rowsize, wrap, pixbits;
				E 89
I 89 ULONG *row24, *pix24;
				D 93 int lines, x, y, lx, tmp, rowsize, wrap, pixbits;
				E 93
I 93 int lines, x, y, lx, tmp, rowbytes, wrap, bytewrap, pixbits;
				E 93
E 89

					if (x1 > x2)
				{
					tmp = x1;
					x1 = x2;
					x2 = tmp;
				}
				if (y1 > y2) {
					tmp = y1;
					y1 = y2;
					y2 = tmp;
				}

				/* controllo gli sconfinamenti */
				if (x1 < 0 || y1 < 0 || x2 - x1 >= r->lx || y2 - y1 >= r->ly) {
					printf("### INTERNAL ERROR - rop_clear; access violation\n");
					return;
				}

				pixbits = rop_pixbits(r->type);

				/* per adesso niente pixel non multipli di 8 bits */
				if (rop_fillerbits(r->type)) {
					printf("### INTERNAL ERROR - rop_clear; byte fraction pixels\n");
					return;
				}

				D 93 wrap = (r->wrap * pixbits) >> 3;
				rowsize = ((x2 - x1 + 1) * pixbits) >> 3;
				E 93
I 93 wrap = r->wrap;
				bytewrap = (wrap * pixbits + 7) >> 3;
				rowbytes = ((x2 - x1 + 1) * pixbits) >> 3;
				E 93
D 89 pix = (UCHAR *)r->buffer + (((x1 + y1 * r->wrap) * pixbits) >> 3);
				l = y2 - y1 + 1;
				while (l-- > 0)
					E 89
I 89 lx = x2 - x1 + 1;
				lines = y2 - y1 + 1;
				if (r->type == RAS_CM24) {
					row24 = (ULONG *)r->buffer + x1 + y1 * wrap;
					while (lines-- > 0) {
						pix24 = row24;
						for (x = 0; x < lx; x++)
							*pix24++ &= 0xff000000;
						row24 += wrap;
					}
				} else {
					D 93 pix = (UCHAR *)r->buffer + (((x1 + y1 * wrap) * pixbits) >> 3);
					E 93
I 93 pix = (UCHAR *)r->buffer + ((x1 * pixbits) >> 3) + y1 * bytewrap;
					E 93 while (lines-- > 0)
					{
						D 93 memset(pix, 0, rowsize);
						pix += wrap;
						E 93
I 93 memset(pix, 0, rowbytes);
						pix += bytewrap;
						E 93
					}
				}
			}

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

			void rop_and_extra_bits(RASTER * ras, UCHAR and_mask,
									int x1, int y1, int x2, int y2)
			{
				int x, y, lx, ly, wrap;
				ULONG *row24, *pix24, and_mask24;
				UCHAR *row8, *pix8;

				lx = x2 - x1 + 1;
				ly = y2 - y1 + 1;
				wrap = ras->wrap;
				if (ras->type == RAS_CM24) {
					and_mask24 = (and_mask << 24) | 0xffffff;
					row24 = (ULONG *)ras->buffer + x1 + y1 * wrap;
					for (y = 0; y < ly; y++, row24 += wrap) {
						pix24 = row24;
						for (x = 0; x < lx; x++, pix24++)
							*pix24 &= and_mask24;
					}
				} else
					E 89
					{
						D 89 memset(pix, 0, rowsize);
						pix += wrap;
						E 89
I 89 if (!ras->extra) return;
						row8 = ras->extra + x1 + y1 * wrap;
						for (y = 0; y < ly; y++, row8 += wrap) {
							pix8 = row8;
							if (and_mask)
								for (x = 0; x < lx; x++, pix8++)
									*row8 &= and_mask;
							else
								memset(row8, 0, lx);
						}
						E 89
					}
			}

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

			void rop_add_white_to_cmap(RASTER * ras)
			{
				int i;
				UCHAR m, white;
				I 82
D 84 int cmap_size;
				E 84
I 84 int cmap_size, colbuf_size, penbuf_size;
				LPIXEL *buffer, *penbuffer, *colbuffer;
				E 84
E 82

D 82 for (i = 0; i < ras->cmap.size; i++)
E 82
I 82
D 84 cmap_size = TCM_MIN_CMAP_BUFFER_SIZE(ras->cmap.info);
				for (i = 0; i < cmap_size; i++)
					E 82
					{
						m = ras->cmap.buffer[i].m;
						if (ras->cmap.buffer[i].r > m ||
							ras->cmap.buffer[i].g > m ||
							ras->cmap.buffer[i].b > m)
							break;
						white = (UCHAR)255 - m;
						ras->cmap.buffer[i].r += white;
						ras->cmap.buffer[i].g += white;
						ras->cmap.buffer[i].b += white;
						E 84
I 84 buffer = ras->cmap.buffer;
						penbuffer = ras->cmap.penbuffer;
						colbuffer = ras->cmap.colbuffer;
						if (buffer) {
							cmap_size = TCM_MIN_CMAP_BUFFER_SIZE(ras->cmap.info);
							for (i = 0; i < cmap_size; i++) {
								m = buffer[i].m;
								if (buffer[i].r > m ||
									buffer[i].g > m ||
									buffer[i].b > m)
									break;
								white = (UCHAR)255 - m;
								buffer[i].r += white;
								buffer[i].g += white;
								buffer[i].b += white;
							}
							if (i < cmap_size)
								fprintf(stderr, "\7add_white: cmap is not premultiplied\n");
						} else if (colbuffer && penbuffer) {
							colbuf_size = TCM_MIN_CMAP_COLBUFFER_SIZE(ras->cmap.info);
							penbuf_size = TCM_MIN_CMAP_PENBUFFER_SIZE(ras->cmap.info);

							for (i = 0; i < colbuf_size; i++) {
								m = colbuffer[i].m;
								if (colbuffer[i].r > m ||
									colbuffer[i].g > m ||
									colbuffer[i].b > m)
									break;
								white = (UCHAR)i - m; /* i & 0xff == tone */
								colbuffer[i].r += white;
								colbuffer[i].g += white;
								colbuffer[i].b += white;
							}
							if (i < colbuf_size)
								fprintf(stderr, "\7add_white: color cmap is not premultiplied\n");

							for (i = 0; i < penbuf_size; i++) {
								m = penbuffer[i].m;
								if (penbuffer[i].r > m ||
									penbuffer[i].g > m ||
									penbuffer[i].b > m)
									break;
								white = (UCHAR)~i - m; /* 255 - (i & 0xff) == 255 - tone */
								penbuffer[i].r += white;
								penbuffer[i].g += white;
								penbuffer[i].b += white;
							}
							if (i < penbuf_size)
								fprintf(stderr, "\7add_white: pencil cmap is not premultiplied\n");
							E 84
						}
						D 82 if (i < ras->cmap.size)
E 82
I 82
D 84 if (i < cmap_size)
E 82 fprintf(stderr, "\7add_white: cmap is not premultiplied\n");
						E 84
					}

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

				void rop_remove_white_from_cmap(RASTER * ras)
				{
					int i;
					UCHAR m, white;
					I 82
D 84 int cmap_size;
					E 84
I 84 int cmap_size, colbuf_size, penbuf_size;
					LPIXEL *buffer, *penbuffer, *colbuffer;
					E 84
E 82

D 82 for (i = 0; i < ras->cmap.size; i++)
E 82
I 82
D 84 cmap_size = TCM_MIN_CMAP_BUFFER_SIZE(ras->cmap.info);
					for (i = 0; i < cmap_size; i++)
						E 84
I 84 buffer = ras->cmap.buffer;
					penbuffer = ras->cmap.penbuffer;
					colbuffer = ras->cmap.colbuffer;
					if (buffer) {
						cmap_size = TCM_MIN_CMAP_BUFFER_SIZE(ras->cmap.info);
						for (i = 0; i < cmap_size; i++) {
							m = buffer[i].m;
							white = (UCHAR)255 - m;
							buffer[i].r -= white;
							buffer[i].g -= white;
							buffer[i].b -= white;
							if (buffer[i].r > m ||
								buffer[i].g > m ||
								buffer[i].b > m)
								break;
						}
						if (i < cmap_size)
							fprintf(stderr, "\7remove_white: cmap is not premultiplied\n");
					} else if (colbuffer && penbuffer)
						E 84
E 82
						{
							D 84 m = ras->cmap.buffer[i].m;
							white = (UCHAR)255 - m;
							ras->cmap.buffer[i].r -= white;
							ras->cmap.buffer[i].g -= white;
							ras->cmap.buffer[i].b -= white;
							if (ras->cmap.buffer[i].r > m ||
								ras->cmap.buffer[i].g > m ||
								ras->cmap.buffer[i].b > m)
								break;
							E 84
I 84 colbuf_size = TCM_MIN_CMAP_COLBUFFER_SIZE(ras->cmap.info);
							penbuf_size = TCM_MIN_CMAP_PENBUFFER_SIZE(ras->cmap.info);

							for (i = 0; i < colbuf_size; i++) {
								m = colbuffer[i].m;
								white = (UCHAR)i - m; /* i & 0xff == tone */
								colbuffer[i].r -= white;
								colbuffer[i].g -= white;
								colbuffer[i].b -= white;
								if (colbuffer[i].r > m ||
									colbuffer[i].g > m ||
									colbuffer[i].b > m)
									break;
							}
							if (i < colbuf_size)
								fprintf(stderr, "\7add_white: color cmap is not premultiplied\n");

							for (i = 0; i < penbuf_size; i++) {
								m = penbuffer[i].m;
								white = (UCHAR)~i - m; /* 255 - (i & 0xff) == 255 - tone */
								penbuffer[i].r -= white;
								penbuffer[i].g -= white;
								penbuffer[i].b -= white;
								if (penbuffer[i].r > m ||
									penbuffer[i].g > m ||
									penbuffer[i].b > m)
									break;
							}
							if (i < penbuf_size)
								fprintf(stderr, "\7add_white: pencil cmap is not premultiplied\n");
							E 84
						}
					D 82 if (i < ras->cmap.size)
E 82
I 82
D 84 if (i < cmap_size)
E 82 fprintf(stderr, "\7remove_white: cmap is not premultiplied\n");
					E 84
				}

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

				D 84 static LPIXEL premult_lpixel(LPIXEL lpixel)
E 84
I 84 LPIXEL premult_lpixel(LPIXEL lpixel)
E 84
				{
					D 84 int m;
					E 84
I 84 UINT m, mm;
					E 84 LPIXEL new_lpixel;

					m = lpixel.m;
					if (m == 255)
						D 84 return lpixel;
					E 84
I 84 new_lpixel = lpixel;
					E 84 else if (m == 0)
					{
						new_lpixel.r = 0;
						new_lpixel.g = 0;
						new_lpixel.b = 0;
						new_lpixel.m = 0;
					}
					else
					{
						D 84 new_lpixel.r = (lpixel.r * m + 127) / 255;
						new_lpixel.g = (lpixel.g * m + 127) / 255;
						new_lpixel.b = (lpixel.b * m + 127) / 255;
						E 84
I 84 mm = m * MAGICFAC;
						new_lpixel.r = (lpixel.r * mm + (1U << 23)) >> 24;
						new_lpixel.g = (lpixel.g * mm + (1U << 23)) >> 24;
						new_lpixel.b = (lpixel.b * mm + (1U << 23)) >> 24;
						E 84 new_lpixel.m = m;
					}
					return new_lpixel;
				}

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

				D 84 static LPIXEL unpremult_lpixel(LPIXEL lpixel)
E 84
I 84 LPIXEL unpremult_lpixel(LPIXEL lpixel)
E 84
				{
					int m, m_2;
					LPIXEL new_lpixel;

					m = lpixel.m;
					if (m == 255)
						return lpixel;
					else if (m == 0) {
						new_lpixel.r = 255;
						new_lpixel.g = 255;
						new_lpixel.b = 255;
						new_lpixel.m = 0;
					} else {
						m_2 = m >> 1;
						new_lpixel.r = (lpixel.r * 255 + m_2) / m;
						new_lpixel.g = (lpixel.g * 255 + m_2) / m;
						new_lpixel.b = (lpixel.b * 255 + m_2) / m;
						E 52 new_lpixel.m = m;
					}
					return new_lpixel;
				}

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

				void rop_fill_cmap_ramp(RASTER * ras, TCM_INFO info,
D 89 LPIXEL color, LPIXEL pencil,
										int color_index, int pencil_index,
										int already_premultiplied)
				{
					LPIXEL val, *ramp;
					int ramp_index;
					int c_r, c_g, c_b, c_m, p_r, p_g, p_b, p_m, d_r, d_g, d_b, d_m;
					int tone, tmax, tmax_2;
					int tmax_2_r, tmax_2_g, tmax_2_b, tmax_2_m;

					I 34
D 35
						/* Secondo noi (Grisu & Roberto) l'offset non ci vuole 
E 34
ramp_index = color_index  << info.color_offs  |
             pencil_index << info.pencil_offs | info.offset_mask;
I 34
 */
						ramp_index = color_index << info.color_offs |
									 pencil_index << info.pencil_offs;
					E 35
I 35 ramp_index = color_index << info.color_offs |
						pencil_index << info.pencil_offs;
					E 35
E 34 ramp = ras->cmap.buffer + ramp_index;
					if (!already_premultiplied) {
						color = premult_lpixel(color);
						pencil = premult_lpixel(pencil);
					}
					c_r = color.r;
					p_r = pencil.r;
					d_r = c_r - p_r;
					c_g = color.g;
					p_g = pencil.g;
					d_g = c_g - p_g;
					c_b = color.b;
					p_b = pencil.b;
					d_b = c_b - p_b;
					c_m = color.m;
					p_m = pencil.m;
					d_m = c_m - p_m;
					tmax = info.n_tones - 1;
					tmax_2 = tmax >> 1;
					tmax_2_r = d_r < 0 ? -tmax_2 : tmax_2;
					tmax_2_g = d_g < 0 ? -tmax_2 : tmax_2;
					tmax_2_b = d_b < 0 ? -tmax_2 : tmax_2;
					tmax_2_m = d_m < 0 ? -tmax_2 : tmax_2;
					ramp[0] = pencil;
					for (tone = 1; tone < info.n_tones - 1; tone++) {
						val.r = p_r + (d_r * tone + tmax_2_r) / tmax;
						val.g = p_g + (d_g * tone + tmax_2_g) / tmax;
						val.b = p_b + (d_b * tone + tmax_2_b) / tmax;
						val.m = p_m + (d_m * tone + tmax_2_m) / tmax;
						D 82 ramp[tone << info.tone_offs] = val;
						E 82
I 82 ramp[tone] = val;
						E 82
					}
					ramp[info.n_tones - 1] = color;
				}

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

				I 84 void rop_fill_cmap_colramp(RASTER * ras, TCM_INFO info,
												 LPIXEL color, int color_index,
												 int already_premultiplied)
				{
					LPIXEL val, *colbuffer;
					int index, tone;
					UINT magic_tone, c_r, c_g, c_b, c_m;

					if (!already_premultiplied)
						color = premult_lpixel(color);
					c_r = color.r;
					c_g = color.g;
					c_b = color.b;
					c_m = color.m;
					colbuffer = ras->cmap.colbuffer;
					index = color_index << info.tone_bits;
					for (tone = 0; tone < info.n_tones; tone++) {
						magic_tone = tone * MAGICFAC;
						val.r = (UCHAR)((c_r * magic_tone + (1 << 23)) >> 24);
						val.g = (UCHAR)((c_g * magic_tone + (1 << 23)) >> 24);
						val.b = (UCHAR)((c_b * magic_tone + (1 << 23)) >> 24);
						val.m = (UCHAR)((c_m * magic_tone + (1 << 23)) >> 24);
						colbuffer[index++] = val;
					}
				}

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

				void rop_fill_cmap_penramp(RASTER * ras, TCM_INFO info,
										   LPIXEL pencil, int pencil_index,
										   int already_premultiplied)
				{
					LPIXEL val, *penbuffer;
					int index, enot;
					UINT magic_enot, p_r, p_g, p_b, p_m;

					if (!already_premultiplied)
						D 88 pencil = premult(pencil);
					E 88
I 88 pencil = rop_premult(pencil);
					E 88 p_r = pencil.r;
					p_g = pencil.g;
					p_b = pencil.b;
					p_m = pencil.m;
					penbuffer = ras->cmap.penbuffer;
					index = pencil_index << info.tone_bits;
					for (enot = info.n_tones - 1; enot >= 0; enot--) {
						magic_enot = enot * MAGICFAC;
						val.r = (UCHAR)((p_r * magic_enot + (1 << 23)) >> 24);
						val.g = (UCHAR)((p_g * magic_enot + (1 << 23)) >> 24);
						val.b = (UCHAR)((p_b * magic_enot + (1 << 23)) >> 24);
						val.m = (UCHAR)((p_m * magic_enot + (1 << 23)) >> 24);
						penbuffer[index++] = val;
					}
				}

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

				E 84
I 36 void rop_custom_fill_cmap_ramp(RASTER * ras, TCM_INFO info,
									  LPIXEL color, LPIXEL pencil,
									  int color_index, int pencil_index,
									  int already_premultiplied, int *custom_tone)
				{
					LPIXEL val, *ramp;
					int ramp_index;
					int c_r, c_g, c_b, c_m, p_r, p_g, p_b, p_m, d_r, d_g, d_b, d_m;
					int tone, tmax, tmax_2;
					int tmax_2_r, tmax_2_g, tmax_2_b, tmax_2_m;

					ramp_index = color_index << info.color_offs |
								 pencil_index << info.pencil_offs;
					ramp = ras->cmap.buffer + ramp_index;
					if (!already_premultiplied) {
						color = premult_lpixel(color);
						pencil = premult_lpixel(pencil);
					}
					c_r = color.r;
					p_r = pencil.r;
					d_r = c_r - p_r;
					c_g = color.g;
					p_g = pencil.g;
					d_g = c_g - p_g;
					c_b = color.b;
					p_b = pencil.b;
					d_b = c_b - p_b;
					c_m = color.m;
					p_m = pencil.m;
					d_m = c_m - p_m;
					tmax = info.n_tones - 1;
					tmax_2 = tmax >> 1;
					tmax_2_r = d_r < 0 ? -tmax_2 : tmax_2;
					tmax_2_g = d_g < 0 ? -tmax_2 : tmax_2;
					tmax_2_b = d_b < 0 ? -tmax_2 : tmax_2;
					tmax_2_m = d_m < 0 ? -tmax_2 : tmax_2;
					D 37 ramp[0] = pencil;
					for (tone = 1; tone < info.n_tones - 1; tone++)
						E 37
I 37 for (tone = 0; tone < info.n_tones; tone++)
E 37
						{
							D 37
								/* only the following 4 lines are different from the non-custom version */
E 37 val.r = p_r + (d_r * custom_tone[tone] + tmax_2_r) / tmax;
							val.g = p_g + (d_g * custom_tone[tone] + tmax_2_g) / tmax;
							val.b = p_b + (d_b * custom_tone[tone] + tmax_2_b) / tmax;
							val.m = p_m + (d_m * custom_tone[tone] + tmax_2_m) / tmax;
							D 82 ramp[tone << info.tone_offs] = val;
							E 82
I 82 ramp[tone] = val;
							E 82
						}
					D 37 ramp[info.n_tones - 1] = color;
					E 37
				}

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

				E 36
D 84 void rop_fill_cmap_buffer(RASTER * ras, TCM_INFO info,
								 LPIXEL * color, LPIXEL * pencil,
								 int already_premultiplied)
				{
					D 82 int min_cmap_buffer_size, i, j;
					E 82
I 82 int i, j;
					E 82

D 82 min_cmap_buffer_size = TCM_MIN_CMAP_BUFFER_SIZE(info);
					D 33 assert(min_cmap_buffer_size < ras->cmap.size);
					E 33
I 33 assert(ras->cmap.size >= min_cmap_buffer_size);
					E 82
E 33 for (i = 0; i < info.n_colors; i++) for (j = 0; j < info.n_pencils; j++)
						rop_fill_cmap_ramp(ras, info, color[i], pencil[j], i, j,
										   already_premultiplied);
					I 36
				}

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

				void rop_custom_fill_cmap_buffer(RASTER * ras, TCM_INFO info,
												 LPIXEL * color, LPIXEL * pencil,
												 int already_premultiplied, int *custom_tone)
				{
					D 82 int min_cmap_buffer_size, i, j;
					E 82
I 82 int i, j;
					E 82

D 82 min_cmap_buffer_size = TCM_MIN_CMAP_BUFFER_SIZE(info);
					assert(ras->cmap.size >= min_cmap_buffer_size);
					E 82 for (i = 0; i < info.n_colors; i++) for (j = 0; j < info.n_pencils; j++)
						rop_custom_fill_cmap_ramp(ras, info, color[i], pencil[j], i, j,
												  already_premultiplied, custom_tone);
					E 36
E 32
				}
				I 66

					/*---------------------------------------------------------------------------*/
E 84
I 84 void rop_custom_fill_cmap_colramp(RASTER * ras, TCM_INFO info,
										 LPIXEL color, int color_index,
										 int already_premultiplied, int *custom_tone)
				{
					LPIXEL val, *colbuffer;
					int index, tone;
					UINT magic_tone, c_r, c_g, c_b, c_m;
					E 84

I 77
D 84 void release_raster(RASTER * raster)
					{
						if (!raster->native_buffer)
							E 84
I 84 if (!already_premultiplied)
								color = premult_lpixel(color);
						c_r = color.r;
						c_g = color.g;
						c_b = color.b;
						c_m = color.m;
						colbuffer = ras->cmap.colbuffer;
						index = color_index << info.tone_bits;
						for (tone = 0; tone < info.n_tones; tone++)
							E 84
							{
								D 84 tmsg_error("release_raster,  missing buffer");
								return;
								E 84
I 84 magic_tone = custom_tone[tone] * MAGICFAC;
								val.r = (UCHAR)((c_r * magic_tone + (1 << 23)) >> 24);
								val.g = (UCHAR)((c_g * magic_tone + (1 << 23)) >> 24);
								val.b = (UCHAR)((c_b * magic_tone + (1 << 23)) >> 24);
								val.m = (UCHAR)((c_m * magic_tone + (1 << 23)) >> 24);
								colbuffer[index++] = val;
								E 84
							}
						D 84

							release_memory_chunk(raster->native_buffer);

						if (raster->type == RAS_CM16 && raster->cmap.buffer)
							free(raster->cmap.buffer);

						memset(raster, 0, sizeof(RASTER));
						return;
					}

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

					void create_raster(RASTER * raster, int xsize, int ysize,
									   RAS_TYPE type)
					{
						int pixsize;

						memset(raster, 0, sizeof(RASTER));

						pixsize = rop_pixbytes(type);

						if (!(raster->native_buffer = get_memory_chunk(xsize * ysize * pixsize)))
							tmsg_fatal("can't allocate %d Mbytes", ((xsize / 1024) * (ysize / 1024)) * pixsize);

						raster->buffer = raster->native_buffer;
						raster->type = type;
						raster->wrap = raster->lx = xsize;
						raster->ly = ysize;
						return;
					}

					I 80
						/*-----------------------------------------------------------------*/

						int
						create_subraster(RASTER * rin, RASTER * rout,
										 int x0, int y0, int x1, int y1)
					{
						if (x1 < x0 || y1 < y0)
							return FALSE;

						*rout = *rin;
						if (x0 < 0)
							x0 = 0;
						if (y0 < 0)
							y0 = 0;
						if (x1 > rin->lx - 1)
							x1 = rin->lx - 1;
						if (y1 > rin->ly - 1)
							y1 = rin->ly - 1;

						rout->lx = x1 - x0 + 1;
						rout->ly = y1 - y0 + 1;
						rout->buffer = (UCHAR *)(rin->buffer) + (y0 * rin->wrap + x0) * rop_pixbytes(rin->type);
						return TRUE;
						E 84
					}

					D 84
						/*-----------------------------------------------------------------*/
E 84
I 84
						/*---------------------------------------------------------------------------*/
E 84

D 84 void clone_raster(RASTER * rin, RASTER * rout)
E 84
I 84 void rop_custom_fill_cmap_penramp(RASTER * ras, TCM_INFO info,
										 LPIXEL pencil, int pencil_index,
										 int already_premultiplied, int *custom_tone)
E 84
					{
						D 84 create_raster(rout, rin->lx, rin->ly, rin->type);
						rop_copy(rin, rout, 0, 0, rin->lx - 1, rin->ly - 1, 0, 0);
					}
					E 84
I 84 LPIXEL val, *penbuffer;
					int index, enot;
					UINT magic_enot, p_r, p_g, p_b, p_m;
					E 84

I 84 if (!already_premultiplied)
D 88 pencil = premult(pencil);
					E 88
I 88 pencil = rop_premult(pencil);
					E 88
E 84
E 80
E 77
E 66
E 25
E 6
E 1
I 84 p_r = pencil.r;
					p_g = pencil.g;
					p_b = pencil.b;
					p_m = pencil.m;
					penbuffer = ras->cmap.penbuffer;
					index = pencil_index << info.tone_bits;
					for (enot = info.n_tones - 1; enot >= 0; enot--) {
						magic_enot = custom_tone[enot] * MAGICFAC;
						val.r = (UCHAR)((p_r * magic_enot + (1 << 23)) >> 24);
						val.g = (UCHAR)((p_g * magic_enot + (1 << 23)) >> 24);
						val.b = (UCHAR)((p_b * magic_enot + (1 << 23)) >> 24);
						val.m = (UCHAR)((p_m * magic_enot + (1 << 23)) >> 24);
						penbuffer[index++] = val;
					}
				}

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

				void rop_fill_cmap_buffer(RASTER * ras, TCM_INFO info,
										  LPIXEL * color, LPIXEL * pencil,
										  int already_premultiplied)
				{
					int i, j;

					for (i = 0; i < info.n_colors; i++)
						for (j = 0; j < info.n_pencils; j++)
							rop_fill_cmap_ramp(ras, info, color[i], pencil[j], i, j,
											   already_premultiplied);
				}

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

				void rop_fill_cmap_colbuffer(RASTER * ras, TCM_INFO info,
											 LPIXEL * color, int already_premultiplied)
				{
					int i;

					for (i = 0; i < info.n_colors; i++)
						rop_fill_cmap_colramp(ras, info, color[i], i, already_premultiplied);
				}

E 89
I 89
                         LPIXEL color, LPIXEL pencil,
		         int color_index, int pencil_index,
		         int already_premultiplied)
{
	LPIXEL val, *ramp;
	int ramp_index;
	int c_r, c_g, c_b, c_m, p_r, p_g, p_b, p_m, d_r, d_g, d_b, d_m;
	int tone, tmax, tmax_2;
	int tmax_2_r, tmax_2_g, tmax_2_b, tmax_2_m;

	ramp_index = color_index << info.color_offs |
				 pencil_index << info.pencil_offs;
	ramp = ras->cmap.buffer + ramp_index;
	if (!already_premultiplied) {
		color = premult_lpixel(color);
		pencil = premult_lpixel(pencil);
	}
	c_r = color.r;
	p_r = pencil.r;
	d_r = c_r - p_r;
	c_g = color.g;
	p_g = pencil.g;
	d_g = c_g - p_g;
	c_b = color.b;
	p_b = pencil.b;
	d_b = c_b - p_b;
	D 94 c_m = color.m;
	p_m = pencil.m;
	d_m = c_m - p_m;
	tmax = info.n_tones - 1;
	tmax_2 = tmax >> 1;
	tmax_2_r = d_r < 0 ? -tmax_2 : tmax_2;
	E 94
I 94 c_m = color.m;
	p_m = pencil.m;
	d_m = c_m - p_m;
	tmax = info.n_tones - 1;
	tmax_2 = tmax >> 1;
	tmax_2_r = d_r < 0 ? -tmax_2 : tmax_2;
	E 94 tmax_2_g = d_g < 0 ? -tmax_2 : tmax_2;
	tmax_2_b = d_b < 0 ? -tmax_2 : tmax_2;
	tmax_2_m = d_m < 0 ? -tmax_2 : tmax_2;
	ramp[0] = pencil;
	for (tone = 1; tone < info.n_tones - 1; tone++) {
		val.r = p_r + (d_r * tone + tmax_2_r) / tmax;
		val.g = p_g + (d_g * tone + tmax_2_g) / tmax;
		val.b = p_b + (d_b * tone + tmax_2_b) / tmax;
		val.m = p_m + (d_m * tone + tmax_2_m) / tmax;
		ramp[tone] = val;
	}
	ramp[info.n_tones - 1] = color;
}

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

void rop_fill_cmap_colramp(RASTER * ras, TCM_INFO info,
						   LPIXEL color, int color_index,
						   int already_premultiplied)
{
	LPIXEL val, *colbuffer;
	int index, tone;
	UINT magic_tone, c_r, c_g, c_b, c_m;

	if (!already_premultiplied)
		color = premult_lpixel(color);
	c_r = color.r;
	c_g = color.g;
	c_b = color.b;
	c_m = color.m;
	colbuffer = ras->cmap.colbuffer;
	index = color_index << info.tone_bits;
	for (tone = 0; tone < info.n_tones; tone++) {
		magic_tone = tone * MAGICFAC;
		val.r = (UCHAR)((c_r * magic_tone + (1 << 23)) >> 24);
		val.g = (UCHAR)((c_g * magic_tone + (1 << 23)) >> 24);
		val.b = (UCHAR)((c_b * magic_tone + (1 << 23)) >> 24);
		val.m = (UCHAR)((c_m * magic_tone + (1 << 23)) >> 24);
		colbuffer[index++] = val;
	}
}

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

void rop_fill_cmap_penramp(RASTER * ras, TCM_INFO info,
						   LPIXEL pencil, int pencil_index,
						   int already_premultiplied)
{
	LPIXEL val, *penbuffer;
	int index, enot;
	UINT magic_enot, p_r, p_g, p_b, p_m;

	if (!already_premultiplied)
		pencil = premult_lpixel(pencil);
	p_r = pencil.r;
	p_g = pencil.g;
	p_b = pencil.b;
	p_m = pencil.m;
	penbuffer = ras->cmap.penbuffer;
	index = pencil_index << info.tone_bits;
	for (enot = info.n_tones - 1; enot >= 0; enot--) {
		magic_enot = enot * MAGICFAC;
		val.r = (UCHAR)((p_r * magic_enot + (1 << 23)) >> 24);
		val.g = (UCHAR)((p_g * magic_enot + (1 << 23)) >> 24);
		val.b = (UCHAR)((p_b * magic_enot + (1 << 23)) >> 24);
		val.m = (UCHAR)((p_m * magic_enot + (1 << 23)) >> 24);
		penbuffer[index++] = val;
	}
}

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

void rop_custom_fill_cmap_ramp(RASTER * ras, TCM_INFO info,
							   LPIXEL color, LPIXEL pencil,
							   int color_index, int pencil_index,
							   int already_premultiplied, int *custom_tone)
{
	LPIXEL val, *ramp;
	int ramp_index;
	int c_r, c_g, c_b, c_m, p_r, p_g, p_b, p_m, d_r, d_g, d_b, d_m;
	int tone, tmax, tmax_2;
	int tmax_2_r, tmax_2_g, tmax_2_b, tmax_2_m;

	ramp_index = color_index << info.color_offs |
				 pencil_index << info.pencil_offs;
	ramp = ras->cmap.buffer + ramp_index;
	if (!already_premultiplied) {
		color = premult_lpixel(color);
		pencil = premult_lpixel(pencil);
	}
	c_r = color.r;
	p_r = pencil.r;
	d_r = c_r - p_r;
	c_g = color.g;
	p_g = pencil.g;
	d_g = c_g - p_g;
	c_b = color.b;
	p_b = pencil.b;
	d_b = c_b - p_b;
	c_m = color.m;
	p_m = pencil.m;
	d_m = c_m - p_m;
	tmax = info.n_tones - 1;
	tmax_2 = tmax >> 1;
	tmax_2_r = d_r < 0 ? -tmax_2 : tmax_2;
	tmax_2_g = d_g < 0 ? -tmax_2 : tmax_2;
	tmax_2_b = d_b < 0 ? -tmax_2 : tmax_2;
	tmax_2_m = d_m < 0 ? -tmax_2 : tmax_2;
	for (tone = 0; tone < info.n_tones; tone++) {
		val.r = p_r + (d_r * custom_tone[tone] + tmax_2_r) / tmax;
		val.g = p_g + (d_g * custom_tone[tone] + tmax_2_g) / tmax;
		val.b = p_b + (d_b * custom_tone[tone] + tmax_2_b) / tmax;
		val.m = p_m + (d_m * custom_tone[tone] + tmax_2_m) / tmax;
		ramp[tone] = val;
	}
}

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

void rop_custom_fill_cmap_colramp(RASTER * ras, TCM_INFO info,
								  LPIXEL color, int color_index,
								  int already_premultiplied, int *custom_tone)
{
	LPIXEL val, *colbuffer;
	int index, tone;
	UINT magic_tone, c_r, c_g, c_b, c_m;

	if (!already_premultiplied)
		color = premult_lpixel(color);
	c_r = color.r;
	c_g = color.g;
	c_b = color.b;
	c_m = color.m;
	colbuffer = ras->cmap.colbuffer;
	index = color_index << info.tone_bits;
	for (tone = 0; tone < info.n_tones; tone++) {
		magic_tone = custom_tone[tone] * MAGICFAC;
		val.r = (UCHAR)((c_r * magic_tone + (1 << 23)) >> 24);
		val.g = (UCHAR)((c_g * magic_tone + (1 << 23)) >> 24);
		val.b = (UCHAR)((c_b * magic_tone + (1 << 23)) >> 24);
		val.m = (UCHAR)((c_m * magic_tone + (1 << 23)) >> 24);
		colbuffer[index++] = val;
	}
}

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

void rop_custom_fill_cmap_penramp(RASTER * ras, TCM_INFO info,
								  LPIXEL pencil, int pencil_index,
								  int already_premultiplied, int *custom_tone)
{
	LPIXEL val, *penbuffer;
	int index, tone, maxtone;
	UINT magic_enot, p_r, p_g, p_b, p_m;

	if (!already_premultiplied)
		pencil = premult_lpixel(pencil);
	p_r = pencil.r;
	p_g = pencil.g;
	p_b = pencil.b;
	p_m = pencil.m;
	penbuffer = ras->cmap.penbuffer;
	index = pencil_index << info.tone_bits;
	maxtone = info.n_tones - 1;
	for (tone = 0; tone < info.n_tones; tone++) {
		magic_enot = (maxtone - custom_tone[tone]) * MAGICFAC;
		val.r = (UCHAR)((p_r * magic_enot + (1 << 23)) >> 24);
		val.g = (UCHAR)((p_g * magic_enot + (1 << 23)) >> 24);
		val.b = (UCHAR)((p_b * magic_enot + (1 << 23)) >> 24);
		val.m = (UCHAR)((p_m * magic_enot + (1 << 23)) >> 24);
		penbuffer[index++] = val;
	}
}

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

void rop_fill_cmap_buffer(RASTER * ras, TCM_INFO info,
						  LPIXEL * color, LPIXEL * pencil,
						  int already_premultiplied)
{
	int i, j;

	for (i = 0; i < info.n_colors; i++)
		for (j = 0; j < info.n_pencils; j++)
			rop_fill_cmap_ramp(ras, info, color[i], pencil[j], i, j,
							   already_premultiplied);
}

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

void rop_fill_cmap_colbuffer(RASTER * ras, TCM_INFO info,
							 LPIXEL * color, int already_premultiplied)
{
	int i;

	for (i = 0; i < info.n_colors; i++)
		rop_fill_cmap_colramp(ras, info, color[i], i, already_premultiplied);
}

E 89
	/*---------------------------------------------------------------------------*/

	void
	rop_fill_cmap_penbuffer(RASTER * ras, TCM_INFO info,
							LPIXEL * pencil, int already_premultiplied)
{
	int i;

	for (i = 0; i < info.n_pencils; i++)
		rop_fill_cmap_penramp(ras, info, pencil[i], i, already_premultiplied);
}

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

void rop_custom_fill_cmap_buffer(RASTER * ras, TCM_INFO info,
								 LPIXEL * color, LPIXEL * pencil,
								 int already_premultiplied, int *custom_tone)
{
	int i, j;

	for (i = 0; i < info.n_colors; i++)
		for (j = 0; j < info.n_pencils; j++)
			rop_custom_fill_cmap_ramp(ras, info, color[i], pencil[j], i, j,
									  already_premultiplied, custom_tone);
}

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

void rop_custom_fill_cmap_colbuffer(RASTER * ras, TCM_INFO info,
									LPIXEL * color, int already_premultiplied,
									int *custom_tone)
{
	int i;

	for (i = 0; i < info.n_colors; i++)
		rop_custom_fill_cmap_colramp(ras, info, color[i], i,
									 already_premultiplied, custom_tone);
}

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

void rop_custom_fill_cmap_penbuffer(RASTER * ras, TCM_INFO info,
									LPIXEL * pencil, int already_premultiplied,
									int *custom_tone)
{
	int i;

	for (i = 0; i < info.n_pencils; i++)
		rop_custom_fill_cmap_penramp(ras, info, pencil[i], i,
									 already_premultiplied, custom_tone);
}

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

void release_raster(RASTER * raster)
{
	D 89 if (!raster->native_buffer)
E 89
I 89 rop_clear_extra(raster);

	if (!(raster->native_buffer || raster->buffer))
		E 89
		{
			D 89 tmsg_error("release_raster,  missing buffer");
			return;
			E 89
I 89 tmsg_error("release_raster, missing buffer");
			return;
			E 89
		}
	I 89 if (raster->native_buffer)
I 99
	{
		E 99 release_memory_chunk(raster->native_buffer);
		I 99 MEMORY_PRINTF("libero %x\n", raster->native_buffer);
	}
	E 99 else I 99
	{
		E 99 release_memory_chunk(raster->buffer);
		I 99 MEMORY_PRINTF("libero %x\n", raster->buffer);
	}
	E 99
E 89

D 89 release_memory_chunk(raster->native_buffer);

	E 89 if (raster->type == RAS_CM16 && raster->cmap.buffer)
		free(raster->cmap.buffer);
	D 89

E 89
I 89 else if (raster->type == RAS_CM24 && raster->cmap.penbuffer)
	{
		free(raster->cmap.penbuffer);
		free(raster->cmap.colbuffer);
	}
	E 89 memset(raster, 0, sizeof(RASTER));
	return;
}

D 89
	/*-----------------------------------------------------------------*/
E 89
I 89
	/*---------------------------------------------------------------------------*/

	void rop_clear_extra(RASTER * raster)
{
	if (raster->extra_mask && raster->type != RAS_CM24) {
		if (!(raster->native_extra || raster->extra)) {
			tmsg_error("release_extra, missing extra buffer");
			return;
		}
		if (raster->native_extra)
			I 99
			{
				E 99 release_memory_chunk(raster->native_extra);
				I 99 MEMORY_PRINTF("libero extra %x\n", raster->native_extra);
			}
		E 99 else I 99
		{
			E 99 release_memory_chunk(raster->extra);
			I 99 MEMORY_PRINTF("libero extra %x\n", raster->extra);
		}
		E 99
	}
	raster->extra_mask = 0;
}

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

void rop_clear_patches(RASTER * raster)
{
	raster->extra_mask &= ~7;
	if (!raster->extra_mask)
		rop_clear_extra(raster);
}

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

void rop_clear_extra_but_not_patches(RASTER * raster)
{
	raster->extra_mask &= 7;
	if (!raster->extra_mask)
		rop_clear_extra(raster);
}
E 89

I 89
	/*---------------------------------------------------------------------------*/

E 89 void
create_raster(RASTER * raster, int xsize, int ysize,
			  RAS_TYPE type)
{
	int pixsize;

	memset(raster, 0, sizeof(RASTER));

	pixsize = rop_pixbytes(type);

	if (!(raster->native_buffer = get_memory_chunk(xsize * ysize * pixsize)))
		D 86 tmsg_fatal("can't allocate %d Mbytes", ((xsize / 1024) * (ysize / 1024)) * pixsize);
	E 86
I 86 tmsg_fatal("can't allocate %d Mbytes",
				  (xsize * ysize * pixsize + (512 * 1024)) / (1024 * 1024));
	E 86

I 99 MEMORY_PRINTF("alloco %x: %dX%dX%d=%d bytes\n", raster->native_buffer, xsize, ysize, pixsize, xsize * ysize * pixsize);

	E 99 raster->buffer = raster->native_buffer;
	raster->type = type;
	raster->wrap = raster->lx = xsize;
	raster->ly = ysize;
	I 86 switch (type)
	{
		CASE RAS_CM16 : raster->cmap.info = Tcm_new_default_info;
		CASE RAS_CM24 : raster->cmap.info = Tcm_24_default_info;
	}
	E 86 return;
}

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

D 89 int create_subraster(RASTER * rin, RASTER * rout,
						   int x0, int y0, int x1, int y1)
E 89
I 89 void
create_raster_with_extra(RASTER * raster, int xsize, int ysize,
						 RAS_TYPE type, UCHAR extra_mask)
{
	create_raster(raster, xsize, ysize, type);

	raster->extra_mask = extra_mask;
	if (extra_mask && type != RAS_CM24) {
		if (!(raster->native_extra = get_memory_chunk(xsize * ysize)))
			tmsg_fatal("can't allocate %d Mbytes",
					   (xsize * ysize + (512 * 1024)) / (1024 * 1024));
		I 99 MEMORY_PRINTF("alloco extra %x: %dX%d=%d bytes\n", raster->native_extra, xsize, ysize, xsize * ysize);
		E 99 raster->extra = raster->native_extra;
	}
}

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

int create_subraster(RASTER * rin, RASTER * rout,
					 int x0, int y0, int x1, int y1)
E 89
{
	if (x1 < x0 || y1 < y0)
		return FALSE;

	*rout = *rin;
	if (x0 < 0)
		x0 = 0;
	if (y0 < 0)
		y0 = 0;
	if (x1 > rin->lx - 1)
		x1 = rin->lx - 1;
	if (y1 > rin->ly - 1)
		y1 = rin->ly - 1;

	rout->lx = x1 - x0 + 1;
	rout->ly = y1 - y0 + 1;
	rout->buffer = (UCHAR *)(rin->buffer) + (y0 * rin->wrap + x0) * rop_pixbytes(rin->type);
	I 89 if (rin->extra)
		rout->extra = rin->extra + x0 + y0 * rin->wrap;
	E 89 return TRUE;
}

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

void clone_raster(RASTER * rin, RASTER * rout)
{
	I 91 int size;

	E 91
D 89 create_raster(rout, rin->lx, rin->ly, rin->type);
	I 85
  
E 89
I 89
D 90 create_raster_with_extra(rout, rin->lx, rin->ly, rin->type, rin->extra_mask);

	E 90
I 90
D 92 create_raster(rout, rin->lx, rin->ly, rin->type);
	E 92
I 92 create_raster_with_extra(rout, rin->lx, rin->ly, rin->type, rin->extra_mask);
	E 92
  
E 90
E 89
E 85 rop_copy(rin, rout, 0, 0, rin->lx - 1, rin->ly - 1, 0, 0);
	I 85 if (rin->type == RAS_CM16 || rin->type == RAS_CM24)
I 90
	{
		E 90 rout->cmap = rin->cmap;
		I 90
D 91 TCALLOC(rout->cmap.buffer, TCM_CMAP_BUFFER_SIZE(rout->cmap.info));
		memcpy(rout->cmap.buffer,
			   rin->cmap.buffer, TCM_CMAP_BUFFER_SIZE(rout->cmap.info));
		if (rin->type == RAS_CM24)
			E 91
I 91

				if (rin->cmap.buffer)
E 91
			{
				D 91 if (rin->cmap.penbuffer)
				{
					TCALLOC(rout->cmap.penbuffer, TCM_CMAP_PENBUFFER_SIZE(rout->cmap.info));
					memcpy(rout->cmap.penbuffer,
						   rin->cmap.penbuffer, TCM_CMAP_PENBUFFER_SIZE(rout->cmap.info));
				}
				if (rin->cmap.colbuffer) {
					TCALLOC(rout->cmap.colbuffer, TCM_CMAP_COLBUFFER_SIZE(rout->cmap.info));
					memcpy(rout->cmap.colbuffer,
						   rin->cmap.colbuffer, TCM_CMAP_COLBUFFER_SIZE(rout->cmap.info));
				}
				E 91
I 91 size = TCM_CMAP_BUFFER_SIZE(rout->cmap.info);
				TMALLOC(rout->cmap.buffer, size);
				memcpy(rout->cmap.buffer,
					   rin->cmap.buffer, size * sizeof(LPIXEL));
			}
		if (rin->cmap.penbuffer) {
			size = TCM_CMAP_PENBUFFER_SIZE(rout->cmap.info);
			TMALLOC(rout->cmap.penbuffer, size);
			memcpy(rout->cmap.penbuffer,
				   rin->cmap.penbuffer, size * sizeof(LPIXEL));

			size = TCM_CMAP_COLBUFFER_SIZE(rout->cmap.info);
			TMALLOC(rout->cmap.colbuffer, size);
			memcpy(rout->cmap.colbuffer,
				   rin->cmap.colbuffer, size * sizeof(LPIXEL));
			E 91
		}
	}
	E 90
E 85
}

I 87
	/*-----------------------------------------------------------------*/

	void
	convert_raster(RASTER * r, RAS_TYPE type)
{
	RASTER raux;

	if (r->type == type)
		return;

	D 89 create_raster(&raux, r->lx, r->ly, type);
	E 89
I 89 create_raster_with_extra(&raux, r->lx, r->ly, type, r->extra_mask);
	E 89 rop_copy(r, &raux, 0, 0, r->lx - 1, r->ly - 1, 0, 0);
	release_raster(r);
	*r = raux;
}
I 98

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

	static UCHAR Reverse_lut[256];

static void init_reverse_lut(void)
{
	UCHAR meta_lut[] = {0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
						0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf};
	static int i = 0;

	if (i == 256)
		return;

	for (i = 0; i < 256; i++)
		Reverse_lut[i] = (meta_lut[i & 0xf] << 4) | (meta_lut[i >> 4]);
}

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

I 105 static void rop_mirror_v_cm16_rgbm(RASTER * rin, RASTER * rout)
{
	LPIXEL *rowout, *pixout, *cmap;
	USHORT *rowin, *pixin;
	int wrapin, wrapout;
	int x, lx, ly;

	cmap = rin->cmap.buffer - rin->cmap.info.offset_mask;
	lx = rin->lx;
	ly = rin->ly;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (USHORT *)rin->buffer;
	rowout = (LPIXEL *)rout->buffer + wrapout * (ly - 1);

	while (ly-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++)
			*pixout++ = cmap[*pixin++];
		rowin += wrapin;
		rowout -= wrapout;
	}
}

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

static void rop_mirror_v_cm24_rgbm(RASTER * rin, RASTER * rout)
{
	LPIXEL *rowout, *pixout, valout, *penmap, *colmap;
	ULONG *rowin, *pixin, valin;
	UCHAR *exrow, *expix;
	int wrapin, wrapout;
	int x, lx, ly, lines;

	penmap = rin->cmap.penbuffer;
	colmap = rin->cmap.colbuffer;
	lx = rin->lx;
	ly = rin->ly;
	lines = ly;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	rowin = (ULONG *)rin->buffer;
	rowout = (LPIXEL *)rout->buffer + wrapout * (ly - 1);

	while (lines-- > 0) {
		pixin = rowin;
		pixout = rowout;
		for (x = 0; x < lx; x++) {
			valin = *pixin++;
			MAP24(valin, penmap, colmap, valout)
			*pixout++ = valout;
		}
		rowin += wrapin;
		rowout -= wrapout;
	}
}

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

E 105 void rop_mirror(RASTER * rin, RASTER * rout, TBOOL is_vertical)
{
	UCHAR *buffer1, *buffer2, *auxbuf;
	int bpp, lx, ly, wrapin, wrapout, scanline_in, scanline_out, lx_size;
	int i, j;
	lx = rin->lx;
	ly = rin->ly;
	wrapin = rin->wrap;
	wrapout = rout->wrap;

	I 105 if (rin->type == RAS_CM16 && rout->type == RAS_RGBM && is_vertical)
	{
		rop_mirror_v_cm16_rgbm(rin, rout);
		return;
	}
	if (rin->type == RAS_CM24 && rout->type == RAS_RGBM && is_vertical) {
		rop_mirror_v_cm24_rgbm(rin, rout);
		return;
	}

	E 105 assert(rin->type == rout->type);

	bpp = rop_pixbytes(rin->type);
	scanline_in = wrapin * bpp;
	scanline_out = wrapout * bpp;
	lx_size = lx * bpp;

	D 100 if (rin->type == RAS_BW)
E 100
I 100 if ((rin->type == RAS_BW) ||
			(rin->type == RAS_WB))
E 100
	{
		lx_size = (lx_size + 7) / 8;
		scanline_in = (scanline_in + 7) / 8;
		scanline_out = (scanline_out + 7) / 8;
		if (!is_vertical)
			init_reverse_lut();
	}

	buffer1 = rin->buffer;

	if (is_vertical)
		D 105
		{
			E 105
I 105
			{
				E 105 buffer2 = (UCHAR *)rout->buffer + (ly - 1) * scanline_out;
				TMALLOC(auxbuf, lx_size)
				for (i = 0; i < ly / 2; i++) {
					memcpy(auxbuf, buffer1, lx_size);
					memcpy(buffer1, buffer2, lx_size);
					memcpy(buffer2, auxbuf, lx_size);
					buffer1 += scanline_in;
					buffer2 -= scanline_out;
				}
			}
			else
			{
				buffer2 = (UCHAR *)rout->buffer + lx_size;
				TMALLOC(auxbuf, bpp)
				for (i = 0; i < ly; i++) {
					for (j = 0; j < lx_size / 2; j += bpp) {
						memcpy(auxbuf, buffer1 + j, bpp);
						memcpy(buffer1 + j, buffer1 + lx_size - j - bpp, bpp);
						memcpy(buffer2 - j - bpp, auxbuf, bpp);
						if (rin->type == RAS_BW) {
							buffer1[lx_size - j - bpp] = Reverse_lut[buffer1[lx_size - j - bpp]];
							buffer1[j] = Reverse_lut[buffer1[j]];
						}
						I 102 else if (rin->type == RAS_WB)
						{
							buffer1[lx_size - j - bpp] = ~Reverse_lut[buffer1[lx_size - j - bpp]];
							buffer1[j] = ~Reverse_lut[buffer1[j]];
						}
						E 102
					}
					buffer1 += scanline_in;
					buffer2 += scanline_out;
				}
			}
			free(auxbuf);
		}
E 98
E 87
E 84