// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../../include/fxge/fx_ge.h"
CFX_RenderDevice::CFX_RenderDevice()
{
    m_pDeviceDriver = NULL;
    m_pBitmap = NULL;
}
CFX_RenderDevice::~CFX_RenderDevice()
{
    if (m_pDeviceDriver) {
        delete m_pDeviceDriver;
    }
}
void CFX_RenderDevice::SetDeviceDriver(IFX_RenderDeviceDriver* pDriver)
{
    if (m_pDeviceDriver) {
        delete m_pDeviceDriver;
    }
    m_pDeviceDriver = pDriver;
    InitDeviceInfo();
}
void CFX_RenderDevice::InitDeviceInfo()
{
    ASSERT(m_pDeviceDriver != NULL);
    m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH);
    m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT);
    m_bpp = m_pDeviceDriver->GetDeviceCaps(FXDC_BITS_PIXEL);
    m_RenderCaps = m_pDeviceDriver->GetDeviceCaps(FXDC_RENDER_CAPS);
    m_DeviceClass = m_pDeviceDriver->GetDeviceCaps(FXDC_DEVICE_CLASS);
    if (!m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
        m_ClipBox.left = 0;
        m_ClipBox.top = 0;
        m_ClipBox.right = m_Width;
        m_ClipBox.bottom = m_Height;
    }
}
FX_BOOL CFX_RenderDevice::StartRendering()
{
    return m_pDeviceDriver->StartRendering();
}
void CFX_RenderDevice::EndRendering()
{
    m_pDeviceDriver->EndRendering();
}
void CFX_RenderDevice::SaveState()
{
    m_pDeviceDriver->SaveState();
}
void CFX_RenderDevice::RestoreState(FX_BOOL bKeepSaved)
{
    m_pDeviceDriver->RestoreState(bKeepSaved);
    UpdateClipBox();
}
int CFX_RenderDevice::GetDeviceCaps(int caps_id) const
{
    return m_pDeviceDriver->GetDeviceCaps(caps_id);
}
CFX_Matrix CFX_RenderDevice::GetCTM() const
{
    return m_pDeviceDriver->GetCTM();
}
FX_BOOL CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const
{
    if (m_RenderCaps & FXRC_CMYK_OUTPUT) {
        return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Cmyka : FXDIB_Cmyk);
    } else if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT) {
        return pDIB->Create(width, height, FXDIB_8bppMask);
    } else
#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_
        return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb32);
#else
        return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb);
#endif
}
FX_BOOL CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData,
        const CFX_AffineMatrix* pObject2Device,
        int fill_mode
                                          )
{
    if (!m_pDeviceDriver->SetClip_PathFill(pPathData, pObject2Device, fill_mode)) {
        return FALSE;
    }
    UpdateClipBox();
    return TRUE;
}
FX_BOOL CFX_RenderDevice::SetClip_PathStroke(const CFX_PathData* pPathData,
        const CFX_AffineMatrix* pObject2Device,
        const CFX_GraphStateData* pGraphState
                                            )
{
    if (!m_pDeviceDriver->SetClip_PathStroke(pPathData, pObject2Device, pGraphState)) {
        return FALSE;
    }
    UpdateClipBox();
    return TRUE;
}
FX_BOOL CFX_RenderDevice::SetClip_Rect(const FX_RECT* pRect)
{
    CFX_PathData path;
    path.AppendRect((FX_FLOAT)(pRect->left), (FX_FLOAT)(pRect->bottom), (FX_FLOAT)(pRect->right), (FX_FLOAT)(pRect->top));
    if (!SetClip_PathFill(&path, NULL, FXFILL_WINDING)) {
        return FALSE;
    }
    UpdateClipBox();
    return TRUE;
}
void CFX_RenderDevice::UpdateClipBox()
{
    if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
        return;
    }
    m_ClipBox.left = 0;
    m_ClipBox.top = 0;
    m_ClipBox.right = m_Width;
    m_ClipBox.bottom = m_Height;
}
FX_BOOL CFX_RenderDevice::DrawPath(const CFX_PathData* pPathData,
                                   const CFX_AffineMatrix* pObject2Device,
                                   const CFX_GraphStateData* pGraphState,
                                   FX_DWORD fill_color, FX_DWORD stroke_color, int fill_mode,
                                   int alpha_flag, void* pIccTransform, int blend_type)
{
    uint8_t fill_alpha, stroke_alpha;
    if (FXGETFLAG_COLORTYPE(alpha_flag)) {
        fill_alpha = FXGETFLAG_ALPHA_FILL(alpha_flag);
        stroke_alpha = FXGETFLAG_ALPHA_STROKE(alpha_flag);
    } else {
        fill_alpha = FXARGB_A(fill_color);
        stroke_alpha = FXARGB_A(stroke_color);
    }
    if ((fill_mode & 3) == 0) {
        fill_alpha = 0;
    }
    if (pGraphState == NULL) {
        stroke_alpha = 0;
    }
    if (stroke_alpha == 0 && pPathData->GetPointCount() == 2) {
        FX_PATHPOINT* pPoints = pPathData->GetPoints();
        FX_FLOAT x1, x2, y1, y2;
        if (pObject2Device) {
            pObject2Device->Transform(pPoints[0].m_PointX, pPoints[0].m_PointY, x1, y1);
            pObject2Device->Transform(pPoints[1].m_PointX, pPoints[1].m_PointY, x2, y2);
        } else {
            x1 = pPoints[0].m_PointX;
            y1 = pPoints[0].m_PointY;
            x2 = pPoints[1].m_PointX;
            y2 = pPoints[1].m_PointY;
        }
        DrawCosmeticLine(x1, y1, x2, y2, fill_color, fill_mode, alpha_flag, pIccTransform, blend_type);
        return TRUE;
    }
    if ((pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) && stroke_alpha == 0) {
        CFX_FloatRect rect_f;
        if (!(fill_mode & FXFILL_RECT_AA) && pPathData->IsRect(pObject2Device, &rect_f)) {
            FX_RECT rect_i = rect_f.GetOutterRect();
            int width = (int)FXSYS_ceil(rect_f.right - rect_f.left);
            if (width < 1) {
                width = 1;
                if (rect_i.left == rect_i.right) {
                    rect_i.right ++;
                }
            }
            int height = (int)FXSYS_ceil(rect_f.top - rect_f.bottom);
            if (height < 1) {
                height = 1;
                if (rect_i.bottom == rect_i.top) {
                    rect_i.bottom ++;
                }
            }
            if (rect_i.Width() >= width + 1) {
                if (rect_f.left - (FX_FLOAT)(rect_i.left) > (FX_FLOAT)(rect_i.right) - rect_f.right) {
                    rect_i.left ++;
                } else {
                    rect_i.right --;
                }
            }
            if (rect_i.Height() >= height + 1) {
                if (rect_f.top - (FX_FLOAT)(rect_i.top) > (FX_FLOAT)(rect_i.bottom) - rect_f.bottom) {
                    rect_i.top ++;
                } else {
                    rect_i.bottom --;
                }
            }
            if (FillRect(&rect_i, fill_color, alpha_flag, pIccTransform, blend_type)) {
                return TRUE;
            }
        }
    }
    if((fill_mode & 3) && stroke_alpha == 0 && !(fill_mode & FX_FILL_STROKE) && !(fill_mode & FX_FILL_TEXT_MODE)) {
        CFX_PathData newPath;
        FX_BOOL bThin = FALSE;
        if (pPathData->GetZeroAreaPath(newPath, (CFX_Matrix*)pObject2Device, bThin, m_pDeviceDriver->GetDriverType())) {
            CFX_GraphStateData graphState;
            graphState.m_LineWidth = 0.0f;
            FX_DWORD strokecolor = fill_color;
            if (bThin) {
                if (FXGETFLAG_COLORTYPE(alpha_flag)) {
                    FXSETFLAG_ALPHA_STROKE(alpha_flag, fill_alpha >> 2);
                } else {
                    strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff));
                }
            }
            CFX_AffineMatrix* pMatrix = NULL;
            if (pObject2Device && !pObject2Device->IsIdentity()) {
                pMatrix = (CFX_AffineMatrix*)pObject2Device;
            }
            int smooth_path = FX_ZEROAREA_FILL;
            if (fill_mode & FXFILL_NOPATHSMOOTH) {
                smooth_path |= FXFILL_NOPATHSMOOTH;
            }
            m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor, smooth_path, alpha_flag, pIccTransform, blend_type);
        }
    }
    if ((fill_mode & 3) && fill_alpha && stroke_alpha < 0xff && (fill_mode & FX_FILL_STROKE)) {
        if (!(m_RenderCaps & FXRC_GET_BITS)) {
            return FALSE;
        }
        CFX_FloatRect bbox;
        if (pGraphState) {
            bbox = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);
        } else {
            bbox = pPathData->GetBoundingBox();
        }
        if (pObject2Device) {
            bbox.Transform(pObject2Device);
        }
        CFX_Matrix ctm = GetCTM();
        FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
        FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
        FX_RECT rect = bbox.GetOutterRect();
        CFX_DIBitmap bitmap, Backdrop;
        if (!CreateCompatibleBitmap(&bitmap, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY))) {
            return FALSE;
        }
        if (bitmap.HasAlpha()) {
            bitmap.Clear(0);
            Backdrop.Copy(&bitmap);
        } else {
            if (!m_pDeviceDriver->GetDIBits(&bitmap, rect.left, rect.top, NULL)) {
                return FALSE;
            }
            Backdrop.Copy(&bitmap);
        }
        CFX_FxgeDevice bitmap_device;
        bitmap_device.Attach(&bitmap, 0, FALSE, &Backdrop, TRUE);
        CFX_AffineMatrix matrix;
        if (pObject2Device) {
            matrix = *pObject2Device;
        }
        matrix.TranslateI(-rect.left, -rect.top);
        matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);
        if (!bitmap_device.GetDeviceDriver()->DrawPath(pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
            return FALSE;
        }
        FX_RECT src_rect(0, 0, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY));
        return m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, rect.left, rect.top, FXDIB_BLEND_NORMAL);
    }
    return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type);
}
FX_BOOL CFX_RenderDevice::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
{
    if (m_pDeviceDriver->SetPixel(x, y, color, alpha_flag, pIccTransform)) {
        return TRUE;
    }
    FX_RECT rect(x, y, x + 1, y + 1);
    return FillRect(&rect, color, alpha_flag, pIccTransform);
}
FX_BOOL CFX_RenderDevice::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
{
    if (m_pDeviceDriver->FillRect(pRect, fill_color, alpha_flag, pIccTransform, blend_type)) {
        return TRUE;
    }
    if (!(m_RenderCaps & FXRC_GET_BITS)) {
        return FALSE;
    }
    CFX_DIBitmap bitmap;
    if (!CreateCompatibleBitmap(&bitmap, pRect->Width(), pRect->Height())) {
        return FALSE;
    }
    if (!m_pDeviceDriver->GetDIBits(&bitmap, pRect->left, pRect->top)) {
        return FALSE;
    }
    if (!bitmap.CompositeRect(0, 0, pRect->Width(), pRect->Height(), fill_color, alpha_flag, pIccTransform)) {
        return FALSE;
    }
    FX_RECT src_rect(0, 0, pRect->Width(), pRect->Height());
    m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, pRect->left, pRect->top, FXDIB_BLEND_NORMAL);
    return TRUE;
}
FX_BOOL CFX_RenderDevice::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
        int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
{
    if (((m_RenderCaps & FXRC_ALPHA_PATH) &&
            (FXGETFLAG_COLORTYPE(alpha_flag) && FXGETFLAG_ALPHA_FILL(alpha_flag) == 0xff)) ||
            color >= 0xff000000)
        if (m_pDeviceDriver->DrawCosmeticLine(x1, y1, x2, y2, color, alpha_flag, pIccTransform, blend_type)) {
            return TRUE;
        }
    CFX_GraphStateData graph_state;
    CFX_PathData path;
    path.SetPointCount(2);
    path.SetPoint(0, x1, y1, FXPT_MOVETO);
    path.SetPoint(1, x2, y2, FXPT_LINETO);
    return m_pDeviceDriver->DrawPath(&path, NULL, &graph_state, 0, color, fill_mode, alpha_flag, pIccTransform, blend_type);
}
FX_BOOL CFX_RenderDevice::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform)
{
    if (!(m_RenderCaps & FXRC_GET_BITS)) {
        return FALSE;
    }
    return m_pDeviceDriver->GetDIBits(pBitmap, left, top, pIccTransform);
}
CFX_DIBitmap* CFX_RenderDevice::GetBackDrop()
{
    return m_pDeviceDriver->GetBackDrop();
}
FX_BOOL CFX_RenderDevice::SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_mode,
                                    void* pIccTransform)
{
    ASSERT(!pBitmap->IsAlphaMask());
    CFX_AffineMatrix ctm = GetCTM();
    FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
    FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
    FX_RECT dest_rect(left, top, FXSYS_round(left + pBitmap->GetWidth() / fScaleX), FXSYS_round(top + pBitmap->GetHeight() / fScaleY));
    dest_rect.Intersect(m_ClipBox);
    if (dest_rect.IsEmpty()) {
        return TRUE;
    }
    FX_RECT src_rect(dest_rect.left - left, dest_rect.top - top,
                     dest_rect.left - left + dest_rect.Width(), dest_rect.top - top + dest_rect.Height());
    src_rect.left = FXSYS_round(src_rect.left * fScaleX);
    src_rect.top = FXSYS_round(src_rect.top * fScaleY);
    src_rect.right = FXSYS_round(src_rect.right * fScaleX);
    src_rect.bottom = FXSYS_round(src_rect.bottom * fScaleY);
    if ((blend_mode != FXDIB_BLEND_NORMAL && !(m_RenderCaps & FXRC_BLEND_MODE)) ||
            (pBitmap->HasAlpha() && !(m_RenderCaps & FXRC_ALPHA_IMAGE))) {
        if (!(m_RenderCaps & FXRC_GET_BITS)) {
            return FALSE;
        }
        int bg_pixel_width = FXSYS_round(dest_rect.Width() * fScaleX);
        int bg_pixel_height = FXSYS_round(dest_rect.Height() * fScaleY);
        CFX_DIBitmap background;
        if (!background.Create(bg_pixel_width, bg_pixel_height,
                               (m_RenderCaps & FXRC_CMYK_OUTPUT) ? FXDIB_Cmyk : FXDIB_Rgb32)) {
            return FALSE;
        }
        if (!m_pDeviceDriver->GetDIBits(&background, dest_rect.left, dest_rect.top)) {
            return FALSE;
        }
        if (!background.CompositeBitmap(0, 0, bg_pixel_width, bg_pixel_height,
                                        pBitmap, src_rect.left, src_rect.top,
                                        blend_mode, NULL, FALSE, pIccTransform)) {
            return FALSE;
        }
        FX_RECT src_rect(0, 0, bg_pixel_width, bg_pixel_height);
        return m_pDeviceDriver->SetDIBits(&background, 0, &src_rect, dest_rect.left, dest_rect.top, FXDIB_BLEND_NORMAL);
    }
    return m_pDeviceDriver->SetDIBits(pBitmap, 0, &src_rect, dest_rect.left, dest_rect.top, blend_mode, 0, pIccTransform);
}
FX_BOOL CFX_RenderDevice::StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top,
                                        int dest_width, int dest_height, FX_DWORD flags,
                                        void* pIccTransform, int blend_mode)
{
    FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
    FX_RECT clip_box = m_ClipBox;
    clip_box.Intersect(dest_rect);
    if (clip_box.IsEmpty()) {
        return TRUE;
    }
    return m_pDeviceDriver->StretchDIBits(pBitmap, 0, left, top, dest_width, dest_height, &clip_box, flags, 0, pIccTransform, blend_mode);
}
FX_BOOL CFX_RenderDevice::SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD argb,
                                     int alpha_flag, void* pIccTransform)
{
    FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
    return m_pDeviceDriver->SetDIBits(pBitmap, argb, &src_rect, left, top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);
}
FX_BOOL CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top,
        int dest_width, int dest_height, FX_DWORD argb, FX_DWORD flags,
        int alpha_flag, void* pIccTransform)
{
    FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
    FX_RECT clip_box = m_ClipBox;
    clip_box.Intersect(dest_rect);
    return m_pDeviceDriver->StretchDIBits(pBitmap, argb, left, top, dest_width, dest_height, &clip_box, flags, alpha_flag, pIccTransform);
}
FX_BOOL CFX_RenderDevice::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD argb,
                                      const CFX_AffineMatrix* pMatrix, FX_DWORD flags, void*& handle,
                                      int alpha_flag, void* pIccTransform, int blend_mode)
{
    return m_pDeviceDriver->StartDIBits(pBitmap, bitmap_alpha, argb, pMatrix, flags, handle, alpha_flag, pIccTransform, blend_mode);
}
FX_BOOL CFX_RenderDevice::ContinueDIBits(void* handle, IFX_Pause* pPause)
{
    return m_pDeviceDriver->ContinueDIBits(handle, pPause);
}
void CFX_RenderDevice::CancelDIBits(void* handle)
{
    m_pDeviceDriver->CancelDIBits(handle);
}
