diff options
Diffstat (limited to 'bltsville/gcbv/mirror/gcparser.c')
-rw-r--r-- | bltsville/gcbv/mirror/gcparser.c | 2090 |
1 files changed, 0 insertions, 2090 deletions
diff --git a/bltsville/gcbv/mirror/gcparser.c b/bltsville/gcbv/mirror/gcparser.c deleted file mode 100644 index 5bfbdb6..0000000 --- a/bltsville/gcbv/mirror/gcparser.c +++ /dev/null @@ -1,2090 +0,0 @@ -/* - * Copyright(c) 2012, - * Texas Instruments, Inc. and Vivante Corporation. - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Vivante Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "gcbv.h" - -#define GCZONE_NONE 0 -#define GCZONE_ALL (~0U) -#define GCZONE_FORMAT (1 << 0) -#define GCZONE_FORMAT_VERBOSE (1 << 1) -#define GCZONE_BLEND (1 << 2) -#define GCZONE_OFFSET (1 << 3) -#define GCZONE_DEST (1 << 4) -#define GCZONE_SRC (1 << 5) -#define GCZONE_SCALING (1 << 6) - -GCDBG_FILTERDEF(parser, GCZONE_NONE, - "format", - "formatverbose", - "blend", - "offset", - "dest", - "src", - "scaling") - - -/******************************************************************************* - * Internal macros. - */ - -#define GCCONVERT_RECT(zone, name, bvrect, gcrect) \ -{ \ - (gcrect)->left = (bvrect)->left; \ - (gcrect)->top = (bvrect)->top; \ - (gcrect)->right = (bvrect)->left + (bvrect)->width; \ - (gcrect)->bottom = (bvrect)->top + (bvrect)->height; \ - \ - GCPRINT_RECT(zone, name, gcrect); \ -} - - -/******************************************************************************* - * Pixel format parser. - */ - -#define OCDFMTDEF_PLACEMENT_SHIFT 9 -#define OCDFMTDEF_PLACEMENT_MASK (3 << OCDFMTDEF_PLACEMENT_SHIFT) - -#define BVCOMP(Shift, Size) \ - { Shift, Size, ((1 << Size) - 1) << Shift } - -#define BVRED(Shift, Size) \ - BVCOMP(Shift, Size) - -#define BVGREEN(Shift, Size) \ - BVCOMP(Shift, Size) - -#define BVBLUE(Shift, Size) \ - BVCOMP(Shift, Size) - -#define BVALPHA(Shift, Size) \ - BVCOMP(Shift, Size) - -static const unsigned int rgba16swizzle[] = { - GCREG_DE_SWIZZLE_ARGB, - GCREG_DE_SWIZZLE_RGBA, - GCREG_DE_SWIZZLE_ABGR, - GCREG_DE_SWIZZLE_BGRA -}; - -static const unsigned int rgb16swizzle[] = { - GCREG_DE_SWIZZLE_ARGB, - GCREG_DE_SWIZZLE_ARGB, - GCREG_DE_SWIZZLE_ABGR, - GCREG_DE_SWIZZLE_ABGR -}; - -static const unsigned int rgba32swizzle[] = { - GCREG_DE_SWIZZLE_BGRA, - GCREG_DE_SWIZZLE_ABGR, - GCREG_DE_SWIZZLE_RGBA, - GCREG_DE_SWIZZLE_ARGB -}; - -static const struct bvcsrgb xrgb4444_bits[] = { - { BVRED(8, 4), BVGREEN(4, 4), BVBLUE(0, 4), BVALPHA(12, 0) }, - { BVRED(12, 4), BVGREEN(8, 4), BVBLUE(4, 4), BVALPHA(0, 0) }, - { BVRED(0, 4), BVGREEN(4, 4), BVBLUE(8, 4), BVALPHA(12, 0) }, - { BVRED(4, 4), BVGREEN(8, 4), BVBLUE(12, 4), BVALPHA(0, 0) } -}; - -static const struct bvcsrgb argb4444_bits[] = { - { BVRED(8, 4), BVGREEN(4, 4), BVBLUE(0, 4), BVALPHA(12, 4) }, - { BVRED(12, 4), BVGREEN(8, 4), BVBLUE(4, 4), BVALPHA(0, 4) }, - { BVRED(0, 4), BVGREEN(4, 4), BVBLUE(8, 4), BVALPHA(12, 4) }, - { BVRED(4, 4), BVGREEN(8, 4), BVBLUE(12, 4), BVALPHA(0, 4) } -}; - -static const struct bvcsrgb xrgb1555_bits[] = { - { BVRED(10, 5), BVGREEN(5, 5), BVBLUE(0, 5), BVALPHA(15, 0) }, - { BVRED(11, 5), BVGREEN(6, 5), BVBLUE(1, 5), BVALPHA(0, 0) }, - { BVRED(0, 5), BVGREEN(5, 5), BVBLUE(10, 5), BVALPHA(15, 0) }, - { BVRED(1, 5), BVGREEN(6, 5), BVBLUE(11, 5), BVALPHA(0, 0) } -}; - -static const struct bvcsrgb argb1555_bits[] = { - { BVRED(10, 5), BVGREEN(5, 5), BVBLUE(0, 5), BVALPHA(15, 1) }, - { BVRED(11, 5), BVGREEN(6, 5), BVBLUE(1, 5), BVALPHA(0, 1) }, - { BVRED(0, 5), BVGREEN(5, 5), BVBLUE(10, 5), BVALPHA(15, 1) }, - { BVRED(1, 5), BVGREEN(6, 5), BVBLUE(11, 5), BVALPHA(0, 1) } -}; - -static const struct bvcsrgb rgb565_bits[] = { - { BVRED(11, 5), BVGREEN(5, 6), BVBLUE(0, 5), BVALPHA(0, 0) }, - { BVRED(11, 5), BVGREEN(5, 6), BVBLUE(0, 5), BVALPHA(0, 0) }, - { BVRED(0, 5), BVGREEN(5, 6), BVBLUE(11, 5), BVALPHA(0, 0) }, - { BVRED(0, 5), BVGREEN(5, 6), BVBLUE(11, 5), BVALPHA(0, 0) } -}; - -static const struct bvcsrgb xrgb8888_bits[] = { - { BVRED(8, 8), BVGREEN(16, 8), BVBLUE(24, 8), BVALPHA(0, 0) }, - { BVRED(0, 8), BVGREEN(8, 8), BVBLUE(16, 8), BVALPHA(24, 0) }, - { BVRED(24, 8), BVGREEN(16, 8), BVBLUE(8, 8), BVALPHA(0, 0) }, - { BVRED(16, 8), BVGREEN(8, 8), BVBLUE(0, 8), BVALPHA(24, 0) } -}; - -static const struct bvcsrgb argb8888_bits[] = { - { BVRED(8, 8), BVGREEN(16, 8), BVBLUE(24, 8), BVALPHA(0, 8) }, - { BVRED(0, 8), BVGREEN(8, 8), BVBLUE(16, 8), BVALPHA(24, 8) }, - { BVRED(24, 8), BVGREEN(16, 8), BVBLUE(8, 8), BVALPHA(0, 8) }, - { BVRED(16, 8), BVGREEN(8, 8), BVBLUE(0, 8), BVALPHA(24, 8) } -}; - -static const unsigned int container[] = { - 8, /* OCDFMTDEF_CONTAINER_8BIT */ - 16, /* OCDFMTDEF_CONTAINER_16BIT */ - 24, /* OCDFMTDEF_CONTAINER_24BIT */ - 32, /* OCDFMTDEF_CONTAINER_32BIT */ - ~0U, /* reserved */ - 48, /* OCDFMTDEF_CONTAINER_48BIT */ - ~0U, /* reserved */ - 64 /* OCDFMTDEF_CONTAINER_64BIT */ -}; - -enum bverror parse_format(struct bvbltparams *bvbltparams, - struct surfaceinfo *surfaceinfo) -{ - enum bverror bverror = BVERR_NONE; - struct bvformatxlate *format; - enum ocdformat ocdformat; - unsigned int cs, std, alpha, subsample, layout; - unsigned int reversed, leftjust, swizzle, cont, bits; - - format = &surfaceinfo->format; - ocdformat = surfaceinfo->geom->format; - GCENTERARG(GCZONE_FORMAT, "ocdformat = 0x%08X\n", ocdformat); - - cs = (ocdformat & OCDFMTDEF_CS_MASK) - >> OCDFMTDEF_CS_SHIFT; - std = (ocdformat & OCDFMTDEF_STD_MASK) - >> OCDFMTDEF_STD_SHIFT; - alpha = ocdformat & OCDFMTDEF_ALPHA; - subsample = (ocdformat & OCDFMTDEF_SUBSAMPLE_MASK) - >> OCDFMTDEF_SUBSAMPLE_SHIFT; - layout = (ocdformat & OCDFMTDEF_LAYOUT_MASK) - >> OCDFMTDEF_LAYOUT_SHIFT; - cont = (ocdformat & OCDFMTDEF_CONTAINER_MASK) - >> OCDFMTDEF_CONTAINER_SHIFT; - bits = ((ocdformat & OCDFMTDEF_COMPONENTSIZEMINUS1_MASK) - >> OCDFMTDEF_COMPONENTSIZEMINUS1_SHIFT) + 1; - - GCDBG(GCZONE_FORMAT_VERBOSE, "std = %d\n", std); - GCDBG(GCZONE_FORMAT_VERBOSE, "cs = %d\n", cs); - GCDBG(GCZONE_FORMAT_VERBOSE, "alpha = %d\n", alpha ? 1 : 0); - GCDBG(GCZONE_FORMAT_VERBOSE, "subsample = %d\n", subsample); - GCDBG(GCZONE_FORMAT_VERBOSE, "layout = %d\n", layout); - GCDBG(GCZONE_FORMAT_VERBOSE, "cont = %d\n", cont); - GCDBG(GCZONE_FORMAT_VERBOSE, "bits = %d\n", bits); - - switch (cs) { - case (OCDFMTDEF_CS_RGB >> OCDFMTDEF_CS_SHIFT): - GCDBG(GCZONE_FORMAT, "OCDFMTDEF_CS_RGB\n"); - - /* Determine the swizzle. */ - swizzle = (ocdformat & OCDFMTDEF_PLACEMENT_MASK) - >> OCDFMTDEF_PLACEMENT_SHIFT; - GCDBG(GCZONE_FORMAT, "swizzle = %d\n", swizzle); - - /* RGB color space. */ - format->type = BVFMT_RGB; - - /* Has to be 0 for RGB. */ - if (std != 0) { - BVSETBLTERROR(BVERR_UNK, - "unsupported standard"); - goto exit; - } - - /* Determine premultuplied or not. */ - if (alpha == OCDFMTDEF_ALPHA) { - format->premultiplied - = ((ocdformat & OCDFMTDEF_NON_PREMULT) == 0); - } else { - format->premultiplied = true; - - if ((ocdformat & OCDFMTDEF_FILL_EMPTY_0) != 0) { - BVSETBLTERROR(BVERR_UNK, - "0 filling is not supported"); - goto exit; - } - } - GCDBG(GCZONE_FORMAT, "premultiplied = %d\n", - format->premultiplied); - - /* No subsample support. */ - if (subsample != - (OCDFMTDEF_SUBSAMPLE_NONE >> OCDFMTDEF_SUBSAMPLE_SHIFT)) { - BVSETBLTERROR(BVERR_UNK, - "subsampling for RGB is not supported"); - goto exit; - } - - /* Only packed RGB is supported. */ - if (layout != - (OCDFMTDEF_PACKED >> OCDFMTDEF_LAYOUT_SHIFT)) { - BVSETBLTERROR(BVERR_UNK, - "only packed RGBA formats are supported"); - goto exit; - } - - /* Determine the format. */ - switch (bits) { - case 12: - format->bitspp = 16; - format->allocbitspp = 16; - format->swizzle = rgba16swizzle[swizzle]; - - if (alpha == OCDFMTDEF_ALPHA) { - format->format = GCREG_DE_FORMAT_A4R4G4B4; - format->cs.rgb.comp = &argb4444_bits[swizzle]; - } else { - format->format = GCREG_DE_FORMAT_X4R4G4B4; - format->cs.rgb.comp = &xrgb4444_bits[swizzle]; - } - break; - - case 15: - format->bitspp = 16; - format->allocbitspp = 16; - format->swizzle = rgba16swizzle[swizzle]; - - if (alpha == OCDFMTDEF_ALPHA) { - format->format = GCREG_DE_FORMAT_A1R5G5B5; - format->cs.rgb.comp = &argb1555_bits[swizzle]; - } else { - format->format = GCREG_DE_FORMAT_X1R5G5B5; - format->cs.rgb.comp = &xrgb1555_bits[swizzle]; - } - break; - - case 16: - if (alpha == OCDFMTDEF_ALPHA) { - BVSETBLTERROR(BVERR_UNK, - "alpha component is not supported" - "for this format."); - goto exit; - } - - format->bitspp = 16; - format->allocbitspp = 16; - format->swizzle = rgb16swizzle[swizzle]; - format->format = GCREG_DE_FORMAT_R5G6B5; - format->cs.rgb.comp = &rgb565_bits[swizzle]; - break; - - case 24: - format->bitspp = 32; - format->allocbitspp = 32; - format->swizzle = rgba32swizzle[swizzle]; - - if (alpha == OCDFMTDEF_ALPHA) { - format->format = GCREG_DE_FORMAT_A8R8G8B8; - format->cs.rgb.comp = &argb8888_bits[swizzle]; - } else { - format->format = GCREG_DE_FORMAT_X8R8G8B8; - format->cs.rgb.comp = &xrgb8888_bits[swizzle]; - } - break; - - default: - BVSETBLTERROR(BVERR_UNK, - "unsupported bit width %d", bits); - goto exit; - } - - if (format->allocbitspp != container[cont]) { - BVSETBLTERROR(BVERR_UNK, - "unsupported container"); - goto exit; - } - break; - - case (OCDFMTDEF_CS_YCbCr >> OCDFMTDEF_CS_SHIFT): - GCDBG(GCZONE_FORMAT, "OCDFMTDEF_CS_YCbCr\n"); - - /* YUV color space. */ - format->type = BVFMT_YUV; - - /* Determine the swizzle. */ - reversed = ocdformat & OCDFMTDEF_REVERSED; - leftjust = ocdformat & OCDFMTDEF_LEFT_JUSTIFIED; - GCDBG(GCZONE_FORMAT_VERBOSE, "reversed = %d\n", - reversed ? 1 : 0); - GCDBG(GCZONE_FORMAT_VERBOSE, "leftjust = %d\n", - leftjust ? 1 : 0); - - /* Parse the standard. */ - switch (std) { - case OCDFMTDEF_STD_ITUR_601_YCbCr >> OCDFMTDEF_STD_SHIFT: - GCDBG(GCZONE_FORMAT, "OCDFMTDEF_STD_ITUR_601_YCbCr\n"); - format->cs.yuv.std = GCREG_PE_CONTROL_YUV_601; - break; - - case OCDFMTDEF_STD_ITUR_709_YCbCr >> OCDFMTDEF_STD_SHIFT: - GCDBG(GCZONE_FORMAT, "OCDFMTDEF_STD_ITUR_709_YCbCr\n"); - format->cs.yuv.std = GCREG_PE_CONTROL_YUV_709; - break; - - default: - BVSETBLTERROR(BVERR_UNK, - "unsupported color standard"); - goto exit; - } - - /* Alpha is not supported. */ - if (alpha == OCDFMTDEF_ALPHA) { - BVSETBLTERROR(BVERR_UNK, - "alpha channel is not supported"); - goto exit; - } - - format->premultiplied = true; - - /* Parse subsampling. */ - switch (subsample) { - case OCDFMTDEF_SUBSAMPLE_422_YCbCr >> OCDFMTDEF_SUBSAMPLE_SHIFT: - GCDBG(GCZONE_FORMAT, "OCDFMTDEF_SUBSAMPLE_422_YCbCr\n"); - - /* Parse layout. */ - switch (layout) { - case OCDFMTDEF_PACKED >> OCDFMTDEF_LAYOUT_SHIFT: - GCDBG(GCZONE_FORMAT, "OCDFMTDEF_PACKED\n"); - - if (container[cont] != 32) { - BVSETBLTERROR(BVERR_UNK, - "unsupported container"); - goto exit; - } - - format->bitspp = 16; - format->allocbitspp = 16; - format->format = leftjust - ? GCREG_DE_FORMAT_YUY2 - : GCREG_DE_FORMAT_UYVY; - format->swizzle = reversed - ? GCREG_PE_CONTROL_UV_SWIZZLE_VU - : GCREG_PE_CONTROL_UV_SWIZZLE_UV; - format->cs.yuv.planecount = 1; - format->cs.yuv.xsample = 2; - format->cs.yuv.ysample = 1; - break; - - default: - BVSETBLTERROR(BVERR_UNK, - "specified 4:2:2 layout " - "is not supported"); - goto exit; - } - break; - - case OCDFMTDEF_SUBSAMPLE_420_YCbCr >> OCDFMTDEF_SUBSAMPLE_SHIFT: - - /* Parse layout. */ - switch (layout) { - case OCDFMTDEF_2_PLANE_YCbCr - >> OCDFMTDEF_LAYOUT_SHIFT: - GCDBG(GCZONE_FORMAT, - "OCDFMTDEF_2_PLANE_YCbCr\n"); - - if (container[cont] != 48) { - BVSETBLTERROR(BVERR_UNK, - "unsupported container"); - goto exit; - } - - format->bitspp = 8; - format->allocbitspp = 12; - format->format = GCREG_DE_FORMAT_NV12; - format->swizzle = reversed - ? GCREG_PE_CONTROL_UV_SWIZZLE_VU - : GCREG_PE_CONTROL_UV_SWIZZLE_UV; - format->cs.yuv.planecount = 2; - format->cs.yuv.xsample = 2; - format->cs.yuv.ysample = 2; - break; - - case OCDFMTDEF_3_PLANE_STACKED - >> OCDFMTDEF_LAYOUT_SHIFT: - GCDBG(GCZONE_FORMAT, - "OCDFMTDEF_3_PLANE_STACKED\n"); - - if (container[cont] != 48) { - BVSETBLTERROR(BVERR_UNK, - "unsupported container"); - goto exit; - } - - format->bitspp = 8; - format->allocbitspp = 12; - format->format = GCREG_DE_FORMAT_YV12; - format->swizzle = reversed - ? GCREG_PE_CONTROL_UV_SWIZZLE_VU - : GCREG_PE_CONTROL_UV_SWIZZLE_UV; - format->cs.yuv.planecount = 3; - format->cs.yuv.xsample = 2; - format->cs.yuv.ysample = 2; - break; - - default: - BVSETBLTERROR(BVERR_UNK, - "specified 4:2:2 layout " - "is not supported"); - goto exit; - } - break; - - default: - BVSETBLTERROR(BVERR_UNK, - "specified subsampling is not supported"); - goto exit; - } - - if (format->allocbitspp != bits) { - BVSETBLTERROR(BVERR_UNK, - "unsupported bit width %d", bits); - goto exit; - } - break; - - default: - BVSETBLTERROR(BVERR_UNK, - "unsupported color space %d", cs); - goto exit; - } - - GCDBG(GCZONE_FORMAT, "bpp = %d\n", format->bitspp); - GCDBG(GCZONE_FORMAT, "gcformat = %d\n", format->format); - GCDBG(GCZONE_FORMAT, "gcswizzle = %d\n", format->swizzle); - - bverror = BVERR_NONE; - -exit: - GCEXITARG(GCZONE_FORMAT, "bv%s = %d\n", - (bverror == BVERR_NONE) ? "result" : "error", bverror); - return bverror; -} - - -/******************************************************************************* - * Alpha blending parser. - */ - -#define BVBLENDMATCH(Mode, Inverse, Normal) \ -( \ - BVBLENDDEF_ ## Mode | \ - BVBLENDDEF_ ## Inverse | \ - BVBLENDDEF_ ## Normal \ -) - -#define BVSRC1USE(Use) \ - Use - -#define BVSRC2USE(Use) \ - Use - -#define BVBLENDUNDEFINED() \ - { ~0, ~0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } } - -struct bvblendxlate { - unsigned char match1; - unsigned char match2; - - struct gcblendconfig k1; - struct gcblendconfig k2; -}; - -static struct bvblendxlate blendxlate[64] = { - /**********************************************************************/ - /* #0: color factor: 00 00 00 A:(1-C1,C1)=zero - alpha factor: zero ==> 00 00 00 */ - { - 0x00, - 0x00, - - { - GCREG_BLENDING_MODE_ZERO, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(false), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_ZERO, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(false), BVSRC2USE(false) - } - }, - - /* #1: color factor: 00 00 01 A:(1-C1,A1)=A1 - alpha factor: A1 ==> 00 00 01 or 00 10 01 */ - { - BVBLENDMATCH(ONLY_A, INV_C1, NORM_A1), - BVBLENDMATCH(ONLY_A, INV_C2, NORM_A1), - - { - GCREG_BLENDING_MODE_NORMAL, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(true), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_NORMAL, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #2: color factor: 00 00 10 A:(1-C1,C2)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #3: color factor: 00 00 11 A:(1-C1,A2)=A2 - alpha factor: A2 ==> 00 00 11 or 00 10 11 */ - { - BVBLENDMATCH(ONLY_A, INV_C1, NORM_A2), - BVBLENDMATCH(ONLY_A, INV_C2, NORM_A2), - - { - GCREG_BLENDING_MODE_NORMAL, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_NORMAL, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(false), BVSRC2USE(true) - } - }, - - /* #4: color factor: 00 01 00 A:(1-A1,C1)=1-A1 - alpha factor: 1-A1 ==> 00 01 00 or 00 01 10 */ - { - BVBLENDMATCH(ONLY_A, INV_A1, NORM_C1), - BVBLENDMATCH(ONLY_A, INV_A1, NORM_C2), - - { - GCREG_BLENDING_MODE_INVERSED, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(true), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_INVERSED, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #5: color factor: 00 01 01 A:(1-A1,A1)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #6: color factor: 00 01 10 A:(1-A1,C2)=1-A1 - alpha factor: 1-A1 ==> 00 01 00 or 00 01 10 */ - { - BVBLENDMATCH(ONLY_A, INV_A1, NORM_C1), - BVBLENDMATCH(ONLY_A, INV_A1, NORM_C2), - - { - GCREG_BLENDING_MODE_INVERSED, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(true), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_INVERSED, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #7: color factor: 00 01 11 A:(1-A1,A2)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #8: color factor: 00 10 00 A:(1-C2,C1)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #9: color factor: 00 10 01 A:(1-C2,A1)=A1 - alpha factor: A1 ==> 00 00 01 or 00 10 01 */ - { - BVBLENDMATCH(ONLY_A, INV_C1, NORM_A1), - BVBLENDMATCH(ONLY_A, INV_C2, NORM_A1), - - { - GCREG_BLENDING_MODE_NORMAL, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(true), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_NORMAL, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #10: color factor: 00 10 10 A:(1-C2,C2)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #11: color factor: 00 10 11 A:(1-C2,A2)=A2 - alpha factor: A2 ==> 00 00 11 or 00 10 11 */ - { - BVBLENDMATCH(ONLY_A, INV_C1, NORM_A2), - BVBLENDMATCH(ONLY_A, INV_C2, NORM_A2), - - { - GCREG_BLENDING_MODE_NORMAL, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_NORMAL, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(false), BVSRC2USE(true) - } - }, - - /* #12: color factor: 00 11 00 A:(1-A2,C1)=1-A2 - alpha factor: 1-A2 ==> 00 11 00 or 00 11 10 */ - { - BVBLENDMATCH(ONLY_A, INV_A2, NORM_C1), - BVBLENDMATCH(ONLY_A, INV_A2, NORM_C2), - - { - GCREG_BLENDING_MODE_INVERSED, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_INVERSED, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(false), BVSRC2USE(true) - } - }, - - /* #13: color factor: 00 11 01 A:(1-A2,A1)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #14: color factor: 00 11 10 A:(1-A2,C2)=1-A2 - alpha factor: 1-A2 ==> 00 11 00 or 00 11 10 */ - { - BVBLENDMATCH(ONLY_A, INV_A2, NORM_C1), - BVBLENDMATCH(ONLY_A, INV_A2, NORM_C2), - - { - GCREG_BLENDING_MODE_INVERSED, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_INVERSED, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(false), BVSRC2USE(true) - } - }, - - /* #15: color factor: 00 11 11 A:(1-A2,A2)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /**********************************************************************/ - /* #16: color factor: 01 00 00 MIN:(1-C1,C1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #17: color factor: 01 00 01 MIN:(1-C1,A1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #18: color factor: 01 00 10 MIN:(1-C1,C2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #19: color factor: 01 00 11 MIN:(1-C1,A2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #20: color factor: 01 01 00 MIN:(1-A1,C1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #21: color factor: 01 01 01 MIN:(1-A1,A1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #22: color factor: 01 01 10 MIN:(1-A1,C2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #23: color factor: 01 01 11 MIN:(1-A1,A2) - alpha factor: one ==> 11 11 11 */ - { - 0x3F, - 0x3F, - - { - GCREG_BLENDING_MODE_SATURATED_DEST_ALPHA, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_SATURATED_ALPHA, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #24: color factor: 01 10 00 MIN:(1-C2,C1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #25: color factor: 01 10 01 MIN:(1-C2,A1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #26: color factor: 01 10 10 MIN:(1-C2,C2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #27: color factor: 01 10 11 MIN:(1-C2,A2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #28: color factor: 01 11 00 MIN:(1-A2,C1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #29: color factor: 01 11 01 MIN:(1-A2,A1) - alpha factor: one ==> 11 11 11 */ - { - 0x3F, - 0x3F, - - { - GCREG_BLENDING_MODE_SATURATED_ALPHA, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_SATURATED_DEST_ALPHA, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #30: color factor: 01 11 10 MIN:(1-A2,C2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #31: color factor: 01 11 11 MIN:(1-A2,A2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /**********************************************************************/ - /* #32: color factor: 10 00 00 MAX:(1-C1,C1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #33: color factor: 10 00 01 MAX:(1-C1,A1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #34: color factor: 10 00 10 MAX:(1-C1,C2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #35: color factor: 10 00 11 MAX:(1-C1,A2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #36: color factor: 10 01 00 MAX:(1-A1,C1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #37: color factor: 10 01 01 MAX:(1-A1,A1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #38: color factor: 10 01 10 MAX:(1-A1,C2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #39: color factor: 10 01 11 MAX:(1-A1,A2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #40: color factor: 10 10 00 MAX:(1-C2,C1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #41: color factor: 10 10 01 MAX:(1-C2,A1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #42: color factor: 10 10 10 MAX:(1-C2,C2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #43: color factor: 10 10 11 MAX:(1-C2,A2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #44: color factor: 10 11 00 MAX:(1-A2,C1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #45: color factor: 10 11 01 MAX:(1-A2,A1) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #46: color factor: 10 11 10 MAX:(1-A2,C2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #47: color factor: 10 11 11 MAX:(1-A2,A2) ==> not supported - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /**********************************************************************/ - /* #48: color factor: 11 00 00 C:(1-C1,C1)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #49: color factor: 11 00 01 C:(1-C1,A1)=1-C1 - alpha factor: 1-A1 ==> 00 01 00 or 00 01 10 */ - { - BVBLENDMATCH(ONLY_A, INV_A1, NORM_C1), - BVBLENDMATCH(ONLY_A, INV_A1, NORM_C2), - - { - GCREG_BLENDING_MODE_COLOR_INVERSED, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(true), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_COLOR_INVERSED, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #50: color factor: 11 00 10 C:(1-C1,C2)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #51: color factor: 11 00 11 C:(1-C1,A2)=1-C1 - alpha factor: 1-A1 ==> 00 01 00 or 00 01 10 */ - { - BVBLENDMATCH(ONLY_A, INV_A1, NORM_C1), - BVBLENDMATCH(ONLY_A, INV_A1, NORM_C2), - - { - GCREG_BLENDING_MODE_COLOR_INVERSED, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(true), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_COLOR_INVERSED, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #52: color factor: 11 01 00 C:(1-A1,C1)=C1 - alpha factor: A1 ==> 00 00 01 or 00 10 01 */ - { - BVBLENDMATCH(ONLY_A, INV_C1, NORM_A1), - BVBLENDMATCH(ONLY_A, INV_C2, NORM_A1), - - { - GCREG_BLENDING_MODE_COLOR, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(true), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_COLOR, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #53: color factor: 11 01 01 C:(1-A1,A1)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #54: color factor: 11 01 10 C:(1-A1,C2)=C2 - alpha factor: A2 ==> 00 00 11 or 00 10 11 */ - { - BVBLENDMATCH(ONLY_A, INV_C1, NORM_A2), - BVBLENDMATCH(ONLY_A, INV_C2, NORM_A2), - - { - GCREG_BLENDING_MODE_COLOR, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_COLOR, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(false), BVSRC2USE(true) - } - }, - - /* #55: color factor: 11 01 11 C:(1-A1,A2)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #56: color factor: 11 10 00 C:(1-C2,C1)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #57: color factor: 11 10 01 C:(1-C2,A1)=1-C2 - alpha factor: 1-A2 ==> 00 11 00 or 00 11 10 */ - { - BVBLENDMATCH(ONLY_A, INV_A2, NORM_C1), - BVBLENDMATCH(ONLY_A, INV_A2, NORM_C2), - - { - GCREG_BLENDING_MODE_COLOR_INVERSED, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_COLOR_INVERSED, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(false), BVSRC2USE(true) - } - }, - - /* #58: color factor: 11 10 10 C:(1-C2,C2)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #59: color factor: 11 10 11 C:(1-C2,A2)=1-C2 - alpha factor: 1-A2 ==> 00 11 00 or 00 11 10 */ - { - BVBLENDMATCH(ONLY_A, INV_A2, NORM_C1), - BVBLENDMATCH(ONLY_A, INV_A2, NORM_C2), - - { - GCREG_BLENDING_MODE_COLOR_INVERSED, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_COLOR_INVERSED, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(false), BVSRC2USE(false) - } - }, - - /* #60: color factor: 11 11 00 C:(1-A2,C1)=C1 - alpha factor: A1 ==> 00 00 01 or 00 10 01 */ - { - BVBLENDMATCH(ONLY_A, INV_C1, NORM_A1), - BVBLENDMATCH(ONLY_A, INV_C2, NORM_A1), - - { - GCREG_BLENDING_MODE_COLOR, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(true), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_COLOR, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - } - }, - - /* #61: color factor: 11 11 01 C:(1-A2,A1)=undefined - alpha factor: N/A */ - BVBLENDUNDEFINED(), - - /* #62: color factor: 11 11 10 C:(1-A2,C2)=C2 - alpha factor: A2 ==> 00 00 11 or 00 10 11 */ - { - BVBLENDMATCH(ONLY_A, INV_C1, NORM_A2), - BVBLENDMATCH(ONLY_A, INV_C2, NORM_A2), - - { - GCREG_BLENDING_MODE_COLOR, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(true) - }, - - { - GCREG_BLENDING_MODE_COLOR, - GCREG_FACTOR_INVERSE_ENABLE, - BVSRC1USE(false), BVSRC2USE(true) - } - }, - - /* #63: color factor: 11 11 11 C:(1-A2,A2)=one - alpha factor: one ==> 11 11 11 */ - { - 0x3F, - 0x3F, - - { - GCREG_BLENDING_MODE_ONE, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(true), BVSRC2USE(false) - }, - - { - GCREG_BLENDING_MODE_ONE, - GCREG_FACTOR_INVERSE_DISABLE, - BVSRC1USE(false), BVSRC2USE(true) - } - } -}; - -enum bverror parse_blend(struct bvbltparams *bvbltparams, - enum bvblend blend, - struct gcalpha *gca) -{ - enum bverror bverror; - unsigned int global; - unsigned int k1, k2, k3, k4; - struct bvblendxlate *k1_xlate; - struct bvblendxlate *k2_xlate; - unsigned int alpha; - - GCENTERARG(GCZONE_BLEND, "blend = 0x%08X (%s)\n", - blend, gc_bvblend_name(blend)); - - if ((blend & BVBLENDDEF_REMOTE) != 0) { - BVSETBLTERROR(BVERR_BLEND, "remote alpha not supported"); - goto exit; - } - - global = (blend & BVBLENDDEF_GLOBAL_MASK) >> BVBLENDDEF_GLOBAL_SHIFT; - - switch (global) { - case (BVBLENDDEF_GLOBAL_NONE >> BVBLENDDEF_GLOBAL_SHIFT): - GCDBG(GCZONE_BLEND, "BVBLENDDEF_GLOBAL_NONE\n"); - - gca->src_global_color = - gca->dst_global_color = 0; - - gca->src_global_alpha_mode = GCREG_GLOBAL_ALPHA_MODE_NORMAL; - gca->dst_global_alpha_mode = GCREG_GLOBAL_ALPHA_MODE_NORMAL; - break; - - case (BVBLENDDEF_GLOBAL_UCHAR >> BVBLENDDEF_GLOBAL_SHIFT): - GCDBG(GCZONE_BLEND, "BVBLENDDEF_GLOBAL_UCHAR\n"); - - gca->src_global_color = - gca->dst_global_color = - ((unsigned int) bvbltparams->globalalpha.size8) << 24; - - gca->src_global_alpha_mode = GCREG_GLOBAL_ALPHA_MODE_GLOBAL; - gca->dst_global_alpha_mode = GCREG_GLOBAL_ALPHA_MODE_GLOBAL; - break; - - case (BVBLENDDEF_GLOBAL_FLOAT >> BVBLENDDEF_GLOBAL_SHIFT): - GCDBG(GCZONE_BLEND, "BVBLENDDEF_GLOBAL_FLOAT\n"); - - alpha = gcfp2norm8(bvbltparams->globalalpha.fp); - - gca->src_global_color = - gca->dst_global_color = alpha << 24; - - gca->src_global_alpha_mode = GCREG_GLOBAL_ALPHA_MODE_GLOBAL; - gca->dst_global_alpha_mode = GCREG_GLOBAL_ALPHA_MODE_GLOBAL; - break; - - default: - BVSETBLTERROR(BVERR_BLEND, "invalid global alpha mode"); - goto exit; - } - - /* - Co = k1 x C1 + k2 x C2 - Ao = k3 x A1 + k4 x A2 - */ - - k1 = (blend >> 18) & 0x3F; - k2 = (blend >> 12) & 0x3F; - k3 = (blend >> 6) & 0x3F; - k4 = blend & 0x3F; - - GCDBG(GCZONE_BLEND, "k1 = %d\n", k1); - GCDBG(GCZONE_BLEND, "k2 = %d\n", k2); - GCDBG(GCZONE_BLEND, "k3 = %d\n", k3); - GCDBG(GCZONE_BLEND, "k4 = %d\n", k4); - - k1_xlate = &blendxlate[k1]; - k2_xlate = &blendxlate[k2]; - - if (((k3 != k1_xlate->match1) && (k3 != k1_xlate->match2)) || - ((k4 != k2_xlate->match1) && (k4 != k2_xlate->match2))) { - BVSETBLTERROR(BVERR_BLEND, - "not supported coefficient combination"); - goto exit; - } - - gca->k1 = &k1_xlate->k1; - gca->k2 = &k2_xlate->k2; - - gca->src1used = gca->k1->src1used | gca->k2->src1used; - gca->src2used = gca->k1->src2used | gca->k2->src2used; - - bverror = BVERR_NONE; - -exit: - GCEXITARG(BVERR_BLEND, "bv%s = %d\n", - (bverror == BVERR_NONE) ? "result" : "error", bverror); - return bverror; -} - - -/******************************************************************************* - * Rotation and mirror. - */ - -#define BVFLAG_FLIP_MASK 0x00000003 - -#define BVFLAG_FLIP_SRC1_SHIFT 14 -#define BVFLAG_FLIP_SRC2_SHIFT 16 -#define BVFLAG_FLIP_MASK_SHIFT 18 - -#define GCREG_MIRROR_NONE 0x0 -#define GCREG_MIRROR_X 0x1 -#define GCREG_MIRROR_Y 0x2 -#define GCREG_MIRROR_XY 0x3 - -#define GCREG_ROT_ANGLE_ROT0 0x0 -#define GCREG_ROT_ANGLE_ROT90 0x4 -#define GCREG_ROT_ANGLE_ROT180 0x5 -#define GCREG_ROT_ANGLE_ROT270 0x6 - -#define ROT_ANGLE_INVALID -1 -#define ROT_ANGLE_0 0 -#define ROT_ANGLE_90 1 -#define ROT_ANGLE_180 2 -#define ROT_ANGLE_270 3 - -/* NOTE: BLTsville rotation is defined conunter clock wise. */ -const unsigned int rotencoding[] = { - GCREG_ROT_ANGLE_ROT0, /* ROT_ANGLE_0 */ - GCREG_ROT_ANGLE_ROT270, /* ROT_ANGLE_90 */ - GCREG_ROT_ANGLE_ROT180, /* ROT_ANGLE_180 */ - GCREG_ROT_ANGLE_ROT90 /* ROT_ANGLE_270 */ -}; - -static inline int get_angle(int orientation) -{ - int angle; - - /* Normalize the angle. */ - angle = orientation % 360; - - /* Flip to positive. */ - if (angle < 0) - angle = 360 + angle; - - /* Translate the angle. */ - switch (angle) { - case 0: return ROT_ANGLE_0; - case 90: return ROT_ANGLE_90; - case 180: return ROT_ANGLE_180; - case 270: return ROT_ANGLE_270; - } - - /* Not supported angle. */ - return ROT_ANGLE_INVALID; -} - - -/******************************************************************************* - * Surface compare and validation. - */ - -bool valid_rect(struct bvsurfgeom *bvsurfgeom, struct gcrect *gcrect) -{ - int width, height; - - if ((gcrect->left < 0) || (gcrect->top < 0)) { - GCERR("invalid rectangle origin: %d,%d.\n", - gcrect->left, gcrect->top); - return false; - } - - width = gcrect->right - gcrect->left; - height = gcrect->bottom - gcrect->top; - if ((width <= 0) || (height <= 0)) { - GCERR("invalid rectangle size: %d,%d.\n", - width, height); - return false; - } - - if (gcrect->right > (int) bvsurfgeom->width) { - GCERR("right coordinate (%d) exceeds surface width (%d).\n", - gcrect->right, bvsurfgeom->width); - return false; - } - - if (gcrect->bottom > (int) bvsurfgeom->height) { - GCERR("bottom coordinate (%d) exceeds surface height (%d).\n", - gcrect->bottom, bvsurfgeom->height); - return false; - } - - return true; -} - -static bool valid_geom(struct surfaceinfo *surfaceinfo) -{ - unsigned int size; - unsigned int height; - - /* Compute the size of the surface. */ - size = (surfaceinfo->geom->width * - surfaceinfo->geom->height * - surfaceinfo->format.allocbitspp) / 8; - - /* Make sure the size is not greater then the surface. */ - if (size > surfaceinfo->buf.desc->length) { - GCERR("invalid geometry detected:\n"); - GCERR(" specified dimensions: %dx%d, %d bitspp\n", - surfaceinfo->geom->width, - surfaceinfo->geom->height, - surfaceinfo->format.bitspp); - GCERR(" surface size based on the dimensions: %d\n", - size); - GCERR(" specified surface size: %lu\n", - surfaceinfo->buf.desc->length); - return false; - } - - /* Determine the height of the image. */ - height = ((surfaceinfo->angle % 2) == 0) - ? surfaceinfo->geom->height - : surfaceinfo->geom->width; - - /* Compute the size using the stide. */ - size = surfaceinfo->geom->virtstride * height; - - /* Make sure the size is not greater then the surface. */ - if (size > surfaceinfo->buf.desc->length) { - GCERR("invalid geometry detected:\n"); - GCERR(" specified dimensions: %dx%d, %d bitspp\n", - surfaceinfo->geom->width, - surfaceinfo->geom->height, - surfaceinfo->format.bitspp); - GCERR(" physical image height = %d\n", height); - GCERR(" image stride = %d\n", surfaceinfo->geom->virtstride); - GCERR(" computed surface size = %d\n", size); - GCERR(" specified surface size: %lu\n", - surfaceinfo->buf.desc->length); - return false; - } - - return true; -} - -int get_pixel_offset(struct surfaceinfo *surfaceinfo, int offset) -{ - unsigned int alignment; - int byteoffset; - unsigned int alignedoffset; - int pixeloffset; - - GCENTERARG(GCZONE_OFFSET, "surfaceinfo=0x%08X, offset=%d\n", - surfaceinfo, offset); - - alignment = (surfaceinfo->format.type == BVFMT_YUV) - ? (64 - 1) - : (16 - 1); - - GCDBG(GCZONE_OFFSET, "bpp = %d\n", surfaceinfo->format.bitspp); - GCDBG(GCZONE_OFFSET, "alignment = %d\n", alignment); - - /* Determine offset in bytes from the base modified by the - * given offset. */ - if (surfaceinfo->buf.desc->auxtype == BVAT_PHYSDESC) { - struct bvphysdesc *bvphysdesc; - bvphysdesc = (struct bvphysdesc *) - surfaceinfo->buf.desc->auxptr; - GCDBG(GCZONE_OFFSET, "physical descriptor = 0x%08X\n", - bvphysdesc); - GCDBG(GCZONE_OFFSET, "first page = 0x%08X\n", - bvphysdesc->pagearray[0]); - GCDBG(GCZONE_OFFSET, "page offset = 0x%08X\n", - bvphysdesc->pageoffset); - - byteoffset = bvphysdesc->pageoffset + offset; - } else { - GCDBG(GCZONE_OFFSET, "no physical descriptor.\n"); - byteoffset = (unsigned int) - surfaceinfo->buf.desc->virtaddr + offset; - } - - GCDBG(GCZONE_OFFSET, "byteoffset = %d\n", byteoffset); - - /* Compute the aligned offset. */ - alignedoffset = byteoffset & alignment; - - /* Convert to pixels. */ - pixeloffset = alignedoffset * 8 / surfaceinfo->format.bitspp; - - GCDBG(GCZONE_OFFSET, "alignedoffset = %d\n", alignedoffset); - GCDBG(GCZONE_OFFSET, "pixeloffset = %d\n", -pixeloffset); - - GCEXIT(GCZONE_OFFSET); - return -pixeloffset; -} - -enum bverror parse_destination(struct bvbltparams *bvbltparams, - struct gcbatch *batch) -{ - enum bverror bverror = BVERR_NONE; - - GCENTER(GCZONE_DEST); - - GCDBG(GCZONE_DEST, "parsing destination\n"); - - /* Did the destination surface change? */ - if ((batch->batchflags & BVBATCH_DST) != 0) { - struct surfaceinfo *dstinfo; - - /* Initialize the destination descriptor. */ - dstinfo = &batch->dstinfo; - dstinfo->index = -1; - dstinfo->buf.desc = bvbltparams->dstdesc; - dstinfo->geom = bvbltparams->dstgeom; - - /* Initialize members that are not used. */ - dstinfo->mirror = GCREG_MIRROR_NONE; - dstinfo->rop = 0; - dstinfo->gca = NULL; - - /* Parse the destination format. */ - if (parse_format(bvbltparams, dstinfo) != BVERR_NONE) { - bverror = BVERR_DSTGEOM_FORMAT; - goto exit; - } - - /* Parse orientation. */ - dstinfo->angle = get_angle(dstinfo->geom->orientation); - if (dstinfo->angle == ROT_ANGLE_INVALID) { - BVSETBLTERROR(BVERR_DSTGEOM, - "unsupported destination orientation %d.", - dstinfo->geom->orientation); - goto exit; - } - - /* Compute the destination alignments needed to compensate - * for the surface base address misalignment if any. */ - dstinfo->xpixalign = get_pixel_offset(dstinfo, 0); - dstinfo->ypixalign = 0; - dstinfo->bytealign = (dstinfo->xpixalign - * (int) dstinfo->format.bitspp) / 8; - - GCDBG(GCZONE_DEST, " buffer length = %d\n", - dstinfo->buf.desc->length); - GCDBG(GCZONE_DEST, " rotation %d degrees.\n", - dstinfo->angle * 90); - - if (dstinfo->buf.desc->auxtype == BVAT_PHYSDESC) { - struct bvphysdesc *bvphysdesc; - bvphysdesc = (struct bvphysdesc *) - dstinfo->buf.desc->auxptr; - GCDBG(GCZONE_DEST, " physical descriptor = 0x%08X\n", - bvphysdesc); - GCDBG(GCZONE_DEST, " first page = 0x%08X\n", - bvphysdesc->pagearray[0]); - GCDBG(GCZONE_DEST, " page offset = 0x%08X\n", - bvphysdesc->pageoffset); - } else { - GCDBG(GCZONE_DEST, " virtual address = 0x%08X\n", - (unsigned int) dstinfo->buf.desc->virtaddr); - } - - GCDBG(GCZONE_DEST, " stride = %ld\n", - dstinfo->geom->virtstride); - GCDBG(GCZONE_DEST, " geometry size = %dx%d\n", - dstinfo->geom->width, dstinfo->geom->height); - GCDBG(GCZONE_DEST, " surface offset (pixels) = %d,%d\n", - dstinfo->xpixalign, dstinfo->ypixalign); - GCDBG(GCZONE_DEST, " surface offset (bytes) = %d\n", - dstinfo->bytealign); - - /* Check for unsupported dest formats. */ - if ((dstinfo->format.type == BVFMT_YUV) && - (dstinfo->format.cs.yuv.planecount > 1)) { - BVSETBLTERROR(BVERR_DSTGEOM_FORMAT, - "destination format unsupported"); - goto exit; - } - - /* Destination stride must be 8 pixel aligned. */ - if ((dstinfo->geom->virtstride - & (dstinfo->format.bitspp - 1)) != 0) { - BVSETBLTERROR(BVERR_DSTGEOM_STRIDE, - "destination stride must be 8 pixel " - "aligned."); - goto exit; - } - - /* Validate geometry. */ - if (!valid_geom(dstinfo)) { - BVSETBLTERROR(BVERR_DSTGEOM, - "destination geom exceeds surface size"); - goto exit; - } - } - - /* Did clipping/destination rects change? */ - if ((batch->batchflags & (BVBATCH_CLIPRECT | - BVBATCH_DESTRECT | - BVBATCH_DST)) != 0) { - struct surfaceinfo *dstinfo; - struct gcrect cliprect; - struct gcrect *dstrect; - struct gcrect *dstrectaux; - - /* Get a shortcut to the destination surface. */ - dstinfo = &batch->dstinfo; - - /* Determine destination rectangle. */ - dstrect = &dstinfo->rect; - GCCONVERT_RECT(GCZONE_DEST, - " rect", - &bvbltparams->dstrect, - dstrect); - - /* Determine whether aux destination is specified. */ - batch->haveaux - = ((bvbltparams->flags & BVFLAG_SRC2_AUXDSTRECT) != 0); - GCDBG(GCZONE_DEST, " have aux dest = %d\n", batch->haveaux); - - /* Is clipping rectangle specified? */ - if ((bvbltparams->flags & BVFLAG_CLIP) == BVFLAG_CLIP) { - /* Convert the clipping rectangle. */ - GCCONVERT_RECT(GCZONE_DEST, - " clipping", - &bvbltparams->cliprect, - &cliprect); - - if ((cliprect.left < GC_CLIP_RESET_LEFT) || - (cliprect.top < GC_CLIP_RESET_TOP) || - (cliprect.right > GC_CLIP_RESET_RIGHT) || - (cliprect.bottom > GC_CLIP_RESET_BOTTOM)) { - BVSETERROR(BVERR_CLIP_RECT, - "clip rect is invalid"); - goto exit; - } - - /* Compute clipping deltas and the adjusted - * destination rect. */ - if (cliprect.left <= dstrect->left) { - batch->clipdelta.left = 0; - batch->dstclipped.left = dstrect->left; - } else { - batch->clipdelta.left = cliprect.left - - dstrect->left; - batch->dstclipped.left = cliprect.left; - } - - if (cliprect.top <= dstrect->top) { - batch->clipdelta.top = 0; - batch->dstclipped.top = dstrect->top; - } else { - batch->clipdelta.top = cliprect.top - - dstrect->top; - batch->dstclipped.top = cliprect.top; - } - - if (cliprect.right >= dstrect->right) { - batch->clipdelta.right = 0; - batch->dstclipped.right = dstrect->right; - } else { - batch->clipdelta.right = cliprect.right - - dstrect->right; - batch->dstclipped.right = cliprect.right; - } - - if (cliprect.bottom >= dstrect->bottom) { - batch->clipdelta.bottom = 0; - batch->dstclipped.bottom = dstrect->bottom; - } else { - batch->clipdelta.bottom = cliprect.bottom - - dstrect->bottom; - batch->dstclipped.bottom = cliprect.bottom; - } - - /* Clip the aux destination. */ - if (batch->haveaux) { - /* Convert the aux rectangle. */ - dstrectaux = &batch->dstrectaux; - GCCONVERT_RECT(GCZONE_DEST, - " aux rect", - &bvbltparams->src2auxdstrect, - dstrectaux); - - if (cliprect.left <= dstrectaux->left) - batch->dstclippedaux.left - = dstrectaux->left; - else - batch->dstclippedaux.left - = cliprect.left; - - if (cliprect.top <= dstrectaux->top) - batch->dstclippedaux.top - = dstrectaux->top; - else - batch->dstclippedaux.top - = cliprect.top; - - if (cliprect.right >= dstrectaux->right) - batch->dstclippedaux.right - = dstrectaux->right; - else - batch->dstclippedaux.right - = cliprect.right; - - if (cliprect.bottom >= dstrectaux->bottom) - batch->dstclippedaux.bottom - = dstrectaux->bottom; - else - batch->dstclippedaux.bottom - = cliprect.bottom; - } - } else { - batch->clipdelta.left = - batch->clipdelta.top = - batch->clipdelta.right = - batch->clipdelta.bottom = 0; - - batch->dstclipped = *dstrect; - if (batch->haveaux) - /* Convert the aux rectangle. */ - GCCONVERT_RECT(GCZONE_DEST, - " aux rect", - &bvbltparams->src2auxdstrect, - &batch->dstclippedaux); - } - - GCPRINT_RECT(GCZONE_DEST, " clipped dest", - &batch->dstclipped); - - /* Validate the destination rectangle. */ - if (!valid_rect(dstinfo->geom, &batch->dstclipped)) { - BVSETBLTERROR(BVERR_DSTRECT, - "invalid destination rectangle."); - goto exit; - } - - if (batch->haveaux) { - GCPRINT_RECT(GCZONE_DEST, " clipped aux dest", - &batch->dstclippedaux); - - /* Validate the aux destination rectangle. */ - if (!valid_rect(dstinfo->geom, &batch->dstclippedaux)) { - BVSETBLTERROR(BVERR_DSTRECT, - "invalid aux destination " - "rectangle."); - goto exit; - } - } - - GCDBG(GCZONE_DEST, - " clipping delta = (%d,%d)-(%d,%d)\n", - batch->clipdelta.left, - batch->clipdelta.top, - batch->clipdelta.right, - batch->clipdelta.bottom); - } - -exit: - GCEXITARG(GCZONE_DEST, "bv%s = %d\n", - (bverror == BVERR_NONE) ? "result" : "error", bverror); - return bverror; -} - -void process_dest_rotation(struct bvbltparams *bvbltparams, - struct gcbatch *batch) -{ - GCENTER(GCZONE_DEST); - - /* Did clipping/destination rects change? */ - if ((batch->batchflags & (BVBATCH_CLIPRECT | - BVBATCH_DESTRECT | - BVBATCH_DST)) != 0) { - struct surfaceinfo *dstinfo; - int dstoffsetX, dstoffsetY; - - /* Initialize the destination descriptor. */ - dstinfo = &batch->dstinfo; - - switch (dstinfo->angle) { - case ROT_ANGLE_0: - /* Determine the origin offset. */ - dstoffsetX = dstinfo->xpixalign; - dstoffsetY = dstinfo->ypixalign; - - /* Determine geometry size. */ - batch->dstwidth = dstinfo->geom->width - - dstinfo->xpixalign; - batch->dstheight = dstinfo->geom->height - - dstinfo->ypixalign; - - /* Determine the physical size. */ - dstinfo->physwidth = batch->dstwidth; - dstinfo->physheight = batch->dstheight; - break; - - case ROT_ANGLE_90: - /* Determine the origin offset. */ - dstoffsetX = dstinfo->ypixalign; - dstoffsetY = dstinfo->xpixalign; - - /* Determine geometry size. */ - batch->dstwidth = dstinfo->geom->width - - dstinfo->ypixalign; - batch->dstheight = dstinfo->geom->height - - dstinfo->xpixalign; - - /* Determine the physical size. */ - dstinfo->physwidth = dstinfo->geom->height - - dstinfo->xpixalign; - dstinfo->physheight = dstinfo->geom->width - - dstinfo->ypixalign; - break; - - case ROT_ANGLE_180: - /* Determine the origin offset. */ - dstoffsetX = 0; - dstoffsetY = 0; - - /* Determine geometry size. */ - batch->dstwidth = dstinfo->geom->width - - dstinfo->xpixalign; - batch->dstheight = dstinfo->geom->height - - dstinfo->ypixalign; - - /* Determine the physical size. */ - dstinfo->physwidth = batch->dstwidth; - dstinfo->physheight = batch->dstheight; - break; - - case ROT_ANGLE_270: - /* Determine the origin offset. */ - dstoffsetX = 0; - dstoffsetY = 0; - - /* Determine geometry size. */ - batch->dstwidth = dstinfo->geom->width - - dstinfo->ypixalign; - batch->dstheight = dstinfo->geom->height - - dstinfo->xpixalign; - - /* Determine the physical size. */ - dstinfo->physwidth = dstinfo->geom->height - - dstinfo->xpixalign; - dstinfo->physheight = dstinfo->geom->width - - dstinfo->ypixalign; - break; - - default: - dstoffsetX = 0; - dstoffsetY = 0; - } - - /* Compute adjusted destination rectangles. */ - batch->dstadjusted.left - = batch->dstclipped.left - - dstoffsetX; - batch->dstadjusted.top - = batch->dstclipped.top - - dstoffsetY; - batch->dstadjusted.right - = batch->dstclipped.right - - dstoffsetX; - batch->dstadjusted.bottom - = batch->dstclipped.bottom - - dstoffsetY; - - GCPRINT_RECT(GCZONE_DEST, "adjusted dest", - &batch->dstadjusted); - - GCDBG(GCZONE_DEST, "aligned geometry size = %dx%d\n", - batch->dstwidth, batch->dstheight); - GCDBG(GCZONE_DEST, "aligned physical size = %dx%d\n", - dstinfo->physwidth, dstinfo->physheight); - GCDBG(GCZONE_DEST, "origin offset (pixels) = %d,%d\n", - dstoffsetX, dstoffsetY); - } - - GCEXIT(GCZONE_DEST); -} - -enum bverror parse_source(struct bvbltparams *bvbltparams, - struct gcbatch *batch, - struct bvrect *srcrect, - struct surfaceinfo *srcinfo) -{ - enum bverror bverror = BVERR_NONE; - - GCENTER(GCZONE_SRC); - GCDBG(GCZONE_SRC, "parsing source #%d\n", - srcinfo->index + 1); - - /* Parse the source format. */ - if (parse_format(bvbltparams, srcinfo) != BVERR_NONE) { - bverror = (srcinfo->index == 0) - ? BVERR_SRC1GEOM_FORMAT - : BVERR_SRC2GEOM_FORMAT; - goto exit; - } - - /* Parse orientation. */ - srcinfo->angle = get_angle(srcinfo->geom->orientation); - if (srcinfo->angle == ROT_ANGLE_INVALID) { - BVSETBLTERROR((srcinfo->index == 0) - ? BVERR_SRC1GEOM - : BVERR_SRC2GEOM, - "unsupported source%d orientation %d.", - srcinfo->index + 1, - srcinfo->geom->orientation); - goto exit; - } - - /* Determine source mirror. */ - srcinfo->mirror = (srcinfo->index == 0) - ? (bvbltparams->flags >> BVFLAG_FLIP_SRC1_SHIFT) - & BVFLAG_FLIP_MASK - : (bvbltparams->flags >> BVFLAG_FLIP_SRC2_SHIFT) - & BVFLAG_FLIP_MASK; - - GCDBG(GCZONE_SRC, " buffer length = %d\n", srcinfo->buf.desc->length); - GCDBG(GCZONE_SRC, " rotation %d degrees.\n", srcinfo->angle * 90); - - if (srcinfo->buf.desc->auxtype == BVAT_PHYSDESC) { - struct bvphysdesc *bvphysdesc; - bvphysdesc = (struct bvphysdesc *) srcinfo->buf.desc->auxptr; - GCDBG(GCZONE_SRC, " physical descriptor = 0x%08X\n", - bvphysdesc); - GCDBG(GCZONE_SRC, " first page = 0x%08X\n", - bvphysdesc->pagearray[0]); - GCDBG(GCZONE_SRC, " page offset = 0x%08X\n", - bvphysdesc->pageoffset); - } else { - GCDBG(GCZONE_SRC, " virtual address = 0x%08X\n", - (unsigned int) srcinfo->buf.desc->virtaddr); - } - - GCDBG(GCZONE_SRC, " stride = %ld\n", - srcinfo->geom->virtstride); - GCDBG(GCZONE_SRC, " geometry size = %dx%d\n", - srcinfo->geom->width, srcinfo->geom->height); - GCDBG(GCZONE_SRC, " mirror = %d\n", srcinfo->mirror); - - /* Convert the rectangle. */ - GCCONVERT_RECT(GCZONE_SRC, - " rect", srcrect, &srcinfo->rect); - - /* Source must be 8 pixel aligned. */ - if ((srcinfo->geom->virtstride - & (srcinfo->format.bitspp - 1)) != 0) { - BVSETBLTERROR((srcinfo->index == 0) - ? BVERR_SRC1GEOM_STRIDE - : BVERR_SRC2GEOM_STRIDE, - "source stride must be 8 pixel aligned."); - goto exit; - } - - /* Planar YUV? */ - if ((srcinfo->format.type == BVFMT_YUV) && - (srcinfo->format.cs.yuv.planecount > 1)) { - int xpixalign; - - /* Source rotation is not supported. */ - if (srcinfo->angle != ROT_ANGLE_0) { - BVSETBLTERROR((srcinfo->index == 0) - ? BVERR_SRC1_ROT - : BVERR_SRC2_ROT, - "rotation of planar YUV is " - "not supported"); - goto exit; - } - - /* Check base address alignment. */ - xpixalign = get_pixel_offset(srcinfo, 0); - if (xpixalign != 0) { - BVSETBLTERROR((srcinfo->index == 0) - ? BVERR_SRC1DESC_ALIGNMENT - : BVERR_SRC2DESC_ALIGNMENT, - "planar YUV base address must be " - "64 byte aligned."); - goto exit; - } - } - - /* Validate source geometry. */ - if (!valid_geom(srcinfo)) { - BVSETBLTERROR((srcinfo->index == 0) - ? BVERR_SRC1GEOM - : BVERR_SRC2GEOM, - "source%d geom exceeds surface size.", - srcinfo->index + 1); - goto exit; - } - -exit: - GCEXITARG(GCZONE_SRC, "bv%s = %d\n", - (bverror == BVERR_NONE) ? "result" : "error", bverror); - return bverror; -} - -static enum bverror parse_implicitscale(struct bvbltparams *bvbltparams, - struct gcbatch *batch) -{ - enum bverror bverror = BVERR_NONE; - unsigned int quality; - unsigned int technique; - unsigned int imagetype; - - GCENTER(GCZONE_SCALING); - - quality = (bvbltparams->scalemode & BVSCALEDEF_QUALITY_MASK) - >> BVSCALEDEF_QUALITY_SHIFT; - technique = (bvbltparams->scalemode & BVSCALEDEF_TECHNIQUE_MASK) - >> BVSCALEDEF_TECHNIQUE_SHIFT; - imagetype = (bvbltparams->scalemode & BVSCALEDEF_TYPE_MASK) - >> BVSCALEDEF_TYPE_SHIFT; - - GCDBG(GCZONE_SCALING, "quality = %d\n", quality); - GCDBG(GCZONE_SCALING, "technique = %d\n", technique); - GCDBG(GCZONE_SCALING, "imagetype = %d\n", imagetype); - - switch (quality) { - case BVSCALEDEF_FASTEST >> BVSCALEDEF_QUALITY_SHIFT: - batch->op.filter.horkernelsize = 3; - batch->op.filter.verkernelsize = 3; - break; - - case BVSCALEDEF_GOOD >> BVSCALEDEF_QUALITY_SHIFT: - batch->op.filter.horkernelsize = 5; - batch->op.filter.verkernelsize = 5; - break; - - case BVSCALEDEF_BETTER >> BVSCALEDEF_QUALITY_SHIFT: - batch->op.filter.horkernelsize = 7; - batch->op.filter.verkernelsize = 7; - break; - - case BVSCALEDEF_BEST >> BVSCALEDEF_QUALITY_SHIFT: - batch->op.filter.horkernelsize = 9; - batch->op.filter.verkernelsize = 9; - break; - - default: - BVSETBLTERROR(BVERR_SCALE_MODE, - "unsupported scale quality 0x%02X", quality); - goto exit; - } - - switch (technique) { - case BVSCALEDEF_DONT_CARE >> BVSCALEDEF_TECHNIQUE_SHIFT: - case BVSCALEDEF_NOT_NEAREST_NEIGHBOR >> BVSCALEDEF_TECHNIQUE_SHIFT: - break; - - case BVSCALEDEF_POINT_SAMPLE >> BVSCALEDEF_TECHNIQUE_SHIFT: - batch->op.filter.horkernelsize = 1; - batch->op.filter.verkernelsize = 1; - break; - - case BVSCALEDEF_INTERPOLATED >> BVSCALEDEF_TECHNIQUE_SHIFT: - break; - - default: - BVSETBLTERROR(BVERR_SCALE_MODE, - "unsupported scale technique %d", technique); - goto exit; - } - - switch (imagetype) { - case 0: - case BVSCALEDEF_PHOTO >> BVSCALEDEF_TYPE_SHIFT: - case BVSCALEDEF_DRAWING >> BVSCALEDEF_TYPE_SHIFT: - break; - - default: - BVSETBLTERROR(BVERR_SCALE_MODE, - "unsupported image type %d", imagetype); - goto exit; - } - - GCDBG(GCZONE_SCALING, "kernel size = %dx%d\n", - batch->op.filter.horkernelsize, - batch->op.filter.verkernelsize); - -exit: - GCEXIT(GCZONE_SCALING); - return bverror; -} - -static enum bverror parse_explicitscale(struct bvbltparams *bvbltparams, - struct gcbatch *batch) -{ - enum bverror bverror = BVERR_NONE; - unsigned int horsize; - unsigned int versize; - - GCENTER(GCZONE_SCALING); - - horsize = (bvbltparams->scalemode & BVSCALEDEF_HORZ_MASK) - >> BVSCALEDEF_HORZ_SHIFT; - versize = (bvbltparams->scalemode & BVSCALEDEF_VERT_MASK) - >> BVSCALEDEF_VERT_SHIFT; - - GCDBG(GCZONE_SCALING, "horsize = %d\n", horsize); - GCDBG(GCZONE_SCALING, "versize = %d\n", versize); - - switch (horsize) { - case BVSCALEDEF_NEAREST_NEIGHBOR: - batch->op.filter.horkernelsize = 1; - break; - - case BVSCALEDEF_LINEAR: - case BVSCALEDEF_CUBIC: - case BVSCALEDEF_3_TAP: - batch->op.filter.horkernelsize = 3; - break; - - case BVSCALEDEF_5_TAP: - batch->op.filter.horkernelsize = 5; - break; - - case BVSCALEDEF_7_TAP: - batch->op.filter.horkernelsize = 7; - break; - - case BVSCALEDEF_9_TAP: - batch->op.filter.horkernelsize = 9; - break; - - default: - BVSETBLTERROR(BVERR_SCALE_MODE, - "unsupported horizontal kernel size %d", horsize); - goto exit; - } - - switch (versize) { - case BVSCALEDEF_NEAREST_NEIGHBOR: - batch->op.filter.verkernelsize = 1; - break; - - case BVSCALEDEF_LINEAR: - case BVSCALEDEF_CUBIC: - case BVSCALEDEF_3_TAP: - batch->op.filter.verkernelsize = 3; - break; - - case BVSCALEDEF_5_TAP: - batch->op.filter.verkernelsize = 5; - break; - - case BVSCALEDEF_7_TAP: - batch->op.filter.verkernelsize = 7; - break; - - case BVSCALEDEF_9_TAP: - batch->op.filter.verkernelsize = 9; - break; - - default: - BVSETBLTERROR(BVERR_SCALE_MODE, - "unsupported vertical kernel size %d", versize); - goto exit; - } - - GCDBG(GCZONE_SCALING, "kernel size = %dx%d\n", - batch->op.filter.horkernelsize, - batch->op.filter.verkernelsize); - -exit: - GCEXIT(GCZONE_SCALING); - return bverror; -} - -enum bverror parse_scalemode(struct bvbltparams *bvbltparams, - struct gcbatch *batch) -{ - enum bverror bverror; - unsigned int scaleclass; - - GCENTER(GCZONE_SCALING); - - scaleclass = (bvbltparams->scalemode & BVSCALEDEF_CLASS_MASK) - >> BVSCALEDEF_CLASS_SHIFT; - - GCDBG(GCZONE_SCALING, "scaleclass = %d\n", scaleclass); - - switch (scaleclass) { - case BVSCALEDEF_IMPLICIT >> BVSCALEDEF_CLASS_SHIFT: - bverror = parse_implicitscale(bvbltparams, batch); - break; - - case BVSCALEDEF_EXPLICIT >> BVSCALEDEF_CLASS_SHIFT: - bverror = parse_explicitscale(bvbltparams, batch); - break; - - default: - BVSETBLTERROR(BVERR_SCALE_MODE, - "unsupported scale class %d", scaleclass); - goto exit; - } - -exit: - GCEXIT(GCZONE_SCALING); - return bverror; -} |