blob: f5b44f7f4a263426bf63ba280ef00f3a2f1113ae [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Igor V. Stolyarov
*/
#include "BitmapSurface.h"
#include "org_apache_harmony_awt_gl_windows_BitmapSurface.h"
JNIEXPORT jlong JNICALL Java_org_apache_harmony_awt_gl_windows_BitmapSurface_createSurfData
(JNIEnv *env, jobject obj, jlong gi, jint width, jint height){
SURFACE_STRUCTURE *surf = (SURFACE_STRUCTURE *)calloc(sizeof(SURFACE_STRUCTURE), 1);
surf->width = width;
surf->height = height;
surf->gi = (GraphicsInfo *)gi;
parseFormat(surf);
return (jlong)surf;
}
JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_windows_BitmapSurface_dispose
(JNIEnv *env, jobject obj, jlong surfDataPtr){
SURFACE_STRUCTURE *surf = (SURFACE_STRUCTURE *)surfDataPtr;
if(surf){
if(surf->bits) free(surf->bits);
if(surf->colormap) free(surf->colormap);
if(surf->bank_indexes) free(surf->bank_indexes);
if(surf->band_offsets) free(surf->band_offsets);
if(surf->bmpData) free(surf->bmpData);
free(surf);
}
}
void parseFormat(SURFACE_STRUCTURE *surfStruct){
surfStruct->bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(surfStruct->gi->hdc, surfStruct->gi->bmp, 0, 1, NULL, (BITMAPINFO *)&surfStruct->bmpInfo, DIB_RGB_COLORS);
GetDIBits(surfStruct->gi->hdc, surfStruct->gi->bmp, 0, 1, NULL, (BITMAPINFO *)&surfStruct->bmpInfo, DIB_RGB_COLORS);
DWORD imageSize = surfStruct->bmpInfo.bmiHeader.biSizeImage;
surfStruct->scanline_stride_byte = imageSize / surfStruct->bmpInfo.bmiHeader.biHeight;
surfStruct->pixel_stride = surfStruct->bmpInfo.bmiHeader.biBitCount;
surfStruct->transparency = GL_OPAQUE;
surfStruct->alpha_pre = false;
if(surfStruct->bmpInfo.bmiHeader.biCompression == BI_BITFIELDS){
DWORD *mask = (DWORD *)surfStruct->bmpInfo.bmiColors;
surfStruct->alpha_mask = 0;
if(mask[0] == 0x7c00 && mask[1] == 0x03e0 && mask[2] == 0x1f){
surfStruct->ss_type = USHORT_555;
surfStruct->red_mask = 0x7c00;
surfStruct->green_mask = 0x03e0;
surfStruct->blue_mask = 0x1f;
surfStruct->scanline_stride = surfStruct->scanline_stride_byte >> 1;
}else if(mask[0] == 0xf800 && mask[1] == 0x07e0 && mask[2] == 0x1f){
surfStruct->ss_type = USHORT_565;
surfStruct->red_mask = 0xf800;
surfStruct->green_mask = 0x07e0;
surfStruct->blue_mask = 0x1f;
surfStruct->scanline_stride = surfStruct->scanline_stride_byte >> 1;
}else if(mask[0] == 0xff0000 && mask[1] == 0xff00 && mask[2] == 0xff){
surfStruct->ss_type = INT_RGB;
surfStruct->red_mask = 0xff0000;
surfStruct->green_mask = 0xff00;
surfStruct->blue_mask = 0xff;
surfStruct->scanline_stride = surfStruct->scanline_stride_byte >> 2;
}else{
surfStruct->ss_type = -1;
return;
}
}else{
if(surfStruct->bmpInfo.bmiHeader.biBitCount <= 8){
if(surfStruct->bmpInfo.bmiHeader.biBitCount <= 4){
surfStruct->ss_type = BYTE_BINARY;
}else{
surfStruct->ss_type = BYTE_INDEXED;
}
surfStruct->colormap_size = 1 << surfStruct->pixel_stride;
surfStruct->colormap = (int *)malloc(surfStruct->colormap_size * sizeof(int));
memcpy(surfStruct->colormap, surfStruct->bmpInfo.bmiColors, surfStruct->colormap_size * sizeof(DWORD));
surfStruct->scanline_stride = surfStruct->scanline_stride_byte;
}else if(surfStruct->bmpInfo.bmiHeader.biBitCount <= 16){
surfStruct->ss_type = USHORT_555;
surfStruct->red_mask = 0x7c00;
surfStruct->green_mask = 0x03e0;
surfStruct->blue_mask = 0x1f;
surfStruct->alpha_mask = 0;
surfStruct->scanline_stride = surfStruct->scanline_stride_byte >> 1;
}else if(surfStruct->bmpInfo.bmiHeader.biBitCount <= 24){
surfStruct->ss_type = BYTE_BGR;
surfStruct->scanline_stride = surfStruct->scanline_stride_byte;
}else{
surfStruct->ss_type = BYTE_ABGR;
surfStruct->scanline_stride = surfStruct->scanline_stride_byte >> 2;
}
}
surfStruct->bmpInfo.bmiHeader.biHeight = -surfStruct->bmpInfo.bmiHeader.biHeight;
}