Blame libfreerdp/primitives/prim_YCoCg.c

Packit Service fa4841
/* FreeRDP: A Remote Desktop Protocol Client
Packit Service fa4841
 * YCoCg<->RGB Color conversion operations.
Packit Service fa4841
 * vi:ts=4 sw=4:
Packit Service fa4841
 *
Packit Service fa4841
 * (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include <freerdp/types.h>
Packit Service fa4841
#include <freerdp/primitives.h>
Packit Service fa4841
Packit Service fa4841
#include "prim_internal.h"
Packit Service fa4841
Packit Service fa4841
/* ------------------------------------------------------------------------- */
Packit Service b1ea74
static pstatus_t general_YCoCgToRGB_8u_AC4R(const BYTE* pSrc, INT32 srcStep, BYTE* pDst,
Packit Service b1ea74
                                            UINT32 DstFormat, INT32 dstStep, UINT32 width,
Packit Service b1ea74
                                            UINT32 height, UINT8 shift, BOOL withAlpha)
Packit Service fa4841
{
Packit Service fa4841
	BYTE A;
Packit Service fa4841
	UINT32 x, y;
Packit Service fa4841
	BYTE* dptr = pDst;
Packit Service fa4841
	const BYTE* sptr = pSrc;
Packit Service fa4841
	INT16 Cg, Co, Y, T, R, G, B;
Packit Service fa4841
	const DWORD formatSize = GetBytesPerPixel(DstFormat);
Packit Service fa4841
	fkt_writePixel writePixel = getPixelWriteFunction(DstFormat);
Packit Service b1ea74
	int cll = shift - 1; /* -1 builds in the /2's */
Packit Service fa4841
	UINT32 srcPad = srcStep - (width * 4);
Packit Service fa4841
	UINT32 dstPad = dstStep - (width * formatSize);
Packit Service fa4841
Packit Service fa4841
	for (y = 0; y < height; y++)
Packit Service fa4841
	{
Packit Service fa4841
		for (x = 0; x < width; x++)
Packit Service fa4841
		{
Packit Service fa4841
			/* Note: shifts must be done before sign-conversion. */
Packit Service fa4841
			Cg = (INT16)((INT8)((*sptr++) << cll));
Packit Service fa4841
			Co = (INT16)((INT8)((*sptr++) << cll));
Packit Service b1ea74
			Y = (INT16)(*sptr++); /* UINT8->INT16 */
Packit Service fa4841
			A = *sptr++;
Packit Service fa4841
Packit Service fa4841
			if (!withAlpha)
Packit Service fa4841
				A = 0xFFU;
Packit Service fa4841
Packit Service b1ea74
			T = Y - Cg;
Packit Service b1ea74
			B = T + Co;
Packit Service b1ea74
			G = Y + Cg;
Packit Service b1ea74
			R = T - Co;
Packit Service b1ea74
			dptr = (*writePixel)(dptr, formatSize, DstFormat, CLIP(R), CLIP(G), CLIP(B), A);
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		sptr += srcPad;
Packit Service fa4841
		dptr += dstPad;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return PRIMITIVES_SUCCESS;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/* ------------------------------------------------------------------------- */
Packit Service fa4841
void primitives_init_YCoCg(primitives_t* prims)
Packit Service fa4841
{
Packit Service fa4841
	prims->YCoCgToRGB_8u_AC4R = general_YCoCgToRGB_8u_AC4R;
Packit Service fa4841
}