1428d7b3dSmrg/* 2428d7b3dSmrg * Copyright © 1998 Keith Packard 3428d7b3dSmrg * Copyright © 2012 Intel Corporation 4428d7b3dSmrg * 5428d7b3dSmrg * Permission to use, copy, modify, distribute, and sell this software and its 6428d7b3dSmrg * documentation for any purpose is hereby granted without fee, provided that 7428d7b3dSmrg * the above copyright notice appear in all copies and that both that 8428d7b3dSmrg * copyright notice and this permission notice appear in supporting 9428d7b3dSmrg * documentation, and that the name of Keith Packard not be used in 10428d7b3dSmrg * advertising or publicity pertaining to distribution of the software without 11428d7b3dSmrg * specific, written prior permission. Keith Packard makes no 12428d7b3dSmrg * representations about the suitability of this software for any purpose. It 13428d7b3dSmrg * is provided "as is" without express or implied warranty. 14428d7b3dSmrg * 15428d7b3dSmrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 16428d7b3dSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 17428d7b3dSmrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 18428d7b3dSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 19428d7b3dSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 20428d7b3dSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 21428d7b3dSmrg * PERFORMANCE OF THIS SOFTWARE. 22428d7b3dSmrg */ 23428d7b3dSmrg 24428d7b3dSmrg#include <stdlib.h> 25428d7b3dSmrg 26428d7b3dSmrg#include "fb.h" 27428d7b3dSmrg#include <mi.h> 28428d7b3dSmrg 29428d7b3dSmrgvoid 30428d7b3dSmrgfbCopyNtoN(DrawablePtr src_drawable, DrawablePtr dst_drawable, GCPtr gc, 31428d7b3dSmrg BoxPtr box, int nbox, 32428d7b3dSmrg int dx, int dy, 33428d7b3dSmrg Bool reverse, Bool upsidedown, Pixel bitplane, 34428d7b3dSmrg void *closure) 35428d7b3dSmrg{ 36428d7b3dSmrg CARD8 alu = gc ? gc->alu : GXcopy; 37428d7b3dSmrg FbBits pm = gc ? fb_gc(gc)->pm : FB_ALLONES; 38428d7b3dSmrg FbBits *src, *dst; 39428d7b3dSmrg FbStride srcStride, dstStride; 40428d7b3dSmrg int dstBpp, srcBpp; 41428d7b3dSmrg int srcXoff, srcYoff; 42428d7b3dSmrg int dstXoff, dstYoff; 43428d7b3dSmrg 44428d7b3dSmrg fbGetDrawable(src_drawable, src, srcStride, srcBpp, srcXoff, srcYoff); 45428d7b3dSmrg fbGetDrawable(dst_drawable, dst, dstStride, dstBpp, dstXoff, dstYoff); 46428d7b3dSmrg 47428d7b3dSmrg src += (dy + srcYoff) * srcStride; 48428d7b3dSmrg srcXoff += dx; 49428d7b3dSmrg dst += dstYoff * dstStride; 50428d7b3dSmrg do { 51428d7b3dSmrg fbBlt(src + box->y1 * srcStride, srcStride, 52428d7b3dSmrg (box->x1 + srcXoff) * srcBpp, 53428d7b3dSmrg dst + box->y1 * dstStride, dstStride, 54428d7b3dSmrg (box->x1 + dstXoff) * dstBpp, 55428d7b3dSmrg (box->x2 - box->x1) * dstBpp, 56428d7b3dSmrg (box->y2 - box->y1), 57428d7b3dSmrg alu, pm, dstBpp, reverse, upsidedown); 58428d7b3dSmrg } while (box++, --nbox); 59428d7b3dSmrg} 60428d7b3dSmrg 61428d7b3dSmrgvoid 62428d7b3dSmrgfbCopy1toN(DrawablePtr src_drawable, DrawablePtr dst_drawable, GCPtr gc, 63428d7b3dSmrg BoxPtr box, int nbox, 64428d7b3dSmrg int dx, int dy, 65428d7b3dSmrg Bool reverse, Bool upsidedown, Pixel bitplane, 66428d7b3dSmrg void *closure) 67428d7b3dSmrg{ 68428d7b3dSmrg FbGCPrivPtr pgc = fb_gc(gc); 69428d7b3dSmrg FbBits *src; 70428d7b3dSmrg FbStride srcStride; 71428d7b3dSmrg int srcBpp; 72428d7b3dSmrg int srcXoff, srcYoff; 73428d7b3dSmrg FbBits *dst; 74428d7b3dSmrg FbStride dstStride; 75428d7b3dSmrg int dstBpp; 76428d7b3dSmrg int dstXoff, dstYoff; 77428d7b3dSmrg 78428d7b3dSmrg fbGetDrawable(src_drawable, src, srcStride, srcBpp, srcXoff, srcYoff); 79428d7b3dSmrg fbGetDrawable(dst_drawable, dst, dstStride, dstBpp, dstXoff, dstYoff); 80428d7b3dSmrg 81428d7b3dSmrg while (nbox--) { 82428d7b3dSmrg if (dstBpp == 1) { 83428d7b3dSmrg fbBlt(src + (box->y1 + dy + srcYoff) * srcStride, 84428d7b3dSmrg srcStride, 85428d7b3dSmrg (box->x1 + dx + srcXoff) * srcBpp, 86428d7b3dSmrg dst + (box->y1 + dstYoff) * dstStride, 87428d7b3dSmrg dstStride, 88428d7b3dSmrg (box->x1 + dstXoff) * dstBpp, 89428d7b3dSmrg (box->x2 - box->x1) * dstBpp, 90428d7b3dSmrg (box->y2 - box->y1), 91428d7b3dSmrg FbOpaqueStipple1Rop(gc->alu, 92428d7b3dSmrg gc->fgPixel, gc->bgPixel), 93428d7b3dSmrg pgc->pm, dstBpp, reverse, upsidedown); 94428d7b3dSmrg } else { 95428d7b3dSmrg fbBltOne((FbStip *) (src + (box->y1 + dy + srcYoff) * srcStride), 96428d7b3dSmrg srcStride * (FB_UNIT / FB_STIP_UNIT), 97428d7b3dSmrg (box->x1 + dx + srcXoff), 98428d7b3dSmrg dst + (box->y1 + dstYoff) * dstStride, 99428d7b3dSmrg dstStride, 100428d7b3dSmrg (box->x1 + dstXoff) * dstBpp, 101428d7b3dSmrg dstBpp, 102428d7b3dSmrg (box->x2 - box->x1) * dstBpp, 103428d7b3dSmrg (box->y2 - box->y1), 104428d7b3dSmrg pgc->and, pgc->xor, pgc->bgand, pgc->bgxor); 105428d7b3dSmrg } 106428d7b3dSmrg box++; 107428d7b3dSmrg } 108428d7b3dSmrg} 109428d7b3dSmrg 110428d7b3dSmrgvoid 111428d7b3dSmrgfbCopyNto1(DrawablePtr src_drawable, DrawablePtr dst_drawable, GCPtr gc, 112428d7b3dSmrg BoxPtr box, int nbox, 113428d7b3dSmrg int dx, int dy, 114428d7b3dSmrg Bool reverse, Bool upsidedown, Pixel bitplane, void *closure) 115428d7b3dSmrg{ 116428d7b3dSmrg FbGCPrivPtr pgc = fb_gc(gc); 117428d7b3dSmrg 118428d7b3dSmrg while (nbox--) { 119428d7b3dSmrg if (dst_drawable->bitsPerPixel == 1) { 120428d7b3dSmrg FbBits *src; 121428d7b3dSmrg FbStride srcStride; 122428d7b3dSmrg int srcBpp; 123428d7b3dSmrg int srcXoff, srcYoff; 124428d7b3dSmrg 125428d7b3dSmrg FbStip *dst; 126428d7b3dSmrg FbStride dstStride; 127428d7b3dSmrg int dstBpp; 128428d7b3dSmrg int dstXoff, dstYoff; 129428d7b3dSmrg 130428d7b3dSmrg fbGetDrawable(src_drawable, src, 131428d7b3dSmrg srcStride, srcBpp, srcXoff, srcYoff); 132428d7b3dSmrg fbGetStipDrawable(dst_drawable, 133428d7b3dSmrg dst, dstStride, dstBpp, dstXoff, dstYoff); 134428d7b3dSmrg fbBltPlane(src + (box->y1 + dy + srcYoff) * srcStride, srcStride, 135428d7b3dSmrg (box->x1 + dx + srcXoff) * srcBpp, srcBpp, 136428d7b3dSmrg dst + (box->y1 + dstYoff) * dstStride, dstStride, 137428d7b3dSmrg (box->x1 + dstXoff) * dstBpp, 138428d7b3dSmrg (box->x2 - box->x1) * srcBpp, (box->y2 - box->y1), 139428d7b3dSmrg (FbStip) pgc->and, (FbStip) pgc->xor, 140428d7b3dSmrg (FbStip) pgc->bgand, (FbStip) pgc->bgxor, bitplane); 141428d7b3dSmrg } else { 142428d7b3dSmrg FbBits *src; 143428d7b3dSmrg FbStride srcStride; 144428d7b3dSmrg int srcBpp; 145428d7b3dSmrg int srcXoff, srcYoff; 146428d7b3dSmrg 147428d7b3dSmrg FbBits *dst; 148428d7b3dSmrg FbStride dstStride; 149428d7b3dSmrg int dstBpp; 150428d7b3dSmrg int dstXoff, dstYoff; 151428d7b3dSmrg 152428d7b3dSmrg FbStip *tmp; 153428d7b3dSmrg FbStride tmpStride; 154428d7b3dSmrg int width, height; 155428d7b3dSmrg 156428d7b3dSmrg width = box->x2 - box->x1; 157428d7b3dSmrg height = box->y2 - box->y1; 158428d7b3dSmrg 159428d7b3dSmrg tmpStride = ((width + FB_STIP_MASK) >> FB_STIP_SHIFT); 160428d7b3dSmrg tmp = malloc(tmpStride * height * sizeof(FbStip)); 161428d7b3dSmrg if (!tmp) 162428d7b3dSmrg return; 163428d7b3dSmrg 164428d7b3dSmrg fbGetDrawable(src_drawable, src, 165428d7b3dSmrg srcStride, srcBpp, srcXoff, srcYoff); 166428d7b3dSmrg fbGetDrawable(dst_drawable, dst, 167428d7b3dSmrg dstStride, dstBpp, dstXoff, dstYoff); 168428d7b3dSmrg 169428d7b3dSmrg fbBltPlane(src + (box->y1 + dy + srcYoff) * srcStride, 170428d7b3dSmrg srcStride, 171428d7b3dSmrg (box->x1 + dx + srcXoff) * srcBpp, 172428d7b3dSmrg srcBpp, 173428d7b3dSmrg tmp, 174428d7b3dSmrg tmpStride, 175428d7b3dSmrg 0, 176428d7b3dSmrg width * srcBpp, 177428d7b3dSmrg height, 178428d7b3dSmrg fbAndStip(GXcopy, FB_ALLONES, FB_ALLONES), 179428d7b3dSmrg fbXorStip(GXcopy, FB_ALLONES, FB_ALLONES), 180428d7b3dSmrg fbAndStip(GXcopy, 0, FB_ALLONES), 181428d7b3dSmrg fbXorStip(GXcopy, 0, FB_ALLONES), bitplane); 182428d7b3dSmrg fbBltOne(tmp, 183428d7b3dSmrg tmpStride, 184428d7b3dSmrg 0, 185428d7b3dSmrg dst + (box->y1 + dstYoff) * dstStride, 186428d7b3dSmrg dstStride, 187428d7b3dSmrg (box->x1 + dstXoff) * dstBpp, 188428d7b3dSmrg dstBpp, 189428d7b3dSmrg width * dstBpp, 190428d7b3dSmrg height, 191428d7b3dSmrg pgc->and, pgc->xor, pgc->bgand, pgc->bgxor); 192428d7b3dSmrg free(tmp); 193428d7b3dSmrg } 194428d7b3dSmrg box++; 195428d7b3dSmrg } 196428d7b3dSmrg} 197428d7b3dSmrg 198428d7b3dSmrgRegionPtr 199428d7b3dSmrgfbCopyArea(DrawablePtr src, DrawablePtr dst, GCPtr gc, 200428d7b3dSmrg int sx, int sy, 201428d7b3dSmrg int width, int height, 202428d7b3dSmrg int dx, int dy) 203428d7b3dSmrg{ 204428d7b3dSmrg return miDoCopy(src, dst, gc, sx, sy, width, height, dx, dy, 205428d7b3dSmrg fbCopyNtoN, 0, 0); 206428d7b3dSmrg} 207428d7b3dSmrg 208428d7b3dSmrgRegionPtr 209428d7b3dSmrgfbCopyPlane(DrawablePtr src, DrawablePtr dst, GCPtr gc, 210428d7b3dSmrg int sx, int sy, 211428d7b3dSmrg int width, int height, 212428d7b3dSmrg int dx, int dy, 213428d7b3dSmrg unsigned long bitplane) 214428d7b3dSmrg{ 215428d7b3dSmrg if (src->bitsPerPixel > 1) 216428d7b3dSmrg return miDoCopy(src, dst, gc, sx, sy, width, height, dx, dy, 217428d7b3dSmrg fbCopyNto1, (Pixel) bitplane, 0); 218428d7b3dSmrg else if (bitplane & 1) 219428d7b3dSmrg return miDoCopy(src, dst, gc, sx, sy, width, height, dx, dy, 220428d7b3dSmrg fbCopy1toN, (Pixel) bitplane, 0); 221428d7b3dSmrg else 222428d7b3dSmrg return miHandleExposures(src, dst, gc, 223428d7b3dSmrg sx, sy, width, height, dx, dy, 224428d7b3dSmrg bitplane); 225428d7b3dSmrg} 226