1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FXGE_FX_DIB_H_ 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FXGE_FX_DIB_H_ 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <tuple> 11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <utility> 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_coordinates.h" 14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/widestring.h" 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovenum FXDIB_Format { 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_Invalid = 0, 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_1bppRgb = 0x001, 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_8bppRgb = 0x008, 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_Rgb = 0x018, 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_Rgb32 = 0x020, 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXDIB_1bppMask = 0x101, 23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXDIB_8bppMask = 0x108, 24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXDIB_8bppRgba = 0x208, 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXDIB_Rgba = 0x218, 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_Argb = 0x220, 27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXDIB_1bppCmyk = 0x401, 28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXDIB_8bppCmyk = 0x408, 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_Cmyk = 0x420, 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXDIB_8bppCmyka = 0x608, 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_Cmyka = 0x620, 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstruct PixelWeight { 35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int m_SrcStart; 36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int m_SrcEnd; 37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int m_Weights[1]; 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanntypedef uint32_t FX_ARGB; 41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanntypedef uint32_t FX_COLORREF; 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanntypedef uint32_t FX_CMYK; 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass CFX_ClipRgn; 44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass CFX_DIBSource; 45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass CStretchEngine; 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannextern const int16_t SDP_Table[513]; 48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_DOWNSAMPLE 0x04 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_INTERPOL 0x20 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BICUBIC_INTERPOL 0x80 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_NOSMOOTH 0x100 53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_NORMAL 0 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_MULTIPLY 1 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_SCREEN 2 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_OVERLAY 3 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_DARKEN 4 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_LIGHTEN 5 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_COLORDODGE 6 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_COLORBURN 7 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_HARDLIGHT 8 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_SOFTLIGHT 9 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_DIFFERENCE 10 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_EXCLUSION 11 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_NONSEPARABLE 21 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_HUE 21 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_SATURATION 22 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_COLOR 23 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_LUMINOSITY 24 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_BLEND_UNSUPPORTED -1 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_RGB(r, g, b) ((r) | ((g) << 8) | ((b) << 16)) 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetRValue(rgb) ((rgb)&0xff) 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff) 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff) 77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetCValue(cmyk) ((uint8_t)((cmyk) >> 24) & 0xff) 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetMValue(cmyk) ((uint8_t)((cmyk) >> 16) & 0xff) 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetYValue(cmyk) ((uint8_t)((cmyk) >> 8) & 0xff) 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXSYS_GetKValue(cmyk) ((uint8_t)(cmyk)&0xff) 82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanninline FX_CMYK CmykEncode(int c, int m, int y, int k) { 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (c << 24) | (m << 16) | (y << 8) | k; 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Returns tuple a, r, g, b 88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::tuple<int, int, int, int> ArgbDecode(FX_ARGB argb); 89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Returns pair a, rgb 91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::pair<int, FX_COLORREF> ArgbToColorRef(FX_ARGB argb); 92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanninline FX_ARGB ArgbEncode(int a, int r, int g, int b) { 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (a << 24) | (r << 16) | (g << 8) | b; 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_ARGB ArgbEncode(int a, FX_COLORREF rgb); 97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFX_ARGB StringToFXARGB(const WideStringView& view); 99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_A(argb) ((uint8_t)((argb) >> 24)) 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_R(argb) ((uint8_t)((argb) >> 16)) 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_G(argb) ((uint8_t)((argb) >> 8)) 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_B(argb) ((uint8_t)(argb)) 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_MAKE(a, r, g, b) \ 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (((uint32_t)(a) << 24) | ((r) << 16) | ((g) << 8) | (b)) 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_MUL_ALPHA(argb, alpha) \ 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb)&0xffffff)) 108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXRGB2GRAY(r, g, b) (((b)*11 + (g)*59 + (r)*30) / 100) 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) \ 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (((backdrop) * (255 - (source_alpha)) + (source) * (source_alpha)) / 255) 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_GETDIB(p) \ 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((((uint8_t*)(p))[0]) | (((uint8_t*)(p))[1] << 8) | \ 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (((uint8_t*)(p))[2] << 16) | (((uint8_t*)(p))[3] << 24)) 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_SETDIB(p, argb) \ 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)(p))[0] = (uint8_t)(argb), \ 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8), \ 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)(p))[2] = (uint8_t)((argb) >> 16), \ 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)(p))[3] = (uint8_t)((argb) >> 24) 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_SETRGBORDERDIB(p, argb) \ 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)(p))[3] = (uint8_t)(argb >> 24), \ 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)(p))[0] = (uint8_t)((argb) >> 16), \ 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8), \ 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)(p))[2] = (uint8_t)(argb) 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FXARGB_TODIB(argb) (argb) 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXCMYK_TODIB(cmyk) \ 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t)((cmyk) >> 24) | ((uint8_t)((cmyk) >> 16)) << 8 | \ 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t)((cmyk) >> 8)) << 16 | ((uint8_t)(cmyk) << 24)) 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FXARGB_TOBGRORDERDIB(argb) \ 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t)(argb >> 16) | ((uint8_t)(argb >> 8)) << 8 | \ 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t)(argb)) << 16 | ((uint8_t)(argb >> 24) << 24)) 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFX_RECT FXDIB_SwapClipBox(FX_RECT& clip, 134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int width, 135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int height, 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bFlipX, 137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bFlipY); 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif // CORE_FXGE_FX_DIB_H_ 140