Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Side by Side Diff: core/src/fxcodec/jbig2/JBig2_Image.cpp

Issue 1265503005: clang-format all pdfium code. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: sigh Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include <limits.h> 7 #include <limits.h>
8 8
9 #include "../../../include/fxcrt/fx_coordinates.h" 9 #include "../../../include/fxcrt/fx_coordinates.h"
10 #include "../../../include/fxcrt/fx_safe_types.h" 10 #include "../../../include/fxcrt/fx_safe_types.h"
11 #include "JBig2_Image.h" 11 #include "JBig2_Image.h"
12 12
13 CJBig2_Image::CJBig2_Image(int32_t w, int32_t h) 13 CJBig2_Image::CJBig2_Image(int32_t w, int32_t h) {
14 { 14 m_nWidth = w;
15 m_nWidth» = w; 15 m_nHeight = h;
16 m_nHeight» = h; 16 if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) {
17 if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) { 17 m_pData = NULL;
18 m_pData = NULL; 18 m_bNeedFree = FALSE;
19 m_bNeedFree = FALSE; 19 return;
20 return; 20 }
21 m_nStride = ((w + 31) >> 5) << 2;
22 if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) {
23 m_pData = (uint8_t*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
24 } else {
25 m_pData = NULL;
26 }
27 m_bNeedFree = TRUE;
28 }
29 CJBig2_Image::CJBig2_Image(int32_t w,
30 int32_t h,
31 int32_t stride,
32 uint8_t* pBuf) {
33 m_nWidth = w;
34 m_nHeight = h;
35 m_nStride = stride;
36 m_pData = pBuf;
37 m_bNeedFree = FALSE;
38 }
39 CJBig2_Image::CJBig2_Image(CJBig2_Image& im) {
40 m_pModule = im.m_pModule;
41 m_nWidth = im.m_nWidth;
42 m_nHeight = im.m_nHeight;
43 m_nStride = im.m_nStride;
44 if (im.m_pData) {
45 m_pData = (uint8_t*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
46 JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight);
47 } else {
48 m_pData = NULL;
49 }
50 m_bNeedFree = TRUE;
51 }
52 CJBig2_Image::~CJBig2_Image() {
53 if (m_bNeedFree && m_pData) {
54 m_pModule->JBig2_Free(m_pData);
55 }
56 }
57 FX_BOOL CJBig2_Image::getPixel(int32_t x, int32_t y) {
58 if (!m_pData) {
59 return 0;
60 }
61 int32_t m, n;
62 if (x < 0 || x >= m_nWidth) {
63 return 0;
64 }
65 if (y < 0 || y >= m_nHeight) {
66 return 0;
67 }
68 m = y * m_nStride + (x >> 3);
69 n = x & 7;
70 return ((m_pData[m] >> (7 - n)) & 1);
71 }
72
73 int32_t CJBig2_Image::setPixel(int32_t x, int32_t y, FX_BOOL v) {
74 if (!m_pData) {
75 return 0;
76 }
77 int32_t m, n;
78 if (x < 0 || x >= m_nWidth) {
79 return 0;
80 }
81 if (y < 0 || y >= m_nHeight) {
82 return 0;
83 }
84 m = y * m_nStride + (x >> 3);
85 n = x & 7;
86 if (v) {
87 m_pData[m] |= 1 << (7 - n);
88 } else {
89 m_pData[m] &= ~(1 << (7 - n));
90 }
91 return 1;
92 }
93 void CJBig2_Image::copyLine(int32_t hTo, int32_t hFrom) {
94 if (!m_pData) {
95 return;
96 }
97 if (hFrom < 0 || hFrom >= m_nHeight) {
98 JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride);
99 } else {
100 JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride,
101 m_nStride);
102 }
103 }
104 void CJBig2_Image::fill(FX_BOOL v) {
105 if (!m_pData) {
106 return;
107 }
108 JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight);
109 }
110 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image* pDst,
111 int32_t x,
112 int32_t y,
113 JBig2ComposeOp op) {
114 if (!m_pData) {
115 return FALSE;
116 }
117 return composeTo_opt2(pDst, x, y, op);
118 }
119 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image* pDst,
120 int32_t x,
121 int32_t y,
122 JBig2ComposeOp op,
123 const FX_RECT* pSrcRect) {
124 if (!m_pData) {
125 return FALSE;
126 }
127 if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) {
128 return composeTo_opt2(pDst, x, y, op);
129 }
130 return composeTo_opt2(pDst, x, y, op, pSrcRect);
131 }
132 FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image* pDst,
133 int32_t x,
134 int32_t y,
135 JBig2ComposeOp op) {
136 int32_t w, h, dx, dy;
137 int32_t i, j;
138 w = m_nWidth;
139 h = m_nHeight;
140 dx = dy = 0;
141 if (x < 0) {
142 dx += -x;
143 w -= -x;
144 x = 0;
145 }
146 if (y < 0) {
147 dy += -y;
148 h -= -y;
149 y = 0;
150 }
151 if (x + w > pDst->m_nWidth) {
152 w = pDst->m_nWidth - x;
153 }
154 if (y + h > pDst->m_nHeight) {
155 h = pDst->m_nHeight - y;
156 }
157 switch (op) {
158 case JBIG2_COMPOSE_OR:
159 for (j = 0; j < h; j++) {
160 for (i = 0; i < w; i++) {
161 pDst->setPixel(
162 x + i, y + j,
163 (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1);
164 }
165 }
166 break;
167 case JBIG2_COMPOSE_AND:
168 for (j = 0; j < h; j++) {
169 for (i = 0; i < w; i++) {
170 pDst->setPixel(
171 x + i, y + j,
172 (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1);
173 }
174 }
175 break;
176 case JBIG2_COMPOSE_XOR:
177 for (j = 0; j < h; j++) {
178 for (i = 0; i < w; i++) {
179 pDst->setPixel(
180 x + i, y + j,
181 (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1);
182 }
183 }
184 break;
185 case JBIG2_COMPOSE_XNOR:
186 for (j = 0; j < h; j++) {
187 for (i = 0; i < w; i++) {
188 pDst->setPixel(
189 x + i, y + j,
190 (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j))) & 1);
191 }
192 }
193 break;
194 case JBIG2_COMPOSE_REPLACE:
195 for (j = 0; j < h; j++) {
196 for (i = 0; i < w; i++) {
197 pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy));
198 }
199 }
200 break;
201 }
202 return TRUE;
203 }
204
205 FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image* pDst,
206 int32_t x,
207 int32_t y,
208 JBig2ComposeOp op) {
209 int32_t x0, x1, y0, y1, xx, yy;
210 uint8_t *pLineSrc, *pLineDst, *srcPtr, *destPtr;
211 FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3;
212 FX_BOOL oneByte;
213 if (!m_pData) {
214 return FALSE;
215 }
216 if (y < 0) {
217 y0 = -y;
218 } else {
219 y0 = 0;
220 }
221 if (y + m_nHeight > pDst->m_nHeight) {
222 y1 = pDst->m_nHeight - y;
223 } else {
224 y1 = m_nHeight;
225 }
226 if (y0 >= y1) {
227 return FALSE;
228 }
229 if (x >= 0) {
230 x0 = x & ~7;
231 } else {
232 x0 = 0;
233 }
234 x1 = x + m_nWidth;
235 if (x1 > pDst->m_nWidth) {
236 x1 = pDst->m_nWidth;
237 }
238 if (x0 >= x1) {
239 return FALSE;
240 }
241 s1 = x & 7;
242 s2 = 8 - s1;
243 m1 = 0xff >> (x1 & 7);
244 m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));
245 m3 = (0xff >> s1) & m2;
246 oneByte = x0 == ((x1 - 1) & ~7);
247 pLineDst = pDst->m_pData + y * pDst->m_nStride;
248 pLineSrc = m_pData + y0 * m_nStride;
249 if (oneByte) {
250 if (x >= 0) {
251 switch (op) {
252 case JBIG2_COMPOSE_OR: {
253 for (yy = y0; yy < y1; ++yy) {
254 destPtr = pLineDst + (x >> 3);
255 srcPtr = pLineSrc;
256 dest = *destPtr;
257 dest |= (*srcPtr >> s1) & m2;
258 *destPtr = (uint8_t)dest;
259 pLineDst += pDst->m_nStride;
260 pLineSrc += m_nStride;
261 }
262 } break;
263 case JBIG2_COMPOSE_AND: {
264 for (yy = y0; yy < y1; ++yy) {
265 destPtr = pLineDst + (x >> 3);
266 srcPtr = pLineSrc;
267 dest = *destPtr;
268 dest &= ((0xff00 | *srcPtr) >> s1) | m1;
269 *destPtr = (uint8_t)dest;
270 pLineDst += pDst->m_nStride;
271 pLineSrc += m_nStride;
272 }
273 } break;
274 case JBIG2_COMPOSE_XOR: {
275 for (yy = y0; yy < y1; ++yy) {
276 destPtr = pLineDst + (x >> 3);
277 srcPtr = pLineSrc;
278 dest = *destPtr;
279 dest ^= (*srcPtr >> s1) & m2;
280 *destPtr = (uint8_t)dest;
281 pLineDst += pDst->m_nStride;
282 pLineSrc += m_nStride;
283 }
284 } break;
285 case JBIG2_COMPOSE_XNOR: {
286 for (yy = y0; yy < y1; ++yy) {
287 destPtr = pLineDst + (x >> 3);
288 srcPtr = pLineSrc;
289 dest = *destPtr;
290 dest ^= ((*srcPtr ^ 0xff) >> s1) & m2;
291 *destPtr = (uint8_t)dest;
292 pLineDst += pDst->m_nStride;
293 pLineSrc += m_nStride;
294 }
295 } break;
296 case JBIG2_COMPOSE_REPLACE: {
297 for (yy = y0; yy < y1; ++yy) {
298 destPtr = pLineDst + (x >> 3);
299 srcPtr = pLineSrc;
300 dest = *destPtr;
301 dest = (dest & ~m3) | ((*srcPtr >> s1) & m3);
302 *destPtr = (uint8_t)dest;
303 pLineDst += pDst->m_nStride;
304 pLineSrc += m_nStride;
305 }
306 } break;
307 }
308 } else {
309 switch (op) {
310 case JBIG2_COMPOSE_OR: {
311 for (yy = y0; yy < y1; ++yy) {
312 destPtr = pLineDst;
313 srcPtr = pLineSrc + (-x >> 3);
314 dest = *destPtr;
315 dest |= *srcPtr & m2;
316 *destPtr = (uint8_t)dest;
317 pLineDst += pDst->m_nStride;
318 pLineSrc += m_nStride;
319 }
320 } break;
321 case JBIG2_COMPOSE_AND: {
322 for (yy = y0; yy < y1; ++yy) {
323 destPtr = pLineDst;
324 srcPtr = pLineSrc + (-x >> 3);
325 dest = *destPtr;
326 dest &= *srcPtr | m1;
327 *destPtr = (uint8_t)dest;
328 pLineDst += pDst->m_nStride;
329 pLineSrc += m_nStride;
330 }
331 } break;
332 case JBIG2_COMPOSE_XOR: {
333 for (yy = y0; yy < y1; ++yy) {
334 destPtr = pLineDst;
335 srcPtr = pLineSrc + (-x >> 3);
336 dest = *destPtr;
337 dest ^= *srcPtr & m2;
338 *destPtr = (uint8_t)dest;
339 pLineDst += pDst->m_nStride;
340 pLineSrc += m_nStride;
341 }
342 } break;
343 case JBIG2_COMPOSE_XNOR: {
344 for (yy = y0; yy < y1; ++yy) {
345 destPtr = pLineDst;
346 srcPtr = pLineSrc + (-x >> 3);
347 dest = *destPtr;
348 dest ^= (*srcPtr ^ 0xff) & m2;
349 *destPtr = (uint8_t)dest;
350 pLineDst += pDst->m_nStride;
351 pLineSrc += m_nStride;
352 }
353 } break;
354 case JBIG2_COMPOSE_REPLACE: {
355 for (yy = y0; yy < y1; ++yy) {
356 destPtr = pLineDst;
357 srcPtr = pLineSrc + (-x >> 3);
358 dest = *destPtr;
359 dest = (*srcPtr & m2) | (dest & m1);
360 *destPtr = (uint8_t)dest;
361 pLineDst += pDst->m_nStride;
362 pLineSrc += m_nStride;
363 }
364 } break;
365 }
21 } 366 }
22 m_nStride = ((w + 31) >> 5) << 2; 367 } else {
23 if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) { 368 if (x >= 0) {
24 m_pData = (uint8_t *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight); 369 switch (op) {
370 case JBIG2_COMPOSE_OR: {
371 for (yy = y0; yy < y1; ++yy) {
372 destPtr = pLineDst + (x >> 3);
373 srcPtr = pLineSrc;
374 src1 = *srcPtr++;
375 dest = *destPtr;
376 dest |= src1 >> s1;
377 *destPtr++ = (uint8_t)dest;
378 xx = x0 + 8;
379 for (; xx < x1 - 8; xx += 8) {
380 dest = *destPtr;
381 src0 = src1;
382 src1 = *srcPtr++;
383 src = (((src0 << 8) | src1) >> s1) & 0xff;
384 dest |= src;
385 *destPtr++ = (uint8_t)dest;
386 }
387 dest = *destPtr;
388 src0 = src1;
389 if (srcPtr - pLineSrc < m_nStride) {
390 src1 = *srcPtr++;
391 } else {
392 src1 = 0;
393 }
394 src = (((src0 << 8) | src1) >> s1) & 0xff;
395 dest |= src & m2;
396 *destPtr = (uint8_t)dest;
397 pLineDst += pDst->m_nStride;
398 pLineSrc += m_nStride;
399 }
400 } break;
401 case JBIG2_COMPOSE_AND: {
402 for (yy = y0; yy < y1; ++yy) {
403 destPtr = pLineDst + (x >> 3);
404 srcPtr = pLineSrc;
405 src1 = *srcPtr++;
406 dest = *destPtr;
407 dest &= (0xff00 | src1) >> s1;
408 *destPtr++ = (uint8_t)dest;
409 xx = x0 + 8;
410 for (; xx < x1 - 8; xx += 8) {
411 dest = *destPtr;
412 src0 = src1;
413 src1 = *srcPtr++;
414 src = (((src0 << 8) | src1) >> s1) & 0xff;
415 dest &= src;
416 *destPtr++ = (uint8_t)dest;
417 }
418 dest = *destPtr;
419 src0 = src1;
420 if (srcPtr - pLineSrc < m_nStride) {
421 src1 = *srcPtr++;
422 } else {
423 src1 = 0;
424 }
425 src = (((src0 << 8) | src1) >> s1) & 0xff;
426 dest &= src | m1;
427 *destPtr = (uint8_t)dest;
428 pLineDst += pDst->m_nStride;
429 pLineSrc += m_nStride;
430 }
431 } break;
432 case JBIG2_COMPOSE_XOR: {
433 for (yy = y0; yy < y1; ++yy) {
434 destPtr = pLineDst + (x >> 3);
435 srcPtr = pLineSrc;
436 src1 = *srcPtr++;
437 dest = *destPtr;
438 dest ^= src1 >> s1;
439 *destPtr++ = (uint8_t)dest;
440 xx = x0 + 8;
441 for (; xx < x1 - 8; xx += 8) {
442 dest = *destPtr;
443 src0 = src1;
444 src1 = *srcPtr++;
445 src = (((src0 << 8) | src1) >> s1) & 0xff;
446 dest ^= src;
447 *destPtr++ = (uint8_t)dest;
448 }
449 dest = *destPtr;
450 src0 = src1;
451 if (srcPtr - pLineSrc < m_nStride) {
452 src1 = *srcPtr++;
453 } else {
454 src1 = 0;
455 }
456 src = (((src0 << 8) | src1) >> s1) & 0xff;
457 dest ^= src & m2;
458 *destPtr = (uint8_t)dest;
459 pLineDst += pDst->m_nStride;
460 pLineSrc += m_nStride;
461 }
462 } break;
463 case JBIG2_COMPOSE_XNOR: {
464 for (yy = y0; yy < y1; ++yy) {
465 destPtr = pLineDst + (x >> 3);
466 srcPtr = pLineSrc;
467 src1 = *srcPtr++;
468 dest = *destPtr;
469 dest ^= (src1 ^ 0xff) >> s1;
470 *destPtr++ = (uint8_t)dest;
471 xx = x0 + 8;
472 for (; xx < x1 - 8; xx += 8) {
473 dest = *destPtr;
474 src0 = src1;
475 src1 = *srcPtr++;
476 src = (((src0 << 8) | src1) >> s1) & 0xff;
477 dest ^= src ^ 0xff;
478 *destPtr++ = (uint8_t)dest;
479 }
480 dest = *destPtr;
481 src0 = src1;
482 if (srcPtr - pLineSrc < m_nStride) {
483 src1 = *srcPtr++;
484 } else {
485 src1 = 0;
486 }
487 src = (((src0 << 8) | src1) >> s1) & 0xff;
488 dest ^= (src ^ 0xff) & m2;
489 *destPtr = (uint8_t)dest;
490 pLineDst += pDst->m_nStride;
491 pLineSrc += m_nStride;
492 }
493 } break;
494 case JBIG2_COMPOSE_REPLACE: {
495 for (yy = y0; yy < y1; ++yy) {
496 destPtr = pLineDst + (x >> 3);
497 srcPtr = pLineSrc;
498 src1 = *srcPtr++;
499 dest = *destPtr;
500 dest = (dest & (0xff << s2)) | (src1 >> s1);
501 *destPtr++ = (uint8_t)dest;
502 xx = x0 + 8;
503 for (; xx < x1 - 8; xx += 8) {
504 dest = *destPtr;
505 src0 = src1;
506 src1 = *srcPtr++;
507 src = (((src0 << 8) | src1) >> s1) & 0xff;
508 dest = src;
509 *destPtr++ = (uint8_t)dest;
510 }
511 dest = *destPtr;
512 src0 = src1;
513 if (srcPtr - pLineSrc < m_nStride) {
514 src1 = *srcPtr++;
515 } else {
516 src1 = 0;
517 }
518 src = (((src0 << 8) | src1) >> s1) & 0xff;
519 dest = (src & m2) | (dest & m1);
520 *destPtr = (uint8_t)dest;
521 pLineDst += pDst->m_nStride;
522 pLineSrc += m_nStride;
523 }
524 } break;
525 }
25 } else { 526 } else {
26 m_pData = NULL; 527 switch (op) {
528 case JBIG2_COMPOSE_OR: {
529 for (yy = y0; yy < y1; ++yy) {
530 destPtr = pLineDst;
531 srcPtr = pLineSrc + (-x >> 3);
532 src1 = *srcPtr++;
533 xx = x0;
534 for (; xx < x1 - 8; xx += 8) {
535 dest = *destPtr;
536 src0 = src1;
537 src1 = *srcPtr++;
538 src = (((src0 << 8) | src1) >> s1) & 0xff;
539 dest |= src;
540 *destPtr++ = (uint8_t)dest;
541 }
542 dest = *destPtr;
543 src0 = src1;
544 if (srcPtr - pLineSrc < m_nStride) {
545 src1 = *srcPtr++;
546 } else {
547 src1 = 0;
548 }
549 src = (((src0 << 8) | src1) >> s1) & 0xff;
550 dest |= src & m2;
551 *destPtr = (uint8_t)dest;
552 pLineDst += pDst->m_nStride;
553 pLineSrc += m_nStride;
554 }
555 } break;
556 case JBIG2_COMPOSE_AND: {
557 for (yy = y0; yy < y1; ++yy) {
558 destPtr = pLineDst;
559 srcPtr = pLineSrc + (-x >> 3);
560 src1 = *srcPtr++;
561 xx = x0;
562 for (; xx < x1 - 8; xx += 8) {
563 dest = *destPtr;
564 src0 = src1;
565 src1 = *srcPtr++;
566 src = (((src0 << 8) | src1) >> s1) & 0xff;
567 dest &= src;
568 *destPtr++ = (uint8_t)dest;
569 }
570 dest = *destPtr;
571 src0 = src1;
572 if (srcPtr - pLineSrc < m_nStride) {
573 src1 = *srcPtr++;
574 } else {
575 src1 = 0;
576 }
577 src = (((src0 << 8) | src1) >> s1) & 0xff;
578 dest &= src | m1;
579 *destPtr = (uint8_t)dest;
580 pLineDst += pDst->m_nStride;
581 pLineSrc += m_nStride;
582 }
583 } break;
584 case JBIG2_COMPOSE_XOR: {
585 for (yy = y0; yy < y1; ++yy) {
586 destPtr = pLineDst;
587 srcPtr = pLineSrc + (-x >> 3);
588 src1 = *srcPtr++;
589 xx = x0;
590 for (; xx < x1 - 8; xx += 8) {
591 dest = *destPtr;
592 src0 = src1;
593 src1 = *srcPtr++;
594 src = (((src0 << 8) | src1) >> s1) & 0xff;
595 dest ^= src;
596 *destPtr++ = (uint8_t)dest;
597 }
598 dest = *destPtr;
599 src0 = src1;
600 if (srcPtr - pLineSrc < m_nStride) {
601 src1 = *srcPtr++;
602 } else {
603 src1 = 0;
604 }
605 src = (((src0 << 8) | src1) >> s1) & 0xff;
606 dest ^= src & m2;
607 *destPtr = (uint8_t)dest;
608 pLineDst += pDst->m_nStride;
609 pLineSrc += m_nStride;
610 }
611 } break;
612 case JBIG2_COMPOSE_XNOR: {
613 for (yy = y0; yy < y1; ++yy) {
614 destPtr = pLineDst;
615 srcPtr = pLineSrc + (-x >> 3);
616 src1 = *srcPtr++;
617 xx = x0;
618 for (; xx < x1 - 8; xx += 8) {
619 dest = *destPtr;
620 src0 = src1;
621 src1 = *srcPtr++;
622 src = (((src0 << 8) | src1) >> s1) & 0xff;
623 dest ^= src ^ 0xff;
624 *destPtr++ = (uint8_t)dest;
625 }
626 dest = *destPtr;
627 src0 = src1;
628 if (srcPtr - pLineSrc < m_nStride) {
629 src1 = *srcPtr++;
630 } else {
631 src1 = 0;
632 }
633 src = (((src0 << 8) | src1) >> s1) & 0xff;
634 dest ^= (src ^ 0xff) & m2;
635 *destPtr = (uint8_t)dest;
636 pLineDst += pDst->m_nStride;
637 pLineSrc += m_nStride;
638 }
639 } break;
640 case JBIG2_COMPOSE_REPLACE: {
641 for (yy = y0; yy < y1; ++yy) {
642 destPtr = pLineDst;
643 srcPtr = pLineSrc + (-x >> 3);
644 src1 = *srcPtr++;
645 xx = x0;
646 for (; xx < x1 - 8; xx += 8) {
647 dest = *destPtr;
648 src0 = src1;
649 src1 = *srcPtr++;
650 src = (((src0 << 8) | src1) >> s1) & 0xff;
651 dest = src;
652 *destPtr++ = (uint8_t)dest;
653 }
654 dest = *destPtr;
655 src0 = src1;
656 if (srcPtr - pLineSrc < m_nStride) {
657 src1 = *srcPtr++;
658 } else {
659 src1 = 0;
660 }
661 src = (((src0 << 8) | src1) >> s1) & 0xff;
662 dest = (src & m2) | (dest & m1);
663 *destPtr = (uint8_t)dest;
664 pLineDst += pDst->m_nStride;
665 pLineSrc += m_nStride;
666 }
667 } break;
668 }
27 } 669 }
28 m_bNeedFree = TRUE; 670 }
29 } 671 return TRUE;
30 CJBig2_Image::CJBig2_Image(int32_t w, int32_t h, int32_t stride, uint8_t*pBuf) 672 }
31 { 673 FX_BOOL CJBig2_Image::composeFrom(int32_t x,
32 m_nWidth = w; 674 int32_t y,
33 m_nHeight = h; 675 CJBig2_Image* pSrc,
34 m_nStride = stride; 676 JBig2ComposeOp op) {
35 m_pData = pBuf; 677 if (!m_pData) {
36 m_bNeedFree = FALSE; 678 return FALSE;
37 } 679 }
38 CJBig2_Image::CJBig2_Image(CJBig2_Image &im) 680 return pSrc->composeTo(this, x, y, op);
39 { 681 }
40 m_pModule = im.m_pModule; 682 FX_BOOL CJBig2_Image::composeFrom(int32_t x,
41 m_nWidth» = im.m_nWidth; 683 int32_t y,
42 m_nHeight» = im.m_nHeight; 684 CJBig2_Image* pSrc,
43 m_nStride» = im.m_nStride; 685 JBig2ComposeOp op,
44 if (im.m_pData) { 686 const FX_RECT* pSrcRect) {
45 m_pData = (uint8_t*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight); 687 if (!m_pData) {
46 JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight); 688 return FALSE;
689 }
690 return pSrc->composeTo(this, x, y, op, pSrcRect);
691 }
692 CJBig2_Image* CJBig2_Image::subImage_unopt(int32_t x,
693 int32_t y,
694 int32_t w,
695 int32_t h) {
696 CJBig2_Image* pImage;
697 int32_t i, j;
698 JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
699 for (j = 0; j < h; j++) {
700 for (i = 0; i < w; i++) {
701 pImage->setPixel(i, j, getPixel(x + i, y + j));
702 }
703 }
704 return pImage;
705 }
706 #define JBIG2_GETDWORD(buf) \
707 ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]))
708 CJBig2_Image* CJBig2_Image::subImage(int32_t x,
709 int32_t y,
710 int32_t w,
711 int32_t h) {
712 CJBig2_Image* pImage;
713 int32_t m, n, j;
714 uint8_t *pLineSrc, *pLineDst;
715 FX_DWORD wTmp;
716 uint8_t *pSrc, *pSrcEnd, *pDst, *pDstEnd;
717 if (w == 0 || h == 0) {
718 return NULL;
719 }
720 JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
721 if (!m_pData) {
722 pImage->fill(0);
723 return pImage;
724 }
725 if (!pImage->m_pData) {
726 return pImage;
727 }
728 pLineSrc = m_pData + m_nStride * y;
729 pLineDst = pImage->m_pData;
730 m = (x >> 5) << 2;
731 n = x & 31;
732 if (n == 0) {
733 for (j = 0; j < h; j++) {
734 pSrc = pLineSrc + m;
735 pSrcEnd = pLineSrc + m_nStride;
736 pDst = pLineDst;
737 pDstEnd = pLineDst + pImage->m_nStride;
738 for (; pDst < pDstEnd; pSrc += 4, pDst += 4) {
739 *((FX_DWORD*)pDst) = *((FX_DWORD*)pSrc);
740 }
741 pLineSrc += m_nStride;
742 pLineDst += pImage->m_nStride;
743 }
744 } else {
745 for (j = 0; j < h; j++) {
746 pSrc = pLineSrc + m;
747 pSrcEnd = pLineSrc + m_nStride;
748 pDst = pLineDst;
749 pDstEnd = pLineDst + pImage->m_nStride;
750 for (; pDst < pDstEnd; pSrc += 4, pDst += 4) {
751 if (pSrc + 4 < pSrcEnd) {
752 wTmp = (JBIG2_GETDWORD(pSrc) << n) |
753 (JBIG2_GETDWORD(pSrc + 4) >> (32 - n));
754 } else {
755 wTmp = JBIG2_GETDWORD(pSrc) << n;
756 }
757 pDst[0] = (uint8_t)(wTmp >> 24);
758 pDst[1] = (uint8_t)(wTmp >> 16);
759 pDst[2] = (uint8_t)(wTmp >> 8);
760 pDst[3] = (uint8_t)wTmp;
761 }
762 pLineSrc += m_nStride;
763 pLineDst += pImage->m_nStride;
764 }
765 }
766 return pImage;
767 }
768 void CJBig2_Image::expand(int32_t h, FX_BOOL v) {
769 if (!m_pData || h <= m_nHeight) {
770 return;
771 }
772 FX_DWORD dwH = pdfium::base::checked_cast<FX_DWORD>(h);
773 FX_DWORD dwStride = pdfium::base::checked_cast<FX_DWORD>(m_nStride);
774 FX_DWORD dwHeight = pdfium::base::checked_cast<FX_DWORD>(m_nHeight);
775 FX_SAFE_DWORD safeMemSize = dwH;
776 safeMemSize *= dwStride;
777 if (!safeMemSize.IsValid()) {
778 return;
779 }
780 // The guaranteed reallocated memory is to be < 4GB (unsigned int).
781 m_pData =
782 (uint8_t*)m_pModule->JBig2_Realloc(m_pData, safeMemSize.ValueOrDie());
783 // The result of dwHeight * dwStride doesn't overflow after the
784 // checking of safeMemSize.
785 // The same as the result of (dwH - dwHeight) * dwStride) because
786 // dwH - dwHeight is always less than dwH(h) which is checked in
787 // the calculation of dwH * dwStride.
788 JBIG2_memset(m_pData + dwHeight * dwStride, v ? 0xff : 0,
789 (dwH - dwHeight) * dwStride);
790 m_nHeight = h;
791 }
792 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst,
793 int32_t x,
794 int32_t y,
795 JBig2ComposeOp op) {
796 int32_t xs0 = 0, ys0 = 0, xs1 = 0, ys1 = 0, xd0 = 0, yd0 = 0, xd1 = 0,
797 yd1 = 0, xx = 0, yy = 0, w = 0, h = 0, middleDwords = 0, lineLeft = 0;
798
799 FX_DWORD s1 = 0, d1 = 0, d2 = 0, shift = 0, shift1 = 0, shift2 = 0, tmp = 0,
800 tmp1 = 0, tmp2 = 0, maskL = 0, maskR = 0, maskM = 0;
801
802 uint8_t *lineSrc = NULL, *lineDst = NULL, *sp = NULL, *dp = NULL;
803
804 if (!m_pData) {
805 return FALSE;
806 }
807 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
808 return FALSE;
809 }
810 if (y < 0) {
811 ys0 = -y;
812 }
813 if (y + m_nHeight > pDst->m_nHeight) {
814 ys1 = pDst->m_nHeight - y;
815 } else {
816 ys1 = m_nHeight;
817 }
818 if (x < 0) {
819 xs0 = -x;
820 }
821 if (x + m_nWidth > pDst->m_nWidth) {
822 xs1 = pDst->m_nWidth - x;
823 } else {
824 xs1 = m_nWidth;
825 }
826 if ((ys0 >= ys1) || (xs0 >= xs1)) {
827 return 0;
828 }
829 w = xs1 - xs0;
830 h = ys1 - ys0;
831 if (y >= 0) {
832 yd0 = y;
833 }
834 if (x >= 0) {
835 xd0 = x;
836 }
837 xd1 = xd0 + w;
838 yd1 = yd0 + h;
839 d1 = xd0 & 31;
840 d2 = xd1 & 31;
841 s1 = xs0 & 31;
842 maskL = 0xffffffff >> d1;
843 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
844 maskM = maskL & maskR;
845 lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2);
846 lineLeft = m_nStride - ((xs0 >> 5) << 2);
847 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
848 if ((xd0 & ~31) == ((xd1 - 1) & ~31)) {
849 if ((xs0 & ~31) == ((xs1 - 1) & ~31)) {
850 if (s1 > d1) {
851 shift = s1 - d1;
852 for (yy = yd0; yy < yd1; yy++) {
853 tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
854 tmp2 = JBIG2_GETDWORD(lineDst);
855 switch (op) {
856 case JBIG2_COMPOSE_OR:
857 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
858 break;
859 case JBIG2_COMPOSE_AND:
860 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
861 break;
862 case JBIG2_COMPOSE_XOR:
863 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
864 break;
865 case JBIG2_COMPOSE_XNOR:
866 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
867 break;
868 case JBIG2_COMPOSE_REPLACE:
869 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
870 break;
871 }
872 lineDst[0] = (uint8_t)(tmp >> 24);
873 lineDst[1] = (uint8_t)(tmp >> 16);
874 lineDst[2] = (uint8_t)(tmp >> 8);
875 lineDst[3] = (uint8_t)tmp;
876 lineSrc += m_nStride;
877 lineDst += pDst->m_nStride;
878 }
879 } else {
880 shift = d1 - s1;
881 for (yy = yd0; yy < yd1; yy++) {
882 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
883 tmp2 = JBIG2_GETDWORD(lineDst);
884 switch (op) {
885 case JBIG2_COMPOSE_OR:
886 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
887 break;
888 case JBIG2_COMPOSE_AND:
889 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
890 break;
891 case JBIG2_COMPOSE_XOR:
892 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
893 break;
894 case JBIG2_COMPOSE_XNOR:
895 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
896 break;
897 case JBIG2_COMPOSE_REPLACE:
898 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
899 break;
900 }
901 lineDst[0] = (uint8_t)(tmp >> 24);
902 lineDst[1] = (uint8_t)(tmp >> 16);
903 lineDst[2] = (uint8_t)(tmp >> 8);
904 lineDst[3] = (uint8_t)tmp;
905 lineSrc += m_nStride;
906 lineDst += pDst->m_nStride;
907 }
908 }
47 } else { 909 } else {
48 m_pData = NULL; 910 shift1 = s1 - d1;
911 shift2 = 32 - shift1;
912 for (yy = yd0; yy < yd1; yy++) {
913 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) |
914 (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
915 tmp2 = JBIG2_GETDWORD(lineDst);
916 switch (op) {
917 case JBIG2_COMPOSE_OR:
918 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
919 break;
920 case JBIG2_COMPOSE_AND:
921 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
922 break;
923 case JBIG2_COMPOSE_XOR:
924 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
925 break;
926 case JBIG2_COMPOSE_XNOR:
927 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
928 break;
929 case JBIG2_COMPOSE_REPLACE:
930 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
931 break;
932 }
933 lineDst[0] = (uint8_t)(tmp >> 24);
934 lineDst[1] = (uint8_t)(tmp >> 16);
935 lineDst[2] = (uint8_t)(tmp >> 8);
936 lineDst[3] = (uint8_t)tmp;
937 lineSrc += m_nStride;
938 lineDst += pDst->m_nStride;
939 }
49 } 940 }
50 m_bNeedFree = TRUE; 941 } else {
51 } 942 if (s1 > d1) {
52 CJBig2_Image::~CJBig2_Image() 943 shift1 = s1 - d1;
53 { 944 shift2 = 32 - shift1;
54 if(m_bNeedFree && m_pData) { 945 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
55 m_pModule->JBig2_Free(m_pData); 946 for (yy = yd0; yy < yd1; yy++) {
947 sp = lineSrc;
948 dp = lineDst;
949 if (d1 != 0) {
950 tmp1 = (JBIG2_GETDWORD(sp) << shift1) |
951 (JBIG2_GETDWORD(sp + 4) >> shift2);
952 tmp2 = JBIG2_GETDWORD(dp);
953 switch (op) {
954 case JBIG2_COMPOSE_OR:
955 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
956 break;
957 case JBIG2_COMPOSE_AND:
958 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
959 break;
960 case JBIG2_COMPOSE_XOR:
961 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
962 break;
963 case JBIG2_COMPOSE_XNOR:
964 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
965 break;
966 case JBIG2_COMPOSE_REPLACE:
967 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
968 break;
969 }
970 dp[0] = (uint8_t)(tmp >> 24);
971 dp[1] = (uint8_t)(tmp >> 16);
972 dp[2] = (uint8_t)(tmp >> 8);
973 dp[3] = (uint8_t)tmp;
974 sp += 4;
975 dp += 4;
976 }
977 for (xx = 0; xx < middleDwords; xx++) {
978 tmp1 = (JBIG2_GETDWORD(sp) << shift1) |
979 (JBIG2_GETDWORD(sp + 4) >> shift2);
980 tmp2 = JBIG2_GETDWORD(dp);
981 switch (op) {
982 case JBIG2_COMPOSE_OR:
983 tmp = tmp1 | tmp2;
984 break;
985 case JBIG2_COMPOSE_AND:
986 tmp = tmp1 & tmp2;
987 break;
988 case JBIG2_COMPOSE_XOR:
989 tmp = tmp1 ^ tmp2;
990 break;
991 case JBIG2_COMPOSE_XNOR:
992 tmp = ~(tmp1 ^ tmp2);
993 break;
994 case JBIG2_COMPOSE_REPLACE:
995 tmp = tmp1;
996 break;
997 }
998 dp[0] = (uint8_t)(tmp >> 24);
999 dp[1] = (uint8_t)(tmp >> 16);
1000 dp[2] = (uint8_t)(tmp >> 8);
1001 dp[3] = (uint8_t)tmp;
1002 sp += 4;
1003 dp += 4;
1004 }
1005 if (d2 != 0) {
1006 tmp1 =
1007 (JBIG2_GETDWORD(sp) << shift1) |
1008 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >>
1009 shift2);
1010 tmp2 = JBIG2_GETDWORD(dp);
1011 switch (op) {
1012 case JBIG2_COMPOSE_OR:
1013 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1014 break;
1015 case JBIG2_COMPOSE_AND:
1016 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1017 break;
1018 case JBIG2_COMPOSE_XOR:
1019 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1020 break;
1021 case JBIG2_COMPOSE_XNOR:
1022 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1023 break;
1024 case JBIG2_COMPOSE_REPLACE:
1025 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1026 break;
1027 }
1028 dp[0] = (uint8_t)(tmp >> 24);
1029 dp[1] = (uint8_t)(tmp >> 16);
1030 dp[2] = (uint8_t)(tmp >> 8);
1031 dp[3] = (uint8_t)tmp;
1032 }
1033 lineSrc += m_nStride;
1034 lineDst += pDst->m_nStride;
1035 }
1036 } else if (s1 == d1) {
1037 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1038 for (yy = yd0; yy < yd1; yy++) {
1039 sp = lineSrc;
1040 dp = lineDst;
1041 if (d1 != 0) {
1042 tmp1 = JBIG2_GETDWORD(sp);
1043 tmp2 = JBIG2_GETDWORD(dp);
1044 switch (op) {
1045 case JBIG2_COMPOSE_OR:
1046 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1047 break;
1048 case JBIG2_COMPOSE_AND:
1049 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1050 break;
1051 case JBIG2_COMPOSE_XOR:
1052 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1053 break;
1054 case JBIG2_COMPOSE_XNOR:
1055 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1056 break;
1057 case JBIG2_COMPOSE_REPLACE:
1058 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1059 break;
1060 }
1061 dp[0] = (uint8_t)(tmp >> 24);
1062 dp[1] = (uint8_t)(tmp >> 16);
1063 dp[2] = (uint8_t)(tmp >> 8);
1064 dp[3] = (uint8_t)tmp;
1065 sp += 4;
1066 dp += 4;
1067 }
1068 for (xx = 0; xx < middleDwords; xx++) {
1069 tmp1 = JBIG2_GETDWORD(sp);
1070 tmp2 = JBIG2_GETDWORD(dp);
1071 switch (op) {
1072 case JBIG2_COMPOSE_OR:
1073 tmp = tmp1 | tmp2;
1074 break;
1075 case JBIG2_COMPOSE_AND:
1076 tmp = tmp1 & tmp2;
1077 break;
1078 case JBIG2_COMPOSE_XOR:
1079 tmp = tmp1 ^ tmp2;
1080 break;
1081 case JBIG2_COMPOSE_XNOR:
1082 tmp = ~(tmp1 ^ tmp2);
1083 break;
1084 case JBIG2_COMPOSE_REPLACE:
1085 tmp = tmp1;
1086 break;
1087 }
1088 dp[0] = (uint8_t)(tmp >> 24);
1089 dp[1] = (uint8_t)(tmp >> 16);
1090 dp[2] = (uint8_t)(tmp >> 8);
1091 dp[3] = (uint8_t)tmp;
1092 sp += 4;
1093 dp += 4;
1094 }
1095 if (d2 != 0) {
1096 tmp1 = JBIG2_GETDWORD(sp);
1097 tmp2 = JBIG2_GETDWORD(dp);
1098 switch (op) {
1099 case JBIG2_COMPOSE_OR:
1100 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1101 break;
1102 case JBIG2_COMPOSE_AND:
1103 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1104 break;
1105 case JBIG2_COMPOSE_XOR:
1106 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1107 break;
1108 case JBIG2_COMPOSE_XNOR:
1109 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1110 break;
1111 case JBIG2_COMPOSE_REPLACE:
1112 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1113 break;
1114 }
1115 dp[0] = (uint8_t)(tmp >> 24);
1116 dp[1] = (uint8_t)(tmp >> 16);
1117 dp[2] = (uint8_t)(tmp >> 8);
1118 dp[3] = (uint8_t)tmp;
1119 }
1120 lineSrc += m_nStride;
1121 lineDst += pDst->m_nStride;
1122 }
1123 } else {
1124 shift1 = d1 - s1;
1125 shift2 = 32 - shift1;
1126 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1127 for (yy = yd0; yy < yd1; yy++) {
1128 sp = lineSrc;
1129 dp = lineDst;
1130 if (d1 != 0) {
1131 tmp1 = JBIG2_GETDWORD(sp) >> shift1;
1132 tmp2 = JBIG2_GETDWORD(dp);
1133 switch (op) {
1134 case JBIG2_COMPOSE_OR:
1135 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1136 break;
1137 case JBIG2_COMPOSE_AND:
1138 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1139 break;
1140 case JBIG2_COMPOSE_XOR:
1141 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1142 break;
1143 case JBIG2_COMPOSE_XNOR:
1144 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1145 break;
1146 case JBIG2_COMPOSE_REPLACE:
1147 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1148 break;
1149 }
1150 dp[0] = (uint8_t)(tmp >> 24);
1151 dp[1] = (uint8_t)(tmp >> 16);
1152 dp[2] = (uint8_t)(tmp >> 8);
1153 dp[3] = (uint8_t)tmp;
1154 dp += 4;
1155 }
1156 for (xx = 0; xx < middleDwords; xx++) {
1157 tmp1 = (JBIG2_GETDWORD(sp) << shift2) |
1158 ((JBIG2_GETDWORD(sp + 4)) >> shift1);
1159 tmp2 = JBIG2_GETDWORD(dp);
1160 switch (op) {
1161 case JBIG2_COMPOSE_OR:
1162 tmp = tmp1 | tmp2;
1163 break;
1164 case JBIG2_COMPOSE_AND:
1165 tmp = tmp1 & tmp2;
1166 break;
1167 case JBIG2_COMPOSE_XOR:
1168 tmp = tmp1 ^ tmp2;
1169 break;
1170 case JBIG2_COMPOSE_XNOR:
1171 tmp = ~(tmp1 ^ tmp2);
1172 break;
1173 case JBIG2_COMPOSE_REPLACE:
1174 tmp = tmp1;
1175 break;
1176 }
1177 dp[0] = (uint8_t)(tmp >> 24);
1178 dp[1] = (uint8_t)(tmp >> 16);
1179 dp[2] = (uint8_t)(tmp >> 8);
1180 dp[3] = (uint8_t)tmp;
1181 sp += 4;
1182 dp += 4;
1183 }
1184 if (d2 != 0) {
1185 tmp1 =
1186 (JBIG2_GETDWORD(sp) << shift2) |
1187 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >>
1188 shift1);
1189 tmp2 = JBIG2_GETDWORD(dp);
1190 switch (op) {
1191 case JBIG2_COMPOSE_OR:
1192 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1193 break;
1194 case JBIG2_COMPOSE_AND:
1195 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1196 break;
1197 case JBIG2_COMPOSE_XOR:
1198 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1199 break;
1200 case JBIG2_COMPOSE_XNOR:
1201 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1202 break;
1203 case JBIG2_COMPOSE_REPLACE:
1204 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1205 break;
1206 }
1207 dp[0] = (uint8_t)(tmp >> 24);
1208 dp[1] = (uint8_t)(tmp >> 16);
1209 dp[2] = (uint8_t)(tmp >> 8);
1210 dp[3] = (uint8_t)tmp;
1211 }
1212 lineSrc += m_nStride;
1213 lineDst += pDst->m_nStride;
1214 }
56 } 1215 }
57 } 1216 }
58 FX_BOOL CJBig2_Image::getPixel(int32_t x, int32_t y) 1217 return 1;
59 { 1218 }
60 if (!m_pData) { 1219 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst,
61 return 0; 1220 int32_t x,
1221 int32_t y,
1222 JBig2ComposeOp op,
1223 const FX_RECT* pSrcRect) {
1224 int32_t xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords,
1225 lineLeft;
1226 FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR,
1227 maskM;
1228 uint8_t *lineSrc, *lineDst, *sp, *dp;
1229 int32_t sw, sh;
1230 if (!m_pData) {
1231 return FALSE;
1232 }
1233 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
1234 return FALSE;
1235 }
1236 sw = pSrcRect->Width();
1237 sh = pSrcRect->Height();
1238 if (y < 0) {
1239 ys0 = -y;
1240 } else {
1241 ys0 = 0;
1242 }
1243 if (y + sh > pDst->m_nHeight) {
1244 ys1 = pDst->m_nHeight - y;
1245 } else {
1246 ys1 = sh;
1247 }
1248 if (x < 0) {
1249 xs0 = -x;
1250 } else {
1251 xs0 = 0;
1252 }
1253 if (x + sw > pDst->m_nWidth) {
1254 xs1 = pDst->m_nWidth - x;
1255 } else {
1256 xs1 = sw;
1257 }
1258 if ((ys0 >= ys1) || (xs0 >= xs1)) {
1259 return 0;
1260 }
1261 w = xs1 - xs0;
1262 h = ys1 - ys0;
1263 if (y < 0) {
1264 yd0 = 0;
1265 } else {
1266 yd0 = y;
1267 }
1268 if (x < 0) {
1269 xd0 = 0;
1270 } else {
1271 xd0 = x;
1272 }
1273 xd1 = xd0 + w;
1274 yd1 = yd0 + h;
1275 d1 = xd0 & 31;
1276 d2 = xd1 & 31;
1277 s1 = xs0 & 31;
1278 maskL = 0xffffffff >> d1;
1279 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
1280 maskM = maskL & maskR;
1281 lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride +
1282 (((xs0 + pSrcRect->left) >> 5) << 2);
1283 lineLeft = m_nStride - ((xs0 >> 5) << 2);
1284 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
1285 if ((xd0 & ~31) == ((xd1 - 1) & ~31)) {
1286 if ((xs0 & ~31) == ((xs1 - 1) & ~31)) {
1287 if (s1 > d1) {
1288 shift = s1 - d1;
1289 for (yy = yd0; yy < yd1; yy++) {
1290 tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
1291 tmp2 = JBIG2_GETDWORD(lineDst);
1292 switch (op) {
1293 case JBIG2_COMPOSE_OR:
1294 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
1295 break;
1296 case JBIG2_COMPOSE_AND:
1297 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
1298 break;
1299 case JBIG2_COMPOSE_XOR:
1300 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
1301 break;
1302 case JBIG2_COMPOSE_XNOR:
1303 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
1304 break;
1305 case JBIG2_COMPOSE_REPLACE:
1306 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
1307 break;
1308 }
1309 lineDst[0] = (uint8_t)(tmp >> 24);
1310 lineDst[1] = (uint8_t)(tmp >> 16);
1311 lineDst[2] = (uint8_t)(tmp >> 8);
1312 lineDst[3] = (uint8_t)tmp;
1313 lineSrc += m_nStride;
1314 lineDst += pDst->m_nStride;
1315 }
1316 } else {
1317 shift = d1 - s1;
1318 for (yy = yd0; yy < yd1; yy++) {
1319 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
1320 tmp2 = JBIG2_GETDWORD(lineDst);
1321 switch (op) {
1322 case JBIG2_COMPOSE_OR:
1323 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
1324 break;
1325 case JBIG2_COMPOSE_AND:
1326 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
1327 break;
1328 case JBIG2_COMPOSE_XOR:
1329 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
1330 break;
1331 case JBIG2_COMPOSE_XNOR:
1332 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
1333 break;
1334 case JBIG2_COMPOSE_REPLACE:
1335 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
1336 break;
1337 }
1338 lineDst[0] = (uint8_t)(tmp >> 24);
1339 lineDst[1] = (uint8_t)(tmp >> 16);
1340 lineDst[2] = (uint8_t)(tmp >> 8);
1341 lineDst[3] = (uint8_t)tmp;
1342 lineSrc += m_nStride;
1343 lineDst += pDst->m_nStride;
1344 }
1345 }
1346 } else {
1347 shift1 = s1 - d1;
1348 shift2 = 32 - shift1;
1349 for (yy = yd0; yy < yd1; yy++) {
1350 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) |
1351 (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
1352 tmp2 = JBIG2_GETDWORD(lineDst);
1353 switch (op) {
1354 case JBIG2_COMPOSE_OR:
1355 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
1356 break;
1357 case JBIG2_COMPOSE_AND:
1358 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
1359 break;
1360 case JBIG2_COMPOSE_XOR:
1361 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
1362 break;
1363 case JBIG2_COMPOSE_XNOR:
1364 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
1365 break;
1366 case JBIG2_COMPOSE_REPLACE:
1367 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
1368 break;
1369 }
1370 lineDst[0] = (uint8_t)(tmp >> 24);
1371 lineDst[1] = (uint8_t)(tmp >> 16);
1372 lineDst[2] = (uint8_t)(tmp >> 8);
1373 lineDst[3] = (uint8_t)tmp;
1374 lineSrc += m_nStride;
1375 lineDst += pDst->m_nStride;
1376 }
62 } 1377 }
63 int32_t m, n; 1378 } else {
64 if(x < 0 || x >= m_nWidth) { 1379 if (s1 > d1) {
65 return 0; 1380 shift1 = s1 - d1;
1381 shift2 = 32 - shift1;
1382 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1383 for (yy = yd0; yy < yd1; yy++) {
1384 sp = lineSrc;
1385 dp = lineDst;
1386 if (d1 != 0) {
1387 tmp1 = (JBIG2_GETDWORD(sp) << shift1) |
1388 (JBIG2_GETDWORD(sp + 4) >> shift2);
1389 tmp2 = JBIG2_GETDWORD(dp);
1390 switch (op) {
1391 case JBIG2_COMPOSE_OR:
1392 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1393 break;
1394 case JBIG2_COMPOSE_AND:
1395 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1396 break;
1397 case JBIG2_COMPOSE_XOR:
1398 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1399 break;
1400 case JBIG2_COMPOSE_XNOR:
1401 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1402 break;
1403 case JBIG2_COMPOSE_REPLACE:
1404 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1405 break;
1406 }
1407 dp[0] = (uint8_t)(tmp >> 24);
1408 dp[1] = (uint8_t)(tmp >> 16);
1409 dp[2] = (uint8_t)(tmp >> 8);
1410 dp[3] = (uint8_t)tmp;
1411 sp += 4;
1412 dp += 4;
1413 }
1414 for (xx = 0; xx < middleDwords; xx++) {
1415 tmp1 = (JBIG2_GETDWORD(sp) << shift1) |
1416 (JBIG2_GETDWORD(sp + 4) >> shift2);
1417 tmp2 = JBIG2_GETDWORD(dp);
1418 switch (op) {
1419 case JBIG2_COMPOSE_OR:
1420 tmp = tmp1 | tmp2;
1421 break;
1422 case JBIG2_COMPOSE_AND:
1423 tmp = tmp1 & tmp2;
1424 break;
1425 case JBIG2_COMPOSE_XOR:
1426 tmp = tmp1 ^ tmp2;
1427 break;
1428 case JBIG2_COMPOSE_XNOR:
1429 tmp = ~(tmp1 ^ tmp2);
1430 break;
1431 case JBIG2_COMPOSE_REPLACE:
1432 tmp = tmp1;
1433 break;
1434 }
1435 dp[0] = (uint8_t)(tmp >> 24);
1436 dp[1] = (uint8_t)(tmp >> 16);
1437 dp[2] = (uint8_t)(tmp >> 8);
1438 dp[3] = (uint8_t)tmp;
1439 sp += 4;
1440 dp += 4;
1441 }
1442 if (d2 != 0) {
1443 tmp1 =
1444 (JBIG2_GETDWORD(sp) << shift1) |
1445 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >>
1446 shift2);
1447 tmp2 = JBIG2_GETDWORD(dp);
1448 switch (op) {
1449 case JBIG2_COMPOSE_OR:
1450 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1451 break;
1452 case JBIG2_COMPOSE_AND:
1453 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1454 break;
1455 case JBIG2_COMPOSE_XOR:
1456 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1457 break;
1458 case JBIG2_COMPOSE_XNOR:
1459 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1460 break;
1461 case JBIG2_COMPOSE_REPLACE:
1462 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1463 break;
1464 }
1465 dp[0] = (uint8_t)(tmp >> 24);
1466 dp[1] = (uint8_t)(tmp >> 16);
1467 dp[2] = (uint8_t)(tmp >> 8);
1468 dp[3] = (uint8_t)tmp;
1469 }
1470 lineSrc += m_nStride;
1471 lineDst += pDst->m_nStride;
1472 }
1473 } else if (s1 == d1) {
1474 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1475 for (yy = yd0; yy < yd1; yy++) {
1476 sp = lineSrc;
1477 dp = lineDst;
1478 if (d1 != 0) {
1479 tmp1 = JBIG2_GETDWORD(sp);
1480 tmp2 = JBIG2_GETDWORD(dp);
1481 switch (op) {
1482 case JBIG2_COMPOSE_OR:
1483 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1484 break;
1485 case JBIG2_COMPOSE_AND:
1486 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1487 break;
1488 case JBIG2_COMPOSE_XOR:
1489 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1490 break;
1491 case JBIG2_COMPOSE_XNOR:
1492 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1493 break;
1494 case JBIG2_COMPOSE_REPLACE:
1495 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1496 break;
1497 }
1498 dp[0] = (uint8_t)(tmp >> 24);
1499 dp[1] = (uint8_t)(tmp >> 16);
1500 dp[2] = (uint8_t)(tmp >> 8);
1501 dp[3] = (uint8_t)tmp;
1502 sp += 4;
1503 dp += 4;
1504 }
1505 for (xx = 0; xx < middleDwords; xx++) {
1506 tmp1 = JBIG2_GETDWORD(sp);
1507 tmp2 = JBIG2_GETDWORD(dp);
1508 switch (op) {
1509 case JBIG2_COMPOSE_OR:
1510 tmp = tmp1 | tmp2;
1511 break;
1512 case JBIG2_COMPOSE_AND:
1513 tmp = tmp1 & tmp2;
1514 break;
1515 case JBIG2_COMPOSE_XOR:
1516 tmp = tmp1 ^ tmp2;
1517 break;
1518 case JBIG2_COMPOSE_XNOR:
1519 tmp = ~(tmp1 ^ tmp2);
1520 break;
1521 case JBIG2_COMPOSE_REPLACE:
1522 tmp = tmp1;
1523 break;
1524 }
1525 dp[0] = (uint8_t)(tmp >> 24);
1526 dp[1] = (uint8_t)(tmp >> 16);
1527 dp[2] = (uint8_t)(tmp >> 8);
1528 dp[3] = (uint8_t)tmp;
1529 sp += 4;
1530 dp += 4;
1531 }
1532 if (d2 != 0) {
1533 tmp1 = JBIG2_GETDWORD(sp);
1534 tmp2 = JBIG2_GETDWORD(dp);
1535 switch (op) {
1536 case JBIG2_COMPOSE_OR:
1537 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1538 break;
1539 case JBIG2_COMPOSE_AND:
1540 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1541 break;
1542 case JBIG2_COMPOSE_XOR:
1543 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1544 break;
1545 case JBIG2_COMPOSE_XNOR:
1546 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1547 break;
1548 case JBIG2_COMPOSE_REPLACE:
1549 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1550 break;
1551 }
1552 dp[0] = (uint8_t)(tmp >> 24);
1553 dp[1] = (uint8_t)(tmp >> 16);
1554 dp[2] = (uint8_t)(tmp >> 8);
1555 dp[3] = (uint8_t)tmp;
1556 }
1557 lineSrc += m_nStride;
1558 lineDst += pDst->m_nStride;
1559 }
1560 } else {
1561 shift1 = d1 - s1;
1562 shift2 = 32 - shift1;
1563 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1564 for (yy = yd0; yy < yd1; yy++) {
1565 sp = lineSrc;
1566 dp = lineDst;
1567 if (d1 != 0) {
1568 tmp1 = JBIG2_GETDWORD(sp) >> shift1;
1569 tmp2 = JBIG2_GETDWORD(dp);
1570 switch (op) {
1571 case JBIG2_COMPOSE_OR:
1572 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1573 break;
1574 case JBIG2_COMPOSE_AND:
1575 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1576 break;
1577 case JBIG2_COMPOSE_XOR:
1578 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1579 break;
1580 case JBIG2_COMPOSE_XNOR:
1581 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1582 break;
1583 case JBIG2_COMPOSE_REPLACE:
1584 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1585 break;
1586 }
1587 dp[0] = (uint8_t)(tmp >> 24);
1588 dp[1] = (uint8_t)(tmp >> 16);
1589 dp[2] = (uint8_t)(tmp >> 8);
1590 dp[3] = (uint8_t)tmp;
1591 dp += 4;
1592 }
1593 for (xx = 0; xx < middleDwords; xx++) {
1594 tmp1 = (JBIG2_GETDWORD(sp) << shift2) |
1595 ((JBIG2_GETDWORD(sp + 4)) >> shift1);
1596 tmp2 = JBIG2_GETDWORD(dp);
1597 switch (op) {
1598 case JBIG2_COMPOSE_OR:
1599 tmp = tmp1 | tmp2;
1600 break;
1601 case JBIG2_COMPOSE_AND:
1602 tmp = tmp1 & tmp2;
1603 break;
1604 case JBIG2_COMPOSE_XOR:
1605 tmp = tmp1 ^ tmp2;
1606 break;
1607 case JBIG2_COMPOSE_XNOR:
1608 tmp = ~(tmp1 ^ tmp2);
1609 break;
1610 case JBIG2_COMPOSE_REPLACE:
1611 tmp = tmp1;
1612 break;
1613 }
1614 dp[0] = (uint8_t)(tmp >> 24);
1615 dp[1] = (uint8_t)(tmp >> 16);
1616 dp[2] = (uint8_t)(tmp >> 8);
1617 dp[3] = (uint8_t)tmp;
1618 sp += 4;
1619 dp += 4;
1620 }
1621 if (d2 != 0) {
1622 tmp1 =
1623 (JBIG2_GETDWORD(sp) << shift2) |
1624 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >>
1625 shift1);
1626 tmp2 = JBIG2_GETDWORD(dp);
1627 switch (op) {
1628 case JBIG2_COMPOSE_OR:
1629 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1630 break;
1631 case JBIG2_COMPOSE_AND:
1632 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1633 break;
1634 case JBIG2_COMPOSE_XOR:
1635 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1636 break;
1637 case JBIG2_COMPOSE_XNOR:
1638 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1639 break;
1640 case JBIG2_COMPOSE_REPLACE:
1641 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1642 break;
1643 }
1644 dp[0] = (uint8_t)(tmp >> 24);
1645 dp[1] = (uint8_t)(tmp >> 16);
1646 dp[2] = (uint8_t)(tmp >> 8);
1647 dp[3] = (uint8_t)tmp;
1648 }
1649 lineSrc += m_nStride;
1650 lineDst += pDst->m_nStride;
1651 }
66 } 1652 }
67 if(y < 0 || y >= m_nHeight) { 1653 }
68 return 0; 1654 return 1;
69 } 1655 }
70 m = y * m_nStride + (x >> 3);
71 n = x & 7;
72 return ((m_pData[m] >> (7 - n)) & 1);
73 }
74
75 int32_t CJBig2_Image::setPixel(int32_t x, int32_t y, FX_BOOL v)
76 {
77 if (!m_pData) {
78 return 0;
79 }
80 int32_t m, n;
81 if(x < 0 || x >= m_nWidth) {
82 return 0;
83 }
84 if(y < 0 || y >= m_nHeight) {
85 return 0;
86 }
87 m = y * m_nStride + (x >> 3);
88 n = x & 7;
89 if(v) {
90 m_pData[m] |= 1 << (7 - n);
91 } else {
92 m_pData[m] &= ~(1 << (7 - n));
93 }
94 return 1;
95 }
96 void CJBig2_Image::copyLine(int32_t hTo, int32_t hFrom)
97 {
98 if (!m_pData) {
99 return;
100 }
101 if(hFrom < 0 || hFrom >= m_nHeight) {
102 JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride);
103 } else {
104 JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_n Stride);
105 }
106 }
107 void CJBig2_Image::fill(FX_BOOL v)
108 {
109 if (!m_pData) {
110 return;
111 }
112 JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight);
113 }
114 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2C omposeOp op)
115 {
116 if (!m_pData) {
117 return FALSE;
118 }
119 return composeTo_opt2(pDst, x, y, op);
120 }
121 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2C omposeOp op, const FX_RECT* pSrcRect)
122 {
123 if (!m_pData) {
124 return FALSE;
125 }
126 if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) {
127 return composeTo_opt2(pDst, x, y, op);
128 }
129 return composeTo_opt2(pDst, x, y, op, pSrcRect);
130 }
131 FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op)
132 {
133 int32_t w, h, dx, dy;
134 int32_t i, j;
135 w = m_nWidth;
136 h = m_nHeight;
137 dx = dy = 0;
138 if(x < 0) {
139 dx += -x;
140 w -= -x;
141 x = 0;
142 }
143 if(y < 0) {
144 dy += -y;
145 h -= -y;
146 y = 0;
147 }
148 if(x + w > pDst->m_nWidth) {
149 w = pDst->m_nWidth - x;
150 }
151 if(y + h > pDst->m_nHeight) {
152 h = pDst->m_nHeight - y;
153 }
154 switch(op) {
155 case JBIG2_COMPOSE_OR:
156 for(j = 0; j < h; j++) {
157 for(i = 0; i < w; i++) {
158 pDst->setPixel(x + i, y + j,
159 (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1);
160 }
161 }
162 break;
163 case JBIG2_COMPOSE_AND:
164 for(j = 0; j < h; j++) {
165 for(i = 0; i < w; i++) {
166 pDst->setPixel(x + i, y + j,
167 (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1);
168 }
169 }
170 break;
171 case JBIG2_COMPOSE_XOR:
172 for(j = 0; j < h; j++) {
173 for(i = 0; i < w; i++) {
174 pDst->setPixel(x + i, y + j,
175 (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1);
176 }
177 }
178 break;
179 case JBIG2_COMPOSE_XNOR:
180 for(j = 0; j < h; j++) {
181 for(i = 0; i < w; i++) {
182 pDst->setPixel(x + i, y + j,
183 (~(getPixel(i + dx, j + dy) ^ pDst->getPixel( x + i, y + j))) & 1);
184 }
185 }
186 break;
187 case JBIG2_COMPOSE_REPLACE:
188 for(j = 0; j < h; j++) {
189 for(i = 0; i < w; i++) {
190 pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy));
191 }
192 }
193 break;
194 }
195 return TRUE;
196 }
197
198 FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, int32_t x, int32_t y, JB ig2ComposeOp op)
199 {
200 int32_t x0, x1, y0, y1, xx, yy;
201 uint8_t *pLineSrc, *pLineDst, *srcPtr, *destPtr;
202 FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3;
203 FX_BOOL oneByte;
204 if (!m_pData) {
205 return FALSE;
206 }
207 if (y < 0) {
208 y0 = -y;
209 } else {
210 y0 = 0;
211 }
212 if (y + m_nHeight > pDst->m_nHeight) {
213 y1 = pDst->m_nHeight - y;
214 } else {
215 y1 = m_nHeight;
216 }
217 if (y0 >= y1) {
218 return FALSE;
219 }
220 if (x >= 0) {
221 x0 = x & ~7;
222 } else {
223 x0 = 0;
224 }
225 x1 = x + m_nWidth;
226 if (x1 > pDst->m_nWidth) {
227 x1 = pDst->m_nWidth;
228 }
229 if (x0 >= x1) {
230 return FALSE;
231 }
232 s1 = x & 7;
233 s2 = 8 - s1;
234 m1 = 0xff >> (x1 & 7);
235 m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));
236 m3 = (0xff >> s1) & m2;
237 oneByte = x0 == ((x1 - 1) & ~7);
238 pLineDst = pDst->m_pData + y * pDst->m_nStride;
239 pLineSrc = m_pData + y0 * m_nStride;
240 if(oneByte) {
241 if(x >= 0) {
242 switch(op) {
243 case JBIG2_COMPOSE_OR: {
244 for (yy = y0; yy < y1; ++yy) {
245 destPtr = pLineDst + (x >> 3);
246 srcPtr = pLineSrc;
247 dest = *destPtr;
248 dest |= (*srcPtr >> s1) & m2;
249 *destPtr = (uint8_t)dest;
250 pLineDst += pDst->m_nStride;
251 pLineSrc += m_nStride;
252 }
253 }
254 break;
255 case JBIG2_COMPOSE_AND: {
256 for (yy = y0; yy < y1; ++yy) {
257 destPtr = pLineDst + (x >> 3);
258 srcPtr = pLineSrc;
259 dest = *destPtr;
260 dest &= ((0xff00 | *srcPtr) >> s1) | m1;
261 *destPtr = (uint8_t)dest;
262 pLineDst += pDst->m_nStride;
263 pLineSrc += m_nStride;
264 }
265 }
266 break;
267 case JBIG2_COMPOSE_XOR: {
268 for (yy = y0; yy < y1; ++yy) {
269 destPtr = pLineDst + (x >> 3);
270 srcPtr = pLineSrc;
271 dest = *destPtr;
272 dest ^= (*srcPtr >> s1) & m2;
273 *destPtr = (uint8_t)dest;
274 pLineDst += pDst->m_nStride;
275 pLineSrc += m_nStride;
276 }
277 }
278 break;
279 case JBIG2_COMPOSE_XNOR: {
280 for (yy = y0; yy < y1; ++yy) {
281 destPtr = pLineDst + (x >> 3);
282 srcPtr = pLineSrc;
283 dest = *destPtr;
284 dest ^= ((*srcPtr ^ 0xff) >> s1) & m2;
285 *destPtr = (uint8_t)dest;
286 pLineDst += pDst->m_nStride;
287 pLineSrc += m_nStride;
288 }
289 }
290 break;
291 case JBIG2_COMPOSE_REPLACE: {
292 for (yy = y0; yy < y1; ++yy) {
293 destPtr = pLineDst + (x >> 3);
294 srcPtr = pLineSrc;
295 dest = *destPtr;
296 dest = (dest & ~m3) | ((*srcPtr >> s1) & m3);
297 *destPtr = (uint8_t)dest;
298 pLineDst += pDst->m_nStride;
299 pLineSrc += m_nStride;
300 }
301 }
302 break;
303 }
304 } else {
305 switch(op) {
306 case JBIG2_COMPOSE_OR: {
307 for(yy = y0; yy < y1; ++yy) {
308 destPtr = pLineDst;
309 srcPtr = pLineSrc + (-x >> 3);
310 dest = *destPtr;
311 dest |= *srcPtr & m2;
312 *destPtr = (uint8_t)dest;
313 pLineDst += pDst->m_nStride;
314 pLineSrc += m_nStride;
315 }
316 }
317 break;
318 case JBIG2_COMPOSE_AND: {
319 for(yy = y0; yy < y1; ++yy) {
320 destPtr = pLineDst;
321 srcPtr = pLineSrc + (-x >> 3);
322 dest = *destPtr;
323 dest &= *srcPtr | m1;
324 *destPtr = (uint8_t)dest;
325 pLineDst += pDst->m_nStride;
326 pLineSrc += m_nStride;
327 }
328 }
329 break;
330 case JBIG2_COMPOSE_XOR: {
331 for(yy = y0; yy < y1; ++yy) {
332 destPtr = pLineDst;
333 srcPtr = pLineSrc + (-x >> 3);
334 dest = *destPtr;
335 dest ^= *srcPtr & m2;
336 *destPtr = (uint8_t)dest;
337 pLineDst += pDst->m_nStride;
338 pLineSrc += m_nStride;
339 }
340 }
341 break;
342 case JBIG2_COMPOSE_XNOR: {
343 for(yy = y0; yy < y1; ++yy) {
344 destPtr = pLineDst;
345 srcPtr = pLineSrc + (-x >> 3);
346 dest = *destPtr;
347 dest ^= (*srcPtr ^ 0xff) & m2;
348 *destPtr = (uint8_t)dest;
349 pLineDst += pDst->m_nStride;
350 pLineSrc += m_nStride;
351 }
352 }
353 break;
354 case JBIG2_COMPOSE_REPLACE: {
355 for(yy = y0; yy < y1; ++yy) {
356 destPtr = pLineDst;
357 srcPtr = pLineSrc + (-x >> 3);
358 dest = *destPtr;
359 dest = (*srcPtr & m2) | (dest & m1);
360 *destPtr = (uint8_t)dest;
361 pLineDst += pDst->m_nStride;
362 pLineSrc += m_nStride;
363 }
364 }
365 break;
366 }
367 }
368 } else {
369 if(x >= 0) {
370 switch(op) {
371 case JBIG2_COMPOSE_OR: {
372 for(yy = y0; yy < y1; ++yy) {
373 destPtr = pLineDst + (x >> 3);
374 srcPtr = pLineSrc;
375 src1 = *srcPtr++;
376 dest = *destPtr;
377 dest |= src1 >> s1;
378 *destPtr++ = (uint8_t)dest;
379 xx = x0 + 8;
380 for (; xx < x1 - 8; xx += 8) {
381 dest = *destPtr;
382 src0 = src1;
383 src1 = *srcPtr++;
384 src = (((src0 << 8) | src1) >> s1) & 0xff;
385 dest |= src;
386 *destPtr++ = (uint8_t)dest;
387 }
388 dest = *destPtr;
389 src0 = src1;
390 if(srcPtr - pLineSrc < m_nStride) {
391 src1 = *srcPtr++;
392 } else {
393 src1 = 0;
394 }
395 src = (((src0 << 8) | src1) >> s1) & 0xff;
396 dest |= src & m2;
397 *destPtr = (uint8_t)dest;
398 pLineDst += pDst->m_nStride;
399 pLineSrc += m_nStride;
400 }
401 }
402 break;
403 case JBIG2_COMPOSE_AND: {
404 for(yy = y0; yy < y1; ++yy) {
405 destPtr = pLineDst + (x >> 3);
406 srcPtr = pLineSrc;
407 src1 = *srcPtr++;
408 dest = *destPtr;
409 dest &= (0xff00 | src1) >> s1;
410 *destPtr++ = (uint8_t)dest;
411 xx = x0 + 8;
412 for (; xx < x1 - 8; xx += 8) {
413 dest = *destPtr;
414 src0 = src1;
415 src1 = *srcPtr++;
416 src = (((src0 << 8) | src1) >> s1) & 0xff;
417 dest &= src;
418 *destPtr++ = (uint8_t)dest;
419 }
420 dest = *destPtr;
421 src0 = src1;
422 if(srcPtr - pLineSrc < m_nStride) {
423 src1 = *srcPtr++;
424 } else {
425 src1 = 0;
426 }
427 src = (((src0 << 8) | src1) >> s1) & 0xff;
428 dest &= src | m1;
429 *destPtr = (uint8_t)dest;
430 pLineDst += pDst->m_nStride;
431 pLineSrc += m_nStride;
432 }
433 }
434 break;
435 case JBIG2_COMPOSE_XOR: {
436 for(yy = y0; yy < y1; ++yy) {
437 destPtr = pLineDst + (x >> 3);
438 srcPtr = pLineSrc;
439 src1 = *srcPtr++;
440 dest = *destPtr;
441 dest ^= src1 >> s1;
442 *destPtr++ = (uint8_t)dest;
443 xx = x0 + 8;
444 for (; xx < x1 - 8; xx += 8) {
445 dest = *destPtr;
446 src0 = src1;
447 src1 = *srcPtr++;
448 src = (((src0 << 8) | src1) >> s1) & 0xff;
449 dest ^= src;
450 *destPtr++ = (uint8_t)dest;
451 }
452 dest = *destPtr;
453 src0 = src1;
454 if(srcPtr - pLineSrc < m_nStride) {
455 src1 = *srcPtr++;
456 } else {
457 src1 = 0;
458 }
459 src = (((src0 << 8) | src1) >> s1) & 0xff;
460 dest ^= src & m2;
461 *destPtr = (uint8_t)dest;
462 pLineDst += pDst->m_nStride;
463 pLineSrc += m_nStride;
464 }
465 }
466 break;
467 case JBIG2_COMPOSE_XNOR: {
468 for(yy = y0; yy < y1; ++yy) {
469 destPtr = pLineDst + (x >> 3);
470 srcPtr = pLineSrc;
471 src1 = *srcPtr++;
472 dest = *destPtr;
473 dest ^= (src1 ^ 0xff) >> s1;
474 *destPtr++ = (uint8_t)dest;
475 xx = x0 + 8;
476 for (; xx < x1 - 8; xx += 8) {
477 dest = *destPtr;
478 src0 = src1;
479 src1 = *srcPtr++;
480 src = (((src0 << 8) | src1) >> s1) & 0xff;
481 dest ^= src ^ 0xff;
482 *destPtr++ = (uint8_t)dest;
483 }
484 dest = *destPtr;
485 src0 = src1;
486 if(srcPtr - pLineSrc < m_nStride) {
487 src1 = *srcPtr++;
488 } else {
489 src1 = 0;
490 }
491 src = (((src0 << 8) | src1) >> s1) & 0xff;
492 dest ^= (src ^ 0xff) & m2;
493 *destPtr = (uint8_t)dest;
494 pLineDst += pDst->m_nStride;
495 pLineSrc += m_nStride;
496 }
497 }
498 break;
499 case JBIG2_COMPOSE_REPLACE: {
500 for(yy = y0; yy < y1; ++yy) {
501 destPtr = pLineDst + (x >> 3);
502 srcPtr = pLineSrc;
503 src1 = *srcPtr++;
504 dest = *destPtr;
505 dest = (dest & (0xff << s2)) | (src1 >> s1);
506 *destPtr++ = (uint8_t)dest;
507 xx = x0 + 8;
508 for (; xx < x1 - 8; xx += 8) {
509 dest = *destPtr;
510 src0 = src1;
511 src1 = *srcPtr++;
512 src = (((src0 << 8) | src1) >> s1) & 0xff;
513 dest = src;
514 *destPtr++ = (uint8_t)dest;
515 }
516 dest = *destPtr;
517 src0 = src1;
518 if(srcPtr - pLineSrc < m_nStride) {
519 src1 = *srcPtr++;
520 } else {
521 src1 = 0;
522 }
523 src = (((src0 << 8) | src1) >> s1) & 0xff;
524 dest = (src & m2) | (dest & m1);
525 *destPtr = (uint8_t)dest;
526 pLineDst += pDst->m_nStride;
527 pLineSrc += m_nStride;
528 }
529 }
530 break;
531 }
532 } else {
533 switch(op) {
534 case JBIG2_COMPOSE_OR: {
535 for(yy = y0; yy < y1; ++yy) {
536 destPtr = pLineDst;
537 srcPtr = pLineSrc + (-x >> 3);
538 src1 = *srcPtr++;
539 xx = x0;
540 for (; xx < x1 - 8; xx += 8) {
541 dest = *destPtr;
542 src0 = src1;
543 src1 = *srcPtr++;
544 src = (((src0 << 8) | src1) >> s1) & 0xff;
545 dest |= src;
546 *destPtr++ = (uint8_t)dest;
547 }
548 dest = *destPtr;
549 src0 = src1;
550 if(srcPtr - pLineSrc < m_nStride) {
551 src1 = *srcPtr++;
552 } else {
553 src1 = 0;
554 }
555 src = (((src0 << 8) | src1) >> s1) & 0xff;
556 dest |= src & m2;
557 *destPtr = (uint8_t)dest;
558 pLineDst += pDst->m_nStride;
559 pLineSrc += m_nStride;
560 }
561 }
562 break;
563 case JBIG2_COMPOSE_AND: {
564 for(yy = y0; yy < y1; ++yy) {
565 destPtr = pLineDst;
566 srcPtr = pLineSrc + (-x >> 3);
567 src1 = *srcPtr++;
568 xx = x0;
569 for (; xx < x1 - 8; xx += 8) {
570 dest = *destPtr;
571 src0 = src1;
572 src1 = *srcPtr++;
573 src = (((src0 << 8) | src1) >> s1) & 0xff;
574 dest &= src;
575 *destPtr++ = (uint8_t)dest;
576 }
577 dest = *destPtr;
578 src0 = src1;
579 if(srcPtr - pLineSrc < m_nStride) {
580 src1 = *srcPtr++;
581 } else {
582 src1 = 0;
583 }
584 src = (((src0 << 8) | src1) >> s1) & 0xff;
585 dest &= src | m1;
586 *destPtr = (uint8_t)dest;
587 pLineDst += pDst->m_nStride;
588 pLineSrc += m_nStride;
589 }
590 }
591 break;
592 case JBIG2_COMPOSE_XOR: {
593 for(yy = y0; yy < y1; ++yy) {
594 destPtr = pLineDst;
595 srcPtr = pLineSrc + (-x >> 3);
596 src1 = *srcPtr++;
597 xx = x0;
598 for (; xx < x1 - 8; xx += 8) {
599 dest = *destPtr;
600 src0 = src1;
601 src1 = *srcPtr++;
602 src = (((src0 << 8) | src1) >> s1) & 0xff;
603 dest ^= src;
604 *destPtr++ = (uint8_t)dest;
605 }
606 dest = *destPtr;
607 src0 = src1;
608 if(srcPtr - pLineSrc < m_nStride) {
609 src1 = *srcPtr++;
610 } else {
611 src1 = 0;
612 }
613 src = (((src0 << 8) | src1) >> s1) & 0xff;
614 dest ^= src & m2;
615 *destPtr = (uint8_t)dest;
616 pLineDst += pDst->m_nStride;
617 pLineSrc += m_nStride;
618 }
619 }
620 break;
621 case JBIG2_COMPOSE_XNOR: {
622 for(yy = y0; yy < y1; ++yy) {
623 destPtr = pLineDst;
624 srcPtr = pLineSrc + (-x >> 3);
625 src1 = *srcPtr++;
626 xx = x0;
627 for (; xx < x1 - 8; xx += 8) {
628 dest = *destPtr;
629 src0 = src1;
630 src1 = *srcPtr++;
631 src = (((src0 << 8) | src1) >> s1) & 0xff;
632 dest ^= src ^ 0xff;
633 *destPtr++ = (uint8_t)dest;
634 }
635 dest = *destPtr;
636 src0 = src1;
637 if(srcPtr - pLineSrc < m_nStride) {
638 src1 = *srcPtr++;
639 } else {
640 src1 = 0;
641 }
642 src = (((src0 << 8) | src1) >> s1) & 0xff;
643 dest ^= (src ^ 0xff) & m2;
644 *destPtr = (uint8_t)dest;
645 pLineDst += pDst->m_nStride;
646 pLineSrc += m_nStride;
647 }
648 }
649 break;
650 case JBIG2_COMPOSE_REPLACE: {
651 for(yy = y0; yy < y1; ++yy) {
652 destPtr = pLineDst;
653 srcPtr = pLineSrc + (-x >> 3);
654 src1 = *srcPtr++;
655 xx = x0;
656 for (; xx < x1 - 8; xx += 8) {
657 dest = *destPtr;
658 src0 = src1;
659 src1 = *srcPtr++;
660 src = (((src0 << 8) | src1) >> s1) & 0xff;
661 dest = src;
662 *destPtr++ = (uint8_t)dest;
663 }
664 dest = *destPtr;
665 src0 = src1;
666 if(srcPtr - pLineSrc < m_nStride) {
667 src1 = *srcPtr++;
668 } else {
669 src1 = 0;
670 }
671 src = (((src0 << 8) | src1) >> s1) & 0xff;
672 dest = (src & m2) | (dest & m1);
673 *destPtr = (uint8_t)dest;
674 pLineDst += pDst->m_nStride;
675 pLineSrc += m_nStride;
676 }
677 }
678 break;
679 }
680 }
681 }
682 return TRUE;
683 }
684 FX_BOOL CJBig2_Image::composeFrom(int32_t x, int32_t y, CJBig2_Image *pSrc, JBig 2ComposeOp op)
685 {
686 if (!m_pData) {
687 return FALSE;
688 }
689 return pSrc->composeTo(this, x, y, op);
690 }
691 FX_BOOL CJBig2_Image::composeFrom(int32_t x, int32_t y, CJBig2_Image *pSrc, JBig 2ComposeOp op, const FX_RECT* pSrcRect)
692 {
693 if (!m_pData) {
694 return FALSE;
695 }
696 return pSrc->composeTo(this, x, y, op, pSrcRect);
697 }
698 CJBig2_Image *CJBig2_Image::subImage_unopt(int32_t x, int32_t y, int32_t w, int3 2_t h)
699 {
700 CJBig2_Image *pImage;
701 int32_t i, j;
702 JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
703 for(j = 0; j < h; j++) {
704 for(i = 0; i < w; i++) {
705 pImage->setPixel(i, j, getPixel(x + i, y + j));
706 }
707 }
708 return pImage;
709 }
710 #define JBIG2_GETDWORD(buf) ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]))
711 CJBig2_Image *CJBig2_Image::subImage(int32_t x, int32_t y, int32_t w, int32_t h)
712 {
713 CJBig2_Image *pImage;
714 int32_t m, n, j;
715 uint8_t *pLineSrc, *pLineDst;
716 FX_DWORD wTmp;
717 uint8_t *pSrc, *pSrcEnd, *pDst, *pDstEnd;
718 if (w == 0 || h == 0) {
719 return NULL;
720 }
721 JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
722 if (!m_pData) {
723 pImage->fill(0);
724 return pImage;
725 }
726 if (!pImage->m_pData) {
727 return pImage;
728 }
729 pLineSrc = m_pData + m_nStride * y;
730 pLineDst = pImage->m_pData;
731 m = (x >> 5) << 2;
732 n = x & 31;
733 if(n == 0) {
734 for(j = 0; j < h; j++) {
735 pSrc = pLineSrc + m;
736 pSrcEnd = pLineSrc + m_nStride;
737 pDst = pLineDst;
738 pDstEnd = pLineDst + pImage->m_nStride;
739 for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
740 *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc);
741 }
742 pLineSrc += m_nStride;
743 pLineDst += pImage->m_nStride;
744 }
745 } else {
746 for(j = 0; j < h; j++) {
747 pSrc = pLineSrc + m;
748 pSrcEnd = pLineSrc + m_nStride;
749 pDst = pLineDst;
750 pDstEnd = pLineDst + pImage->m_nStride;
751 for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
752 if(pSrc + 4 < pSrcEnd) {
753 wTmp = (JBIG2_GETDWORD(pSrc) << n) | (JBIG2_GETDWORD(pSrc + 4) >> (32 - n));
754 } else {
755 wTmp = JBIG2_GETDWORD(pSrc) << n;
756 }
757 pDst[0] = (uint8_t)(wTmp >> 24);
758 pDst[1] = (uint8_t)(wTmp >> 16);
759 pDst[2] = (uint8_t)(wTmp >> 8);
760 pDst[3] = (uint8_t)wTmp;
761 }
762 pLineSrc += m_nStride;
763 pLineDst += pImage->m_nStride;
764 }
765 }
766 return pImage;
767 }
768 void CJBig2_Image::expand(int32_t h, FX_BOOL v)
769 {
770 if (!m_pData || h <= m_nHeight) {
771 return;
772 }
773 FX_DWORD dwH = pdfium::base::checked_cast<FX_DWORD>(h);
774 FX_DWORD dwStride = pdfium::base::checked_cast<FX_DWORD>(m_nStride);
775 FX_DWORD dwHeight = pdfium::base::checked_cast<FX_DWORD>(m_nHeight);
776 FX_SAFE_DWORD safeMemSize = dwH;
777 safeMemSize *= dwStride;
778 if (!safeMemSize.IsValid()) {
779 return;
780 }
781 //The guaranteed reallocated memory is to be < 4GB (unsigned int).
782 m_pData = (uint8_t*)m_pModule->JBig2_Realloc(m_pData, safeMemSize.ValueOrDie ());
783 //The result of dwHeight * dwStride doesn't overflow after the
784 //checking of safeMemSize.
785 //The same as the result of (dwH - dwHeight) * dwStride) because
786 //dwH - dwHeight is always less than dwH(h) which is checked in
787 //the calculation of dwH * dwStride.
788 JBIG2_memset(m_pData + dwHeight * dwStride, v ? 0xff : 0, (dwH - dwHeight) * dwStride);
789 m_nHeight = h;
790 }
791 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, int32_t x, int32_t y, J Big2ComposeOp op)
792 {
793 int32_t xs0 = 0, ys0 = 0, xs1 = 0, ys1 = 0, xd0 = 0, yd0 = 0 , xd1 = 0,
794 yd1 = 0, xx = 0, yy = 0, w = 0, h = 0, middleDwords = 0, lineLeft = 0;
795
796 FX_DWORD s1 = 0, d1 = 0, d2 = 0, shift = 0, shift1 = 0, shift2 = 0,
797 tmp = 0, tmp1 = 0, tmp2 = 0, maskL = 0, maskR = 0, maskM = 0;
798
799 uint8_t *lineSrc = NULL, *lineDst = NULL, *sp = NULL, *dp = NULL;
800
801 if (!m_pData) {
802 return FALSE;
803 }
804 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
805 return FALSE;
806 }
807 if(y < 0) {
808 ys0 = -y;
809 }
810 if(y + m_nHeight > pDst->m_nHeight) {
811 ys1 = pDst->m_nHeight - y;
812 } else {
813 ys1 = m_nHeight;
814 }
815 if(x < 0) {
816 xs0 = -x;
817 }
818 if(x + m_nWidth > pDst->m_nWidth) {
819 xs1 = pDst->m_nWidth - x;
820 } else {
821 xs1 = m_nWidth;
822 }
823 if((ys0 >= ys1) || (xs0 >= xs1)) {
824 return 0;
825 }
826 w = xs1 - xs0;
827 h = ys1 - ys0;
828 if(y >= 0) {
829 yd0 = y;
830 }
831 if(x >= 0) {
832 xd0 = x;
833 }
834 xd1 = xd0 + w;
835 yd1 = yd0 + h;
836 d1 = xd0 & 31;
837 d2 = xd1 & 31;
838 s1 = xs0 & 31;
839 maskL = 0xffffffff >> d1;
840 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
841 maskM = maskL & maskR;
842 lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2);
843 lineLeft = m_nStride - ((xs0 >> 5) << 2);
844 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
845 if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
846 if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
847 if(s1 > d1) {
848 shift = s1 - d1;
849 for(yy = yd0; yy < yd1; yy++) {
850 tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
851 tmp2 = JBIG2_GETDWORD(lineDst);
852 switch(op) {
853 case JBIG2_COMPOSE_OR:
854 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
855 break;
856 case JBIG2_COMPOSE_AND:
857 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
858 break;
859 case JBIG2_COMPOSE_XOR:
860 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
861 break;
862 case JBIG2_COMPOSE_XNOR:
863 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
864 break;
865 case JBIG2_COMPOSE_REPLACE:
866 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
867 break;
868 }
869 lineDst[0] = (uint8_t)(tmp >> 24);
870 lineDst[1] = (uint8_t)(tmp >> 16);
871 lineDst[2] = (uint8_t)(tmp >> 8);
872 lineDst[3] = (uint8_t)tmp;
873 lineSrc += m_nStride;
874 lineDst += pDst->m_nStride;
875 }
876 } else {
877 shift = d1 - s1;
878 for(yy = yd0; yy < yd1; yy++) {
879 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
880 tmp2 = JBIG2_GETDWORD(lineDst);
881 switch(op) {
882 case JBIG2_COMPOSE_OR:
883 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
884 break;
885 case JBIG2_COMPOSE_AND:
886 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
887 break;
888 case JBIG2_COMPOSE_XOR:
889 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
890 break;
891 case JBIG2_COMPOSE_XNOR:
892 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
893 break;
894 case JBIG2_COMPOSE_REPLACE:
895 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
896 break;
897 }
898 lineDst[0] = (uint8_t)(tmp >> 24);
899 lineDst[1] = (uint8_t)(tmp >> 16);
900 lineDst[2] = (uint8_t)(tmp >> 8);
901 lineDst[3] = (uint8_t)tmp;
902 lineSrc += m_nStride;
903 lineDst += pDst->m_nStride;
904 }
905 }
906 } else {
907 shift1 = s1 - d1;
908 shift2 = 32 - shift1;
909 for(yy = yd0; yy < yd1; yy++) {
910 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lin eSrc + 4) >> shift2);
911 tmp2 = JBIG2_GETDWORD(lineDst);
912 switch(op) {
913 case JBIG2_COMPOSE_OR:
914 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
915 break;
916 case JBIG2_COMPOSE_AND:
917 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
918 break;
919 case JBIG2_COMPOSE_XOR:
920 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
921 break;
922 case JBIG2_COMPOSE_XNOR:
923 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
924 break;
925 case JBIG2_COMPOSE_REPLACE:
926 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
927 break;
928 }
929 lineDst[0] = (uint8_t)(tmp >> 24);
930 lineDst[1] = (uint8_t)(tmp >> 16);
931 lineDst[2] = (uint8_t)(tmp >> 8);
932 lineDst[3] = (uint8_t)tmp;
933 lineSrc += m_nStride;
934 lineDst += pDst->m_nStride;
935 }
936 }
937 } else {
938 if(s1 > d1) {
939 shift1 = s1 - d1;
940 shift2 = 32 - shift1;
941 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
942 for(yy = yd0; yy < yd1; yy++) {
943 sp = lineSrc;
944 dp = lineDst;
945 if(d1 != 0) {
946 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
947 tmp2 = JBIG2_GETDWORD(dp);
948 switch(op) {
949 case JBIG2_COMPOSE_OR:
950 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
951 break;
952 case JBIG2_COMPOSE_AND:
953 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
954 break;
955 case JBIG2_COMPOSE_XOR:
956 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
957 break;
958 case JBIG2_COMPOSE_XNOR:
959 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
960 break;
961 case JBIG2_COMPOSE_REPLACE:
962 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
963 break;
964 }
965 dp[0] = (uint8_t)(tmp >> 24);
966 dp[1] = (uint8_t)(tmp >> 16);
967 dp[2] = (uint8_t)(tmp >> 8);
968 dp[3] = (uint8_t)tmp;
969 sp += 4;
970 dp += 4;
971 }
972 for(xx = 0; xx < middleDwords; xx++) {
973 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
974 tmp2 = JBIG2_GETDWORD(dp);
975 switch(op) {
976 case JBIG2_COMPOSE_OR:
977 tmp = tmp1 | tmp2;
978 break;
979 case JBIG2_COMPOSE_AND:
980 tmp = tmp1 & tmp2;
981 break;
982 case JBIG2_COMPOSE_XOR:
983 tmp = tmp1 ^ tmp2;
984 break;
985 case JBIG2_COMPOSE_XNOR:
986 tmp = ~(tmp1 ^ tmp2);
987 break;
988 case JBIG2_COMPOSE_REPLACE:
989 tmp = tmp1;
990 break;
991 }
992 dp[0] = (uint8_t)(tmp >> 24);
993 dp[1] = (uint8_t)(tmp >> 16);
994 dp[2] = (uint8_t)(tmp >> 8);
995 dp[3] = (uint8_t)tmp;
996 sp += 4;
997 dp += 4;
998 }
999 if(d2 != 0) {
1000 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
1001 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(s p + 4) : 0) >> shift2);
1002 tmp2 = JBIG2_GETDWORD(dp);
1003 switch(op) {
1004 case JBIG2_COMPOSE_OR:
1005 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1006 break;
1007 case JBIG2_COMPOSE_AND:
1008 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1009 break;
1010 case JBIG2_COMPOSE_XOR:
1011 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1012 break;
1013 case JBIG2_COMPOSE_XNOR:
1014 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1015 break;
1016 case JBIG2_COMPOSE_REPLACE:
1017 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1018 break;
1019 }
1020 dp[0] = (uint8_t)(tmp >> 24);
1021 dp[1] = (uint8_t)(tmp >> 16);
1022 dp[2] = (uint8_t)(tmp >> 8);
1023 dp[3] = (uint8_t)tmp;
1024 }
1025 lineSrc += m_nStride;
1026 lineDst += pDst->m_nStride;
1027 }
1028 } else if(s1 == d1) {
1029 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1030 for(yy = yd0; yy < yd1; yy++) {
1031 sp = lineSrc;
1032 dp = lineDst;
1033 if(d1 != 0) {
1034 tmp1 = JBIG2_GETDWORD(sp);
1035 tmp2 = JBIG2_GETDWORD(dp);
1036 switch(op) {
1037 case JBIG2_COMPOSE_OR:
1038 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1039 break;
1040 case JBIG2_COMPOSE_AND:
1041 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1042 break;
1043 case JBIG2_COMPOSE_XOR:
1044 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1045 break;
1046 case JBIG2_COMPOSE_XNOR:
1047 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1048 break;
1049 case JBIG2_COMPOSE_REPLACE:
1050 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1051 break;
1052 }
1053 dp[0] = (uint8_t)(tmp >> 24);
1054 dp[1] = (uint8_t)(tmp >> 16);
1055 dp[2] = (uint8_t)(tmp >> 8);
1056 dp[3] = (uint8_t)tmp;
1057 sp += 4;
1058 dp += 4;
1059 }
1060 for(xx = 0; xx < middleDwords; xx++) {
1061 tmp1 = JBIG2_GETDWORD(sp);
1062 tmp2 = JBIG2_GETDWORD(dp);
1063 switch(op) {
1064 case JBIG2_COMPOSE_OR:
1065 tmp = tmp1 | tmp2;
1066 break;
1067 case JBIG2_COMPOSE_AND:
1068 tmp = tmp1 & tmp2;
1069 break;
1070 case JBIG2_COMPOSE_XOR:
1071 tmp = tmp1 ^ tmp2;
1072 break;
1073 case JBIG2_COMPOSE_XNOR:
1074 tmp = ~(tmp1 ^ tmp2);
1075 break;
1076 case JBIG2_COMPOSE_REPLACE:
1077 tmp = tmp1;
1078 break;
1079 }
1080 dp[0] = (uint8_t)(tmp >> 24);
1081 dp[1] = (uint8_t)(tmp >> 16);
1082 dp[2] = (uint8_t)(tmp >> 8);
1083 dp[3] = (uint8_t)tmp;
1084 sp += 4;
1085 dp += 4;
1086 }
1087 if(d2 != 0) {
1088 tmp1 = JBIG2_GETDWORD(sp);
1089 tmp2 = JBIG2_GETDWORD(dp);
1090 switch(op) {
1091 case JBIG2_COMPOSE_OR:
1092 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1093 break;
1094 case JBIG2_COMPOSE_AND:
1095 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1096 break;
1097 case JBIG2_COMPOSE_XOR:
1098 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1099 break;
1100 case JBIG2_COMPOSE_XNOR:
1101 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1102 break;
1103 case JBIG2_COMPOSE_REPLACE:
1104 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1105 break;
1106 }
1107 dp[0] = (uint8_t)(tmp >> 24);
1108 dp[1] = (uint8_t)(tmp >> 16);
1109 dp[2] = (uint8_t)(tmp >> 8);
1110 dp[3] = (uint8_t)tmp;
1111 }
1112 lineSrc += m_nStride;
1113 lineDst += pDst->m_nStride;
1114 }
1115 } else {
1116 shift1 = d1 - s1;
1117 shift2 = 32 - shift1;
1118 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1119 for(yy = yd0; yy < yd1; yy++) {
1120 sp = lineSrc;
1121 dp = lineDst;
1122 if(d1 != 0) {
1123 tmp1 = JBIG2_GETDWORD(sp) >> shift1;
1124 tmp2 = JBIG2_GETDWORD(dp);
1125 switch(op) {
1126 case JBIG2_COMPOSE_OR:
1127 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1128 break;
1129 case JBIG2_COMPOSE_AND:
1130 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1131 break;
1132 case JBIG2_COMPOSE_XOR:
1133 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1134 break;
1135 case JBIG2_COMPOSE_XNOR:
1136 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1137 break;
1138 case JBIG2_COMPOSE_REPLACE:
1139 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1140 break;
1141 }
1142 dp[0] = (uint8_t)(tmp >> 24);
1143 dp[1] = (uint8_t)(tmp >> 16);
1144 dp[2] = (uint8_t)(tmp >> 8);
1145 dp[3] = (uint8_t)tmp;
1146 dp += 4;
1147 }
1148 for(xx = 0; xx < middleDwords; xx++) {
1149 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
1150 tmp2 = JBIG2_GETDWORD(dp);
1151 switch(op) {
1152 case JBIG2_COMPOSE_OR:
1153 tmp = tmp1 | tmp2;
1154 break;
1155 case JBIG2_COMPOSE_AND:
1156 tmp = tmp1 & tmp2;
1157 break;
1158 case JBIG2_COMPOSE_XOR:
1159 tmp = tmp1 ^ tmp2;
1160 break;
1161 case JBIG2_COMPOSE_XNOR:
1162 tmp = ~(tmp1 ^ tmp2);
1163 break;
1164 case JBIG2_COMPOSE_REPLACE:
1165 tmp = tmp1;
1166 break;
1167 }
1168 dp[0] = (uint8_t)(tmp >> 24);
1169 dp[1] = (uint8_t)(tmp >> 16);
1170 dp[2] = (uint8_t)(tmp >> 8);
1171 dp[3] = (uint8_t)tmp;
1172 sp += 4;
1173 dp += 4;
1174 }
1175 if(d2 != 0) {
1176 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
1177 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(s p + 4) : 0) >> shift1);
1178 tmp2 = JBIG2_GETDWORD(dp);
1179 switch(op) {
1180 case JBIG2_COMPOSE_OR:
1181 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1182 break;
1183 case JBIG2_COMPOSE_AND:
1184 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1185 break;
1186 case JBIG2_COMPOSE_XOR:
1187 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1188 break;
1189 case JBIG2_COMPOSE_XNOR:
1190 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1191 break;
1192 case JBIG2_COMPOSE_REPLACE:
1193 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1194 break;
1195 }
1196 dp[0] = (uint8_t)(tmp >> 24);
1197 dp[1] = (uint8_t)(tmp >> 16);
1198 dp[2] = (uint8_t)(tmp >> 8);
1199 dp[3] = (uint8_t)tmp;
1200 }
1201 lineSrc += m_nStride;
1202 lineDst += pDst->m_nStride;
1203 }
1204 }
1205 }
1206 return 1;
1207 }
1208 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, int32_t x, int32_t y, J Big2ComposeOp op, const FX_RECT* pSrcRect)
1209 {
1210 int32_t xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;
1211 FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, m askM;
1212 uint8_t *lineSrc, *lineDst, *sp, *dp;
1213 int32_t sw, sh;
1214 if (!m_pData) {
1215 return FALSE;
1216 }
1217 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
1218 return FALSE;
1219 }
1220 sw = pSrcRect->Width();
1221 sh = pSrcRect->Height();
1222 if(y < 0) {
1223 ys0 = -y;
1224 } else {
1225 ys0 = 0;
1226 }
1227 if(y + sh > pDst->m_nHeight) {
1228 ys1 = pDst->m_nHeight - y;
1229 } else {
1230 ys1 = sh;
1231 }
1232 if(x < 0) {
1233 xs0 = -x;
1234 } else {
1235 xs0 = 0;
1236 }
1237 if(x + sw > pDst->m_nWidth) {
1238 xs1 = pDst->m_nWidth - x;
1239 } else {
1240 xs1 = sw;
1241 }
1242 if((ys0 >= ys1) || (xs0 >= xs1)) {
1243 return 0;
1244 }
1245 w = xs1 - xs0;
1246 h = ys1 - ys0;
1247 if(y < 0) {
1248 yd0 = 0;
1249 } else {
1250 yd0 = y;
1251 }
1252 if(x < 0) {
1253 xd0 = 0;
1254 } else {
1255 xd0 = x;
1256 }
1257 xd1 = xd0 + w;
1258 yd1 = yd0 + h;
1259 d1 = xd0 & 31;
1260 d2 = xd1 & 31;
1261 s1 = xs0 & 31;
1262 maskL = 0xffffffff >> d1;
1263 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
1264 maskM = maskL & maskR;
1265 lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + (((xs0 + pSrcRect->l eft) >> 5) << 2);
1266 lineLeft = m_nStride - ((xs0 >> 5) << 2);
1267 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
1268 if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
1269 if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
1270 if(s1 > d1) {
1271 shift = s1 - d1;
1272 for(yy = yd0; yy < yd1; yy++) {
1273 tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
1274 tmp2 = JBIG2_GETDWORD(lineDst);
1275 switch(op) {
1276 case JBIG2_COMPOSE_OR:
1277 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
1278 break;
1279 case JBIG2_COMPOSE_AND:
1280 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
1281 break;
1282 case JBIG2_COMPOSE_XOR:
1283 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
1284 break;
1285 case JBIG2_COMPOSE_XNOR:
1286 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
1287 break;
1288 case JBIG2_COMPOSE_REPLACE:
1289 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
1290 break;
1291 }
1292 lineDst[0] = (uint8_t)(tmp >> 24);
1293 lineDst[1] = (uint8_t)(tmp >> 16);
1294 lineDst[2] = (uint8_t)(tmp >> 8);
1295 lineDst[3] = (uint8_t)tmp;
1296 lineSrc += m_nStride;
1297 lineDst += pDst->m_nStride;
1298 }
1299 } else {
1300 shift = d1 - s1;
1301 for(yy = yd0; yy < yd1; yy++) {
1302 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
1303 tmp2 = JBIG2_GETDWORD(lineDst);
1304 switch(op) {
1305 case JBIG2_COMPOSE_OR:
1306 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
1307 break;
1308 case JBIG2_COMPOSE_AND:
1309 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
1310 break;
1311 case JBIG2_COMPOSE_XOR:
1312 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
1313 break;
1314 case JBIG2_COMPOSE_XNOR:
1315 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
1316 break;
1317 case JBIG2_COMPOSE_REPLACE:
1318 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
1319 break;
1320 }
1321 lineDst[0] = (uint8_t)(tmp >> 24);
1322 lineDst[1] = (uint8_t)(tmp >> 16);
1323 lineDst[2] = (uint8_t)(tmp >> 8);
1324 lineDst[3] = (uint8_t)tmp;
1325 lineSrc += m_nStride;
1326 lineDst += pDst->m_nStride;
1327 }
1328 }
1329 } else {
1330 shift1 = s1 - d1;
1331 shift2 = 32 - shift1;
1332 for(yy = yd0; yy < yd1; yy++) {
1333 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lin eSrc + 4) >> shift2);
1334 tmp2 = JBIG2_GETDWORD(lineDst);
1335 switch(op) {
1336 case JBIG2_COMPOSE_OR:
1337 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
1338 break;
1339 case JBIG2_COMPOSE_AND:
1340 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
1341 break;
1342 case JBIG2_COMPOSE_XOR:
1343 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
1344 break;
1345 case JBIG2_COMPOSE_XNOR:
1346 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
1347 break;
1348 case JBIG2_COMPOSE_REPLACE:
1349 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
1350 break;
1351 }
1352 lineDst[0] = (uint8_t)(tmp >> 24);
1353 lineDst[1] = (uint8_t)(tmp >> 16);
1354 lineDst[2] = (uint8_t)(tmp >> 8);
1355 lineDst[3] = (uint8_t)tmp;
1356 lineSrc += m_nStride;
1357 lineDst += pDst->m_nStride;
1358 }
1359 }
1360 } else {
1361 if(s1 > d1) {
1362 shift1 = s1 - d1;
1363 shift2 = 32 - shift1;
1364 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1365 for(yy = yd0; yy < yd1; yy++) {
1366 sp = lineSrc;
1367 dp = lineDst;
1368 if(d1 != 0) {
1369 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
1370 tmp2 = JBIG2_GETDWORD(dp);
1371 switch(op) {
1372 case JBIG2_COMPOSE_OR:
1373 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1374 break;
1375 case JBIG2_COMPOSE_AND:
1376 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1377 break;
1378 case JBIG2_COMPOSE_XOR:
1379 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1380 break;
1381 case JBIG2_COMPOSE_XNOR:
1382 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1383 break;
1384 case JBIG2_COMPOSE_REPLACE:
1385 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1386 break;
1387 }
1388 dp[0] = (uint8_t)(tmp >> 24);
1389 dp[1] = (uint8_t)(tmp >> 16);
1390 dp[2] = (uint8_t)(tmp >> 8);
1391 dp[3] = (uint8_t)tmp;
1392 sp += 4;
1393 dp += 4;
1394 }
1395 for(xx = 0; xx < middleDwords; xx++) {
1396 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
1397 tmp2 = JBIG2_GETDWORD(dp);
1398 switch(op) {
1399 case JBIG2_COMPOSE_OR:
1400 tmp = tmp1 | tmp2;
1401 break;
1402 case JBIG2_COMPOSE_AND:
1403 tmp = tmp1 & tmp2;
1404 break;
1405 case JBIG2_COMPOSE_XOR:
1406 tmp = tmp1 ^ tmp2;
1407 break;
1408 case JBIG2_COMPOSE_XNOR:
1409 tmp = ~(tmp1 ^ tmp2);
1410 break;
1411 case JBIG2_COMPOSE_REPLACE:
1412 tmp = tmp1;
1413 break;
1414 }
1415 dp[0] = (uint8_t)(tmp >> 24);
1416 dp[1] = (uint8_t)(tmp >> 16);
1417 dp[2] = (uint8_t)(tmp >> 8);
1418 dp[3] = (uint8_t)tmp;
1419 sp += 4;
1420 dp += 4;
1421 }
1422 if(d2 != 0) {
1423 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
1424 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(s p + 4) : 0) >> shift2);
1425 tmp2 = JBIG2_GETDWORD(dp);
1426 switch(op) {
1427 case JBIG2_COMPOSE_OR:
1428 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1429 break;
1430 case JBIG2_COMPOSE_AND:
1431 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1432 break;
1433 case JBIG2_COMPOSE_XOR:
1434 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1435 break;
1436 case JBIG2_COMPOSE_XNOR:
1437 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1438 break;
1439 case JBIG2_COMPOSE_REPLACE:
1440 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1441 break;
1442 }
1443 dp[0] = (uint8_t)(tmp >> 24);
1444 dp[1] = (uint8_t)(tmp >> 16);
1445 dp[2] = (uint8_t)(tmp >> 8);
1446 dp[3] = (uint8_t)tmp;
1447 }
1448 lineSrc += m_nStride;
1449 lineDst += pDst->m_nStride;
1450 }
1451 } else if(s1 == d1) {
1452 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1453 for(yy = yd0; yy < yd1; yy++) {
1454 sp = lineSrc;
1455 dp = lineDst;
1456 if(d1 != 0) {
1457 tmp1 = JBIG2_GETDWORD(sp);
1458 tmp2 = JBIG2_GETDWORD(dp);
1459 switch(op) {
1460 case JBIG2_COMPOSE_OR:
1461 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1462 break;
1463 case JBIG2_COMPOSE_AND:
1464 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1465 break;
1466 case JBIG2_COMPOSE_XOR:
1467 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1468 break;
1469 case JBIG2_COMPOSE_XNOR:
1470 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1471 break;
1472 case JBIG2_COMPOSE_REPLACE:
1473 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1474 break;
1475 }
1476 dp[0] = (uint8_t)(tmp >> 24);
1477 dp[1] = (uint8_t)(tmp >> 16);
1478 dp[2] = (uint8_t)(tmp >> 8);
1479 dp[3] = (uint8_t)tmp;
1480 sp += 4;
1481 dp += 4;
1482 }
1483 for(xx = 0; xx < middleDwords; xx++) {
1484 tmp1 = JBIG2_GETDWORD(sp);
1485 tmp2 = JBIG2_GETDWORD(dp);
1486 switch(op) {
1487 case JBIG2_COMPOSE_OR:
1488 tmp = tmp1 | tmp2;
1489 break;
1490 case JBIG2_COMPOSE_AND:
1491 tmp = tmp1 & tmp2;
1492 break;
1493 case JBIG2_COMPOSE_XOR:
1494 tmp = tmp1 ^ tmp2;
1495 break;
1496 case JBIG2_COMPOSE_XNOR:
1497 tmp = ~(tmp1 ^ tmp2);
1498 break;
1499 case JBIG2_COMPOSE_REPLACE:
1500 tmp = tmp1;
1501 break;
1502 }
1503 dp[0] = (uint8_t)(tmp >> 24);
1504 dp[1] = (uint8_t)(tmp >> 16);
1505 dp[2] = (uint8_t)(tmp >> 8);
1506 dp[3] = (uint8_t)tmp;
1507 sp += 4;
1508 dp += 4;
1509 }
1510 if(d2 != 0) {
1511 tmp1 = JBIG2_GETDWORD(sp);
1512 tmp2 = JBIG2_GETDWORD(dp);
1513 switch(op) {
1514 case JBIG2_COMPOSE_OR:
1515 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1516 break;
1517 case JBIG2_COMPOSE_AND:
1518 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1519 break;
1520 case JBIG2_COMPOSE_XOR:
1521 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1522 break;
1523 case JBIG2_COMPOSE_XNOR:
1524 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1525 break;
1526 case JBIG2_COMPOSE_REPLACE:
1527 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1528 break;
1529 }
1530 dp[0] = (uint8_t)(tmp >> 24);
1531 dp[1] = (uint8_t)(tmp >> 16);
1532 dp[2] = (uint8_t)(tmp >> 8);
1533 dp[3] = (uint8_t)tmp;
1534 }
1535 lineSrc += m_nStride;
1536 lineDst += pDst->m_nStride;
1537 }
1538 } else {
1539 shift1 = d1 - s1;
1540 shift2 = 32 - shift1;
1541 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1542 for(yy = yd0; yy < yd1; yy++) {
1543 sp = lineSrc;
1544 dp = lineDst;
1545 if(d1 != 0) {
1546 tmp1 = JBIG2_GETDWORD(sp) >> shift1;
1547 tmp2 = JBIG2_GETDWORD(dp);
1548 switch(op) {
1549 case JBIG2_COMPOSE_OR:
1550 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1551 break;
1552 case JBIG2_COMPOSE_AND:
1553 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1554 break;
1555 case JBIG2_COMPOSE_XOR:
1556 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1557 break;
1558 case JBIG2_COMPOSE_XNOR:
1559 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1560 break;
1561 case JBIG2_COMPOSE_REPLACE:
1562 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
1563 break;
1564 }
1565 dp[0] = (uint8_t)(tmp >> 24);
1566 dp[1] = (uint8_t)(tmp >> 16);
1567 dp[2] = (uint8_t)(tmp >> 8);
1568 dp[3] = (uint8_t)tmp;
1569 dp += 4;
1570 }
1571 for(xx = 0; xx < middleDwords; xx++) {
1572 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
1573 tmp2 = JBIG2_GETDWORD(dp);
1574 switch(op) {
1575 case JBIG2_COMPOSE_OR:
1576 tmp = tmp1 | tmp2;
1577 break;
1578 case JBIG2_COMPOSE_AND:
1579 tmp = tmp1 & tmp2;
1580 break;
1581 case JBIG2_COMPOSE_XOR:
1582 tmp = tmp1 ^ tmp2;
1583 break;
1584 case JBIG2_COMPOSE_XNOR:
1585 tmp = ~(tmp1 ^ tmp2);
1586 break;
1587 case JBIG2_COMPOSE_REPLACE:
1588 tmp = tmp1;
1589 break;
1590 }
1591 dp[0] = (uint8_t)(tmp >> 24);
1592 dp[1] = (uint8_t)(tmp >> 16);
1593 dp[2] = (uint8_t)(tmp >> 8);
1594 dp[3] = (uint8_t)tmp;
1595 sp += 4;
1596 dp += 4;
1597 }
1598 if(d2 != 0) {
1599 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
1600 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(s p + 4) : 0) >> shift1);
1601 tmp2 = JBIG2_GETDWORD(dp);
1602 switch(op) {
1603 case JBIG2_COMPOSE_OR:
1604 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1605 break;
1606 case JBIG2_COMPOSE_AND:
1607 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1608 break;
1609 case JBIG2_COMPOSE_XOR:
1610 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1611 break;
1612 case JBIG2_COMPOSE_XNOR:
1613 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1614 break;
1615 case JBIG2_COMPOSE_REPLACE:
1616 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
1617 break;
1618 }
1619 dp[0] = (uint8_t)(tmp >> 24);
1620 dp[1] = (uint8_t)(tmp >> 16);
1621 dp[2] = (uint8_t)(tmp >> 8);
1622 dp[3] = (uint8_t)tmp;
1623 }
1624 lineSrc += m_nStride;
1625 lineDst += pDst->m_nStride;
1626 }
1627 }
1628 }
1629 return 1;
1630 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698