diff options
author | Wade Brainerd <wadetb@gmail.com> | 2008-05-19 07:44:59 (GMT) |
---|---|---|
committer | Wade Brainerd <wadetb@gmail.com> | 2008-05-19 07:44:59 (GMT) |
commit | 5a426437a6d6bb42ca781be2cb5efbcf279d19ef (patch) | |
tree | af06f86ae7fd2d9357879a47ddfa483e637eb844 /src/canvas.h | |
parent | b60bfd619cebda212385c397e9aad00e382a6a27 (diff) |
Work on zooming & scrolling.
Diffstat (limited to 'src/canvas.h')
-rw-r--r-- | src/canvas.h | 370 |
1 files changed, 310 insertions, 60 deletions
diff --git a/src/canvas.h b/src/canvas.h index e221b39..6e80f3d 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -1033,87 +1033,337 @@ public: unsigned short* pixels = (unsigned short*)img->mem; int pitch = img->bpl/sizeof(unsigned short); + // Round to multiple of 2. + x &= ~1; + y &= ~1; + w = (w+1) & ~1; + h = (h+1) & ~1; + + // Clip rectangle. + if (x < 0) + { + w += x; + x = 0; + } + if (y < 0) + { + h += y; + y = 0; + } + if (x+w > (width-1)*2) + w = (width-1)*2-x; + if (y+h > (height-1)*2) + h = (height-1)*2-y; + // Translate origin to output location. - unsigned short* dest_pixels = pixels + y*pitch+x; - - int src_x = (x - scroll_x)/2; - int src_y = (y - scroll_y)/2; + int src_x = (x - scroll_x); + int src_y = (y - scroll_y); - if (src_x < 0) src_x = 0; - - while (src_y < 0) + int csy = src_y; + for (int cy = y; cy < y+h; cy += 2) { - unsigned short* __restrict row0 = dest_pixels; - unsigned short* __restrict row1 = dest_pixels + pitch; - dest_pixels += pitch*2; - for (int cx = 0; cx < w; cx++) + unsigned short* __restrict row0 = &pixels[cy*pitch+x]; + unsigned short* __restrict row1 = row0 + pitch; + + if (csy < 0 || csy >= height) + { + for (int cx = 0; cx < w; cx += 2) + { + unsigned int rgb = 0; + row0[0] = rgb; + row0[1] = rgb; + row1[0] = rgb; + row1[1] = rgb; + row0 += 2; + row1 += 2; + } + } + else { - unsigned int rgb = 0; - row0[0] = rgb; - row0[1] = rgb; - row1[0] = rgb; - row1[1] = rgb; - row0 += 2; - row1 += 2; + unsigned int* __restrict src = &image[csy*width+src_x]; + + int cx = 0; + int csx = src_x; + + while (csx < 0 && cx < w) + { + unsigned int rgb = 0; + row0[0] = rgb; + row0[1] = rgb; + row1[0] = rgb; + row1[1] = rgb; + row0 += 2; + row1 += 2; + src++; + csx++; + cx += 2; + } + + if (overlay) + { + while (csx < width && cx < w) + { + unsigned int p = *src; + p &= ~0x03030303; + p >>= 2; + unsigned int r = (((p>>16)&0xff)>>3)<<11; + unsigned int g = (((p>> 8)&0xff)>>2)<<5; + unsigned int b = (((p>> 0)&0xff)>>3); + unsigned int rgb = r|g|b; + row0[0] = rgb; + row0[1] = rgb; + row1[0] = rgb; + row1[1] = rgb; + row0 += 2; + row1 += 2; + src++; + csx++; + cx += 2; + } + } + else + { + while (csx < width && cx < w) + { + unsigned int p = *src; + unsigned int r = (((p>>16)&0xff)>>3)<<11; + unsigned int g = (((p>> 8)&0xff)>>2)<<5; + unsigned int b = (((p>> 0)&0xff)>>3); + unsigned int rgb = r|g|b; + row0[0] = rgb; + row0[1] = rgb; + row1[0] = rgb; + row1[1] = rgb; + row0 += 2; + row1 += 2; + src++; + csx++; + cx += 2; + } + } + + while (cx < w) + { + unsigned int rgb = 0; + row0[0] = rgb; + row0[1] = rgb; + row1[0] = rgb; + row1[1] = rgb; + row0 += 2; + row1 += 2; + src++; + csx++; + cx += 2; + } } - src_y++; - h--; + + csy++; } + } - unsigned int* src_pixels = &image[src_y*width+src_x]; + void blit_4x(GdkImage* img, int x, int y, int w, int h, int scroll_x, int scroll_y, bool overlay) + { + unsigned short* pixels = (unsigned short*)img->mem; + int pitch = img->bpl/sizeof(unsigned short); - for (int cy = 0; cy < h; cy++) + // Clip rectangle. + if (x < 0) { - unsigned int* __restrict src = src_pixels; - unsigned short* __restrict row0 = dest_pixels; - unsigned short* __restrict row1 = dest_pixels + pitch; - src_pixels += width; - dest_pixels += pitch*2; - for (int cx = 0; cx < w; cx++) - { - unsigned int p = *src++; - unsigned int r = (((p>>16)&0xff)>>3)<<11; - unsigned int g = (((p>> 8)&0xff)>>2)<<5; - unsigned int b = (((p>> 0)&0xff)>>3); - unsigned int rgb = r|g|b; - row0[0] = rgb; - row0[1] = rgb; - row1[0] = rgb; - row1[1] = rgb; - row0 += 2; - row1 += 2; - } + w += x; + x = 0; } - -/* - if (overlay) + if (y < 0) + { + h += y; + y = 0; + } + + x &= ~3; + y &= ~3; + w = (w) & ~3; + h = (h) & ~3; + + if (x+w > (width-7)*4) + w = (width-7)*4-x; + if (y+h > (height-7)*4) + h = (height-7)*4-y; + + // Translate origin to output location. + int src_x = (x - scroll_x); + int src_y = (y - scroll_y); + + int csy = src_y; + for (int cy = y; cy < y+h; cy += 4) { + unsigned short* __restrict row0 = &pixels[cy*pitch+x]; + unsigned short* __restrict row1 = row0 + pitch; + unsigned short* __restrict row2 = row1 + pitch; + unsigned short* __restrict row3 = row2 + pitch; - for (int cy = 0; cy < h; cy++) + if (csy < 0 || csy >= height) { - unsigned int* __restrict src = &image[(y+cy)*width+x]; - unsigned short* __restrict row0 = &pixels[((y+cy)*2+0)*pitch+x*2]; - unsigned short* __restrict row1 = &pixels[((y+cy)*2+1)*pitch+x*2]; - for (int cx = 0; cx < w; cx++) + for (int cx = 0; cx < w; cx += 4) { - unsigned int p = *src++; - p &= ~0x03030303; - p >>= 2; - unsigned int r = (((p>>16)&0xff)>>3)<<11; - unsigned int g = (((p>> 8)&0xff)>>2)<<5; - unsigned int b = (((p>> 0)&0xff)>>3); - unsigned int rgb = r|g|b; + unsigned int rgb = 0; row0[0] = rgb; row0[1] = rgb; + row0[2] = rgb; + row0[3] = rgb; row1[0] = rgb; row1[1] = rgb; - row0 += 2; - row1 += 2; + row1[2] = rgb; + row1[3] = rgb; + row2[0] = rgb; + row2[1] = rgb; + row2[2] = rgb; + row2[3] = rgb; + row3[0] = rgb; + row3[1] = rgb; + row3[2] = rgb; + row3[3] = rgb; + row0 += 4; + row1 += 4; + row2 += 4; + row3 += 4; } } + else + { + unsigned int* __restrict src = &image[csy*width+src_x]; + + int cx = 0; + int csx = src_x; + + while (csx < 0 && cx < w) + { + unsigned int rgb = 0; + row0[0] = rgb; + row0[1] = rgb; + row0[2] = rgb; + row0[3] = rgb; + row1[0] = rgb; + row1[1] = rgb; + row1[2] = rgb; + row1[3] = rgb; + row2[0] = rgb; + row2[1] = rgb; + row2[2] = rgb; + row2[3] = rgb; + row3[0] = rgb; + row3[1] = rgb; + row3[2] = rgb; + row3[3] = rgb; + row0 += 4; + row1 += 4; + row2 += 4; + row3 += 4; + src++; + csx++; + cx += 4; + } + + if (overlay) + { + while (csx < width && cx < w) + { + unsigned int p = *src; + p &= ~0x03030303; + p >>= 2; + unsigned int r = (((p>>16)&0xff)>>3)<<11; + unsigned int g = (((p>> 8)&0xff)>>2)<<5; + unsigned int b = (((p>> 0)&0xff)>>3); + unsigned int rgb = r|g|b; + row0[0] = rgb; + row0[1] = rgb; + row0[2] = rgb; + row0[3] = rgb; + row1[0] = rgb; + row1[1] = rgb; + row1[2] = rgb; + row1[3] = rgb; + row2[0] = rgb; + row2[1] = rgb; + row2[2] = rgb; + row2[3] = rgb; + row3[0] = rgb; + row3[1] = rgb; + row3[2] = rgb; + row3[3] = rgb; + row0 += 4; + row1 += 4; + row2 += 4; + row3 += 4; + src++; + csx++; + cx += 4; + } + } + else + { + while (csx < width && cx < w) + { + unsigned int p = *src; + unsigned int r = (((p>>16)&0xff)>>3)<<11; + unsigned int g = (((p>> 8)&0xff)>>2)<<5; + unsigned int b = (((p>> 0)&0xff)>>3); + unsigned int rgb = r|g|b; + row0[0] = rgb; + row0[1] = rgb; + row0[2] = rgb; + row0[3] = rgb; + row1[0] = rgb; + row1[1] = rgb; + row1[2] = rgb; + row1[3] = rgb; + row2[0] = rgb; + row2[1] = rgb; + row2[2] = rgb; + row2[3] = rgb; + row3[0] = rgb; + row3[1] = rgb; + row3[2] = rgb; + row3[3] = rgb; + row0 += 4; + row1 += 4; + row2 += 4; + row3 += 4; + src++; + csx++; + cx += 4; + } + } + + while (cx < w) + { + unsigned int rgb = 0; + row0[0] = rgb; + row0[1] = rgb; + row0[2] = rgb; + row0[3] = rgb; + row1[0] = rgb; + row1[1] = rgb; + row1[2] = rgb; + row1[3] = rgb; + row2[0] = rgb; + row2[1] = rgb; + row2[2] = rgb; + row2[3] = rgb; + row3[0] = rgb; + row3[1] = rgb; + row3[2] = rgb; + row3[3] = rgb; + row0 += 4; + row1 += 4; + row2 += 4; + row3 += 4; + src++; + csx++; + cx += 4; + } + } + + csy++; } - else - */ } //--------------------------------------------------------------------------------------------- |