From 0e9d92e8f9bb227e2cad8d01c64d06255de936fe Mon Sep 17 00:00:00 2001 From: DrKLO Date: Wed, 26 Mar 2014 16:24:54 +0400 Subject: [PATCH 1/7] Fixed possible crashes --- .../java/org/telegram/PhoneFormat/CallingCodeInfo.java | 10 +++++----- .../main/java/org/telegram/PhoneFormat/RuleSet.java | 2 +- .../java/org/telegram/messenger/MediaController.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/PhoneFormat/CallingCodeInfo.java b/TMessagesProj/src/main/java/org/telegram/PhoneFormat/CallingCodeInfo.java index 87e6e008..666d508a 100644 --- a/TMessagesProj/src/main/java/org/telegram/PhoneFormat/CallingCodeInfo.java +++ b/TMessagesProj/src/main/java/org/telegram/PhoneFormat/CallingCodeInfo.java @@ -27,11 +27,11 @@ package org.telegram.PhoneFormat; import java.util.ArrayList; public class CallingCodeInfo { - public ArrayList countries; - public String callingCode; - public ArrayList trunkPrefixes; - public ArrayList intlPrefixes; - public ArrayList ruleSets; + public ArrayList countries = new ArrayList(); + public String callingCode = ""; + public ArrayList trunkPrefixes = new ArrayList(); + public ArrayList intlPrefixes = new ArrayList(); + public ArrayList ruleSets = new ArrayList(); //public ArrayList formatStrings; String matchingAccessCode(String str) { diff --git a/TMessagesProj/src/main/java/org/telegram/PhoneFormat/RuleSet.java b/TMessagesProj/src/main/java/org/telegram/PhoneFormat/RuleSet.java index e4668899..5b7ecacf 100644 --- a/TMessagesProj/src/main/java/org/telegram/PhoneFormat/RuleSet.java +++ b/TMessagesProj/src/main/java/org/telegram/PhoneFormat/RuleSet.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; public class RuleSet { public int matchLen; - public ArrayList rules; + public ArrayList rules = new ArrayList(); public boolean hasRuleWithIntlPrefix; public boolean hasRuleWithTrunkPrefix; public static Pattern pattern = Pattern.compile("[0-9]+"); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java index 1650af23..f58f7b08 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java @@ -831,7 +831,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel recordDialogId = dialog_id; fileBuffer.rewind(); - if (android.os.Build.VERSION.SDK_INT >= 16) { + /*if (android.os.Build.VERSION.SDK_INT >= 16) { some devices crash with it AutomaticGainControl agc = null; try { if (AutomaticGainControl.isAvailable()) { @@ -850,7 +850,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } FileLog.e("tmessages", e); } - } + }*/ audioRecorder.startRecording(); } catch (Exception e) { From 22918f143a5d54cc56282575246e686d3baac3db Mon Sep 17 00:00:00 2001 From: DrKLO Date: Thu, 27 Mar 2014 00:16:28 +0400 Subject: [PATCH 2/7] Fixed photo sharing on devices with low memory --- TMessagesProj/build.gradle | 2 +- .../telegram/messenger/LocaleController.java | 5 +- .../telegram/messenger/MediaController.java | 36 +++--- .../telegram/messenger/MessagesStorage.java | 105 ++++++++++++++++++ .../java/org/telegram/ui/ChatActivity.java | 104 +++++++++++++++-- .../org/telegram/ui/ChatProfileActivity.java | 10 +- .../org/telegram/ui/GroupCreateActivity.java | 9 +- .../telegram/ui/GroupCreateFinalActivity.java | 75 ++++++++++++- .../java/org/telegram/ui/LaunchActivity.java | 65 +++++++++++ .../org/telegram/ui/SettingsActivity.java | 17 ++- .../ui/SettingsNotificationsActivity.java | 8 +- .../ui/SettingsWallpapersActivity.java | 26 ++++- .../org/telegram/ui/UserProfileActivity.java | 10 +- .../org/telegram/ui/Views/AvatarUpdater.java | 8 +- .../org/telegram/ui/Views/BaseFragment.java | 29 ++++- 15 files changed, 447 insertions(+), 62 deletions(-) diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index a4db15d0..b47f1c75 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -82,7 +82,7 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 19 - versionCode 212 + versionCode 213 versionName "1.4.9" } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java index 80f3a294..49b15d1c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java @@ -26,6 +26,7 @@ import java.util.Locale; public class LocaleController { public static boolean isRTL = false; + private static boolean is24HourFormat = false; public static FastDateFormat formatterDay; public static FastDateFormat formatterWeek; public static FastDateFormat formatterMonth; @@ -121,6 +122,7 @@ public class LocaleController { sortedLanguages.add(0, localeInfo); systemDefaultLocale = Locale.getDefault(); + is24HourFormat = DateFormat.is24HourFormat(ApplicationLoader.applicationContext); LocaleInfo currentInfo = null; boolean override = false; @@ -226,6 +228,7 @@ public class LocaleController { if (changingConfiguration) { return; } + is24HourFormat = DateFormat.is24HourFormat(ApplicationLoader.applicationContext); systemDefaultLocale = newConfig.locale; if (languageOverride != null) { LocaleInfo toSet = currentLocaleInfo; @@ -324,7 +327,7 @@ public class LocaleController { formatterWeek = FastDateFormat.getInstance("EEE", locale); if (lang != null) { - if (DateFormat.is24HourFormat(ApplicationLoader.applicationContext)) { + if (is24HourFormat) { formatterDay = FastDateFormat.getInstance("HH:mm", locale); } else { if (lang.toLowerCase().equals("ar")) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java index f58f7b08..ad707471 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java @@ -831,26 +831,30 @@ public class MediaController implements NotificationCenter.NotificationCenterDel recordDialogId = dialog_id; fileBuffer.rewind(); - /*if (android.os.Build.VERSION.SDK_INT >= 16) { some devices crash with it - AutomaticGainControl agc = null; - try { - if (AutomaticGainControl.isAvailable()) { - agc = AutomaticGainControl.create(audioRecorder.getAudioSessionId()); - agc.setEnabled(true); - audioGainObj = agc; - } - } catch (Exception e) { + if (android.os.Build.VERSION.SDK_INT >= 16) { + File f = new File("/vendor/lib/libaudioeffect_jni.so"); + File f2 = new File("/system/lib/libaudioeffect_jni.so"); + if (f.exists() || f2.exists()) { + AutomaticGainControl agc = null; try { - if (agc != null) { - agc.release(); - agc = null; + if (AutomaticGainControl.isAvailable()) { + agc = AutomaticGainControl.create(audioRecorder.getAudioSessionId()); + agc.setEnabled(true); + audioGainObj = agc; } - } catch (Exception e2) { - FileLog.e("tmessages", e2); + } catch (Exception e) { + try { + if (agc != null) { + agc.release(); + agc = null; + } + } catch (Exception e2) { + FileLog.e("tmessages", e2); + } + FileLog.e("tmessages", e); } - FileLog.e("tmessages", e); } - }*/ + } audioRecorder.startRecording(); } catch (Exception e) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index 446e37ae..91ebc6b6 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -2825,4 +2825,109 @@ public class MessagesStorage { } }); } + + public TLRPC.User getUser(final int user_id) { + TLRPC.User user = null; + try { + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, status FROM users WHERE uid = %d", user_id)); + if (cursor.next()) { + byte[] userData = cursor.byteArrayValue(0); + if (userData != null) { + SerializedData data = new SerializedData(userData); + user = (TLRPC.User) TLClassStore.Instance().TLdeserialize(data, data.readInt32()); + if (user != null) { + if (user.status != null) { + user.status.expires = cursor.intValue(1); + } + } + } + } + cursor.dispose(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return user; + } + + public ArrayList getUsers(final ArrayList uids, final boolean[] error) { + ArrayList users = new ArrayList(); + try { + String uidsStr = ""; + + for (Integer uid : uids) { + if (uidsStr.length() != 0) { + uidsStr += ","; + } + uidsStr += uid; + } + + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, status FROM users WHERE uid IN (%s)", uidsStr)); + while (cursor.next()) { + byte[] userData = cursor.byteArrayValue(0); + if (userData != null) { + SerializedData data = new SerializedData(userData); + TLRPC.User user = (TLRPC.User) TLClassStore.Instance().TLdeserialize(data, data.readInt32()); + if (user != null) { + if (user.status != null) { + user.status.expires = cursor.intValue(1); + } + users.add(user); + } else { + error[0] = true; + break; + } + } else { + error[0] = true; + break; + } + } + cursor.dispose(); + } catch (Exception e) { + error[0] = true; + FileLog.e("tmessages", e); + } + return users; + } + + public TLRPC.Chat getChat(final int chat_id) { + TLRPC.Chat chat = null; + try { + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM chats WHERE uid = %d", chat_id)); + if (cursor.next()) { + byte[] chatData = cursor.byteArrayValue(0); + if (chatData != null) { + SerializedData data = new SerializedData(chatData); + chat = (TLRPC.Chat) TLClassStore.Instance().TLdeserialize(data, data.readInt32()); + } + } + cursor.dispose(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return chat; + } + + public TLRPC.EncryptedChat getEncryptedChat(final int chat_id) { + TLRPC.EncryptedChat chat = null; + try { + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data, user, g, authkey, ttl FROM enc_chats WHERE uid = %d", chat_id)); + if (cursor.next()) { + byte[] chatData = cursor.byteArrayValue(0); + if (chatData != null) { + SerializedData data = new SerializedData(chatData); + chat = (TLRPC.EncryptedChat) TLClassStore.Instance().TLdeserialize(data, data.readInt32()); + if (chat != null) { + chat.user_id = cursor.intValue(1); + chat.a_or_b = cursor.byteArrayValue(2); + chat.auth_key = cursor.byteArrayValue(3); + chat.ttl = cursor.intValue(4); + } + } + } + cursor.dispose(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return chat; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 2a4eabbd..40a2ab21 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -104,6 +104,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Locale; +import java.util.concurrent.Semaphore; public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLayout.SizeNotifierRelativeLayoutDelegate, NotificationCenter.NotificationCenterDelegate, MessagesActivity.MessagesActivityDelegate, DocumentSelectActivity.DocumentSelectActivityDelegate { private LayoutListView chatListView; @@ -288,31 +289,99 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa @Override public boolean onFragmentCreate() { super.onFragmentCreate(); - int chatId = getArguments().getInt("chat_id", 0); - int userId = getArguments().getInt("user_id", 0); - int encId = getArguments().getInt("enc_id", 0); + final int chatId = getArguments().getInt("chat_id", 0); + final int userId = getArguments().getInt("user_id", 0); + final int encId = getArguments().getInt("enc_id", 0); if (chatId != 0) { currentChat = MessagesController.getInstance().chats.get(chatId); if (currentChat == null) { - return false; + final Semaphore semaphore = new Semaphore(0); + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + currentChat = MessagesStorage.getInstance().getChat(chatId); + semaphore.release(); + } + }); + try { + semaphore.acquire(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + if (currentChat != null) { + MessagesController.getInstance().chats.put(currentChat.id, currentChat); + } else { + return false; + } } MessagesController.getInstance().loadChatInfo(currentChat.id); dialog_id = -chatId; } else if (userId != 0) { currentUser = MessagesController.getInstance().users.get(userId); if (currentUser == null) { - return false; + final Semaphore semaphore = new Semaphore(0); + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + currentUser = MessagesStorage.getInstance().getUser(userId); + semaphore.release(); + } + }); + try { + semaphore.acquire(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + if (currentUser != null) { + MessagesController.getInstance().users.putIfAbsent(currentUser.id, currentUser); + } else { + return false; + } } dialog_id = userId; } else if (encId != 0) { currentEncryptedChat = MessagesController.getInstance().encryptedChats.get(encId); if (currentEncryptedChat == null) { - return false; + final Semaphore semaphore = new Semaphore(0); + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + currentEncryptedChat = MessagesStorage.getInstance().getEncryptedChat(encId); + semaphore.release(); + } + }); + try { + semaphore.acquire(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + if (currentEncryptedChat != null) { + MessagesController.getInstance().encryptedChats.putIfAbsent(currentEncryptedChat.id, currentEncryptedChat); + } else { + return false; + } } currentUser = MessagesController.getInstance().users.get(currentEncryptedChat.user_id); if (currentUser == null) { - return false; + final Semaphore semaphore = new Semaphore(0); + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + currentUser = MessagesStorage.getInstance().getUser(currentEncryptedChat.user_id); + semaphore.release(); + } + }); + try { + semaphore.acquire(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + if (currentUser != null) { + MessagesController.getInstance().users.putIfAbsent(currentUser.id, currentUser); + } else { + return false; + } } dialog_id = ((long)encId) << 32; maxMessageId = Integer.MIN_VALUE; @@ -1400,8 +1469,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); + public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == 0) { Utilities.addMediaToGallery(currentPicturePath); @@ -1450,6 +1518,18 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } } + @Override + public void saveSelfArgs(Bundle args) { + if (currentPicturePath != null) { + args.putString("path", currentPicturePath); + } + } + + @Override + public void restoreSelfArgs(Bundle args) { + currentPicturePath = args.getString("path"); + } + public boolean processSendingText(String text) { text = text.replaceAll("\n\n+", "\n\n"); text = text.replaceAll(" +", " "); @@ -3104,7 +3184,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); currentPicturePath = image.getAbsolutePath(); } - startActivityForResult(takePictureIntent, 0); + parentActivity.startActivityForResult(takePictureIntent, 0); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -3114,7 +3194,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa try { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); - startActivityForResult(photoPickerIntent, 1); + parentActivity.startActivityForResult(photoPickerIntent, 1); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -3138,7 +3218,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa Intent chooserIntent = Intent.createChooser(pickIntent, ""); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takeVideoIntent }); - startActivityForResult(chooserIntent, 2); + parentActivity.startActivityForResult(chooserIntent, 2); } catch (Exception e) { FileLog.e("tmessages", e); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileActivity.java index 0d845f2b..5043ea42 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatProfileActivity.java @@ -163,6 +163,9 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen editor.commit(); listView.invalidateViews(); } else if (i == 3) { + if (parentActivity == null) { + return; + } try { Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); @@ -187,7 +190,7 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen } tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); - startActivityForResult(tmpIntent, 15); + parentActivity.startActivityForResult(tmpIntent, 3); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -247,11 +250,10 @@ public class ChatProfileActivity extends BaseFragment implements NotificationCen } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); + public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { avatarUpdater.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { - if (requestCode == 15) { + if (requestCode == 3) { Uri ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); String name = null; if (ringtone != null && parentActivity != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java index 5776b0a0..76f984ef 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -431,11 +431,12 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen if (!selectedContacts.isEmpty()) { ArrayList result = new ArrayList(); result.addAll(selectedContacts.keySet()); - NotificationCenter.getInstance().addToMemCache(2, result); - } else { - return; + Bundle args = new Bundle(); + args.putIntegerArrayList("result", result); + GroupCreateFinalActivity fragment = new GroupCreateFinalActivity(); + fragment.setArguments(args); + ((LaunchActivity)parentActivity).presentFragment(fragment, "group_craate_final", false); } - ((LaunchActivity)parentActivity).presentFragment(new GroupCreateFinalActivity(), "group_craate_final", false); } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java index 79438d06..23c6c091 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java @@ -28,6 +28,7 @@ import android.widget.TextView; import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.TLRPC; import org.telegram.messenger.FileLog; import org.telegram.messenger.MessagesController; @@ -42,10 +43,11 @@ import org.telegram.ui.Views.PinnedHeaderListView; import org.telegram.ui.Views.SectionedBaseAdapter; import java.util.ArrayList; +import java.util.concurrent.Semaphore; public class GroupCreateFinalActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, AvatarUpdater.AvatarUpdaterDelegate { private PinnedHeaderListView listView; - private TextView nameTextView; + private EditText nameTextView; private TLRPC.FileLocation avatar; private TLRPC.InputFile uploadedAvatar; private ArrayList selectedContacts; @@ -54,6 +56,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati private boolean donePressed; private AvatarUpdater avatarUpdater = new AvatarUpdater(); private ProgressDialog progressDialog = null; + private String nameToSet = null; @SuppressWarnings("unchecked") @Override @@ -64,7 +67,40 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati NotificationCenter.getInstance().addObserver(this, MessagesController.chatDidFailCreate); avatarUpdater.parentFragment = this; avatarUpdater.delegate = this; - selectedContacts = (ArrayList)NotificationCenter.getInstance().getFromMemCache(2); + selectedContacts = getArguments().getIntegerArrayList("result"); + final ArrayList usersToLoad = new ArrayList(); + for (Integer uid : selectedContacts) { + if (MessagesController.getInstance().users.get(uid) == null) { + usersToLoad.add(uid); + } + } + if (!usersToLoad.isEmpty()) { + final Semaphore semaphore = new Semaphore(0); + final ArrayList users = new ArrayList(); + final boolean[] error = new boolean[1]; + MessagesStorage.getInstance().storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + users.addAll(MessagesStorage.getInstance().getUsers(usersToLoad, error)); + semaphore.release(); + } + }); + try { + semaphore.acquire(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + if (error[0]) { + return false; + } + if (!users.isEmpty()) { + for (TLRPC.User user : users) { + MessagesController.getInstance().users.putIfAbsent(user.id, user); + } + } else { + return false; + } + } return true; } @@ -125,6 +161,10 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati nameTextView = (EditText)fragmentView.findViewById(R.id.bubble_input_text); nameTextView.setHint(LocaleController.getString("EnterGroupNamePlaceholder", R.string.EnterGroupNamePlaceholder)); + if (nameToSet != null) { + nameTextView.setText(nameToSet); + nameToSet = null; + } listView = (PinnedHeaderListView)fragmentView.findViewById(R.id.listView); listView.setAdapter(new ListAdapter(parentActivity)); } else { @@ -200,11 +240,38 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); + public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { avatarUpdater.onActivityResult(requestCode, resultCode, data); } + @Override + public void saveSelfArgs(Bundle args) { + if (avatarUpdater != null && avatarUpdater.currentPicturePath != null) { + args.putString("path", avatarUpdater.currentPicturePath); + } + if (nameTextView != null) { + String text = nameTextView.getText().toString(); + if (text != null && text.length() != 0) { + args.putString("nameTextView", text); + } + } + } + + @Override + public void restoreSelfArgs(Bundle args) { + if (avatarUpdater != null) { + avatarUpdater.currentPicturePath = args.getString("path"); + } + String text = args.getString("nameTextView"); + if (text != null) { + if (nameTextView != null) { + nameTextView.setText(text); + } else { + nameToSet = text; + } + } + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.group_create_menu, menu); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 0b003f29..f6e7b10a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -140,6 +140,46 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen MessagesActivity fragment = new MessagesActivity(); fragment.onFragmentCreate(); ApplicationLoader.fragmentsStack.add(fragment); + + try { + if (savedInstanceState != null) { + String fragmentName = savedInstanceState.getString("fragment"); + if (fragmentName != null) { + Bundle args = savedInstanceState.getBundle("args"); + if (fragmentName.equals("chat")) { + if (args != null) { + ChatActivity chat = new ChatActivity(); + chat.setArguments(args); + if (chat.onFragmentCreate()) { + ApplicationLoader.fragmentsStack.add(chat); + chat.restoreSelfArgs(savedInstanceState); + } + } + } else if (fragmentName.equals("settings")) { + SettingsActivity settings = new SettingsActivity(); + settings.onFragmentCreate(); + settings.restoreSelfArgs(savedInstanceState); + ApplicationLoader.fragmentsStack.add(settings); + } else if (fragmentName.equals("group")) { + if (args != null) { + GroupCreateFinalActivity group = new GroupCreateFinalActivity(); + group.setArguments(args); + if (group.onFragmentCreate()) { + group.restoreSelfArgs(savedInstanceState); + ApplicationLoader.fragmentsStack.add(group); + } + } + } else if (fragmentName.equals("wallpapers")) { + SettingsWallpapersActivity settings = new SettingsWallpapersActivity(); + settings.onFragmentCreate(); + settings.restoreSelfArgs(savedInstanceState); + ApplicationLoader.fragmentsStack.add(settings); + } + } + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } } handleIntent(getIntent(), false, savedInstanceState != null); @@ -536,6 +576,15 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen } } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (ApplicationLoader.fragmentsStack.size() != 0) { + BaseFragment fragment = ApplicationLoader.fragmentsStack.get(ApplicationLoader.fragmentsStack.size() - 1); + fragment.onActivityResultFragment(requestCode, resultCode, data); + } + } + @Override protected void onPause() { super.onPause(); @@ -932,6 +981,22 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen protected void onSaveInstanceState(Bundle outState) { try { super.onSaveInstanceState(outState); + if (!ApplicationLoader.fragmentsStack.isEmpty()) { + BaseFragment lastFragment = ApplicationLoader.fragmentsStack.get(ApplicationLoader.fragmentsStack.size() - 1); + Bundle args = lastFragment.getArguments(); + if (lastFragment instanceof ChatActivity && args != null) { + outState.putBundle("args", args); + outState.putString("fragment", "chat"); + } else if (lastFragment instanceof SettingsActivity) { + outState.putString("fragment", "settings"); + } else if (lastFragment instanceof GroupCreateFinalActivity && args != null) { + outState.putBundle("args", args); + outState.putString("fragment", "group"); + } else if (lastFragment instanceof SettingsWallpapersActivity) { + outState.putString("fragment", "wallpapers"); + } + lastFragment.saveSelfArgs(outState); + } } catch (Exception e) { FileLog.e("tmessages", e); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index 53e3be4f..50853604 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -445,11 +445,24 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); + public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { avatarUpdater.onActivityResult(requestCode, resultCode, data); } + @Override + public void saveSelfArgs(Bundle args) { + if (avatarUpdater != null && avatarUpdater.currentPicturePath != null) { + args.putString("path", avatarUpdater.currentPicturePath); + } + } + + @Override + public void restoreSelfArgs(Bundle args) { + if (avatarUpdater != null) { + avatarUpdater.currentPicturePath = args.getString("path"); + } + } + @Override public void didReceivedNotification(int id, Object... args) { if (id == MessagesController.updateInterfaces) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java index b7210195..d6075051 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsNotificationsActivity.java @@ -103,6 +103,9 @@ public class SettingsNotificationsActivity extends BaseFragment { editor.commit(); listView.invalidateViews(); } else if (i == 4 || i == 9) { + if (parentActivity == null) { + return; + } try { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); @@ -137,7 +140,7 @@ public class SettingsNotificationsActivity extends BaseFragment { } } tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); - startActivityForResult(tmpIntent, i); + parentActivity.startActivityForResult(tmpIntent, i); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -228,8 +231,7 @@ public class SettingsNotificationsActivity extends BaseFragment { } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); + public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { Uri ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); String name = null; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsWallpapersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsWallpapersActivity.java index f294315e..9dc7f600 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsWallpapersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsWallpapersActivity.java @@ -113,6 +113,9 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { + if (parentActivity == null) { + return; + } if (i == 0) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File image = Utilities.generatePicturePath(); @@ -120,11 +123,11 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); currentPicturePath = image.getAbsolutePath(); } - startActivityForResult(takePictureIntent, 0); + parentActivity.startActivityForResult(takePictureIntent, 10); } else if (i == 1) { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); - startActivityForResult(photoPickerIntent, 1); + parentActivity.startActivityForResult(photoPickerIntent, 11); } } }); @@ -194,10 +197,9 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); + public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { - if (requestCode == 0) { + if (requestCode == 10) { Utilities.addMediaToGallery(currentPicturePath); try { Bitmap bitmap = FileLoader.loadBitmap(currentPicturePath, null, Utilities.dp(320), Utilities.dp(480)); @@ -211,7 +213,7 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica FileLog.e("tmessages", e); } currentPicturePath = null; - } else if (requestCode == 1) { + } else if (requestCode == 11) { Uri imageUri = data.getData(); Cursor cursor = parentActivity.getContentResolver().query(imageUri, new String[]{android.provider.MediaStore.Images.ImageColumns.DATA}, null, null, null); if (cursor == null) { @@ -239,6 +241,18 @@ public class SettingsWallpapersActivity extends BaseFragment implements Notifica } } + @Override + public void saveSelfArgs(Bundle args) { + if (currentPicturePath != null) { + args.putString("path", currentPicturePath); + } + } + + @Override + public void restoreSelfArgs(Bundle args) { + currentPicturePath = args.getString("path"); + } + private void processSelectedBackground() { TLRPC.WallPaper wallPaper = wallpappersByIds.get(selectedBackground); if (selectedBackground != -1 && selectedBackground != 1000001 && wallPaper != null && wallPaper instanceof TLRPC.TL_wallPaper) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/UserProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/UserProfileActivity.java index 41993d46..675fd3e9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/UserProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/UserProfileActivity.java @@ -144,6 +144,9 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen } else if (i == 5 && dialog_id == 0 || dialog_id != 0 && (i == 7 && currentEncryptedChat instanceof TLRPC.TL_encryptedChat || i == 5 && !(currentEncryptedChat instanceof TLRPC.TL_encryptedChat))) { + if (parentActivity == null) { + return; + } try { Intent tmpIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); @@ -168,7 +171,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen } tmpIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); - startActivityForResult(tmpIntent, 0); + parentActivity.startActivityForResult(tmpIntent, 12); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -256,8 +259,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); + public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (data == null) { return; @@ -279,7 +281,7 @@ public class UserProfileActivity extends BaseFragment implements NotificationCen SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); - if (requestCode == 0) { + if (requestCode == 12) { if (name != null && ringtone != null) { editor.putString("sound_" + user_id, name); editor.putString("sound_path_" + user_id, ringtone.toString()); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/AvatarUpdater.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/AvatarUpdater.java index 304606d6..e3bdab82 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/AvatarUpdater.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/AvatarUpdater.java @@ -58,7 +58,7 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); currentPicturePath = image.getAbsolutePath(); } - parentFragment.startActivityForResult(takePictureIntent, 0); + parentFragment.parentActivity.startActivityForResult(takePictureIntent, 13); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -68,7 +68,7 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg try { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); - parentFragment.startActivityForResult(photoPickerIntent, 1); + parentFragment.parentActivity.startActivityForResult(photoPickerIntent, 14); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -102,12 +102,12 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { - if (requestCode == 0) { + if (requestCode == 13) { Utilities.addMediaToGallery(currentPicturePath); startCrop(currentPicturePath, null); currentPicturePath = null; - } else if (requestCode == 1) { + } else if (requestCode == 14) { if (data == null || data.getData() == null) { return; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/BaseFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/BaseFragment.java index 557552db..4ab44f30 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Views/BaseFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/BaseFragment.java @@ -8,6 +8,7 @@ package org.telegram.ui.Views; +import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBarActivity; @@ -28,6 +29,7 @@ public class BaseFragment extends Fragment { public int classGuid = 0; public boolean firstStart = true; public boolean animationInProgress = false; + private long currentAnimationDuration = 0; private boolean removeParentOnDestroy = false; private boolean removeParentOnAnimationEnd = true; @@ -108,6 +110,16 @@ public class BaseFragment extends Fragment { public void onAnimationStart() { animationInProgress = true; + if (fragmentView != null) { + fragmentView.postDelayed(new Runnable() { + @Override + public void run() { + if (animationInProgress) { + onAnimationEnd(); + } + } + }, currentAnimationDuration); + } } public void onAnimationEnd() { @@ -137,6 +149,7 @@ public class BaseFragment extends Fragment { public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { if (nextAnim != 0) { Animation anim = AnimationUtils.loadAnimation(getActivity(), nextAnim); + currentAnimationDuration = anim.getDuration(); anim.setAnimationListener(new Animation.AnimationListener() { @@ -149,7 +162,9 @@ public class BaseFragment extends Fragment { } public void onAnimationEnd(Animation animation) { - BaseFragment.this.onAnimationEnd(); + if (animationInProgress) { + BaseFragment.this.onAnimationEnd(); + } } }); @@ -166,4 +181,16 @@ public class BaseFragment extends Fragment { public void applySelfActionBar() { } + + public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { + + } + + public void saveSelfArgs(Bundle args) { + + } + + public void restoreSelfArgs(Bundle args) { + + } } From 5323e87ba379d25ee4c232f1e0011eb5d03adbaa Mon Sep 17 00:00:00 2001 From: DrKLO Date: Thu, 27 Mar 2014 18:25:53 +0400 Subject: [PATCH 3/7] Add giflib and GifDrawable --- TMessagesProj/jni/Android.mk | 28 +- TMessagesProj/jni/{ => aes}/aes.h | 0 TMessagesProj/jni/{ => aes}/aes_core.c | 0 TMessagesProj/jni/{ => aes}/aes_ige.c | 0 TMessagesProj/jni/{ => aes}/aes_locl.h | 0 TMessagesProj/jni/{ => aes}/aes_misc.c | 0 TMessagesProj/jni/audio.c | 52 +- TMessagesProj/jni/build_ffmpeg_android.sh | 128 -- TMessagesProj/jni/gif.c | 824 ++++++++++++ TMessagesProj/jni/gif.h | 7 + TMessagesProj/jni/giflib/config.h | 13 + TMessagesProj/jni/giflib/dgif_lib.c | 1167 +++++++++++++++++ TMessagesProj/jni/giflib/gif_hash.c | 132 ++ TMessagesProj/jni/giflib/gif_hash.h | 39 + TMessagesProj/jni/giflib/gif_lib.h | 307 +++++ TMessagesProj/jni/giflib/gif_lib_private.h | 59 + TMessagesProj/jni/giflib/gifalloc.c | 400 ++++++ TMessagesProj/jni/jni.c | 31 +- TMessagesProj/jni/org_telegram_SQLite.h | 9 - .../jni/{org_telegram_SQLite.c => sqlite.c} | 4 +- TMessagesProj/jni/sqlite.h | 10 + TMessagesProj/jni/{ => sqlite}/sqlite3.c | 0 TMessagesProj/jni/{ => sqlite}/sqlite3.h | 0 ..._SQLite_SQLiteCursor.c => sqlite_cursor.c} | 2 +- ...ite_SQLiteDatabase.c => sqlite_database.c} | 2 +- ...PreparedStatement.c => sqlite_statement.c} | 16 +- TMessagesProj/jni/{log.h => utils.h} | 7 + TMessagesProj/jni/video.c | 18 - TMessagesProj/jni/video.h | 17 - TMessagesProj/jni/video_audio_in.c | 243 ---- TMessagesProj/jni/video_audio_out.c | 366 ------ .../libs/armeabi-v7a/libtmessages.so | Bin 766628 -> 778916 bytes TMessagesProj/libs/armeabi/libtmessages.so | Bin 782992 -> 795280 bytes TMessagesProj/libs/x86/libtmessages.so | Bin 1352692 -> 1377300 bytes .../telegram/messenger/MediaController.java | 14 +- .../org/telegram/messenger/NativeLoader.java | 6 +- .../org/telegram/ui/Cells/ChatAudioCell.java | 9 + .../org/telegram/ui/Cells/ChatBaseCell.java | 9 + .../org/telegram/ui/Cells/ChatOrUserCell.java | 9 + .../org/telegram/ui/Cells/DialogCell.java | 8 + .../telegram/ui/Views/BackupImageView.java | 12 +- .../org/telegram/ui/Views/GifDrawable.java | 386 ++++++ .../org/telegram/ui/Views/ImageReceiver.java | 7 +- .../src/main/res/layout/chat_layout.xml | 2 +- 44 files changed, 3472 insertions(+), 871 deletions(-) rename TMessagesProj/jni/{ => aes}/aes.h (100%) rename TMessagesProj/jni/{ => aes}/aes_core.c (100%) rename TMessagesProj/jni/{ => aes}/aes_ige.c (100%) rename TMessagesProj/jni/{ => aes}/aes_locl.h (100%) rename TMessagesProj/jni/{ => aes}/aes_misc.c (100%) delete mode 100755 TMessagesProj/jni/build_ffmpeg_android.sh create mode 100644 TMessagesProj/jni/gif.c create mode 100644 TMessagesProj/jni/gif.h create mode 100755 TMessagesProj/jni/giflib/config.h create mode 100755 TMessagesProj/jni/giflib/dgif_lib.c create mode 100755 TMessagesProj/jni/giflib/gif_hash.c create mode 100755 TMessagesProj/jni/giflib/gif_hash.h create mode 100755 TMessagesProj/jni/giflib/gif_lib.h create mode 100755 TMessagesProj/jni/giflib/gif_lib_private.h create mode 100755 TMessagesProj/jni/giflib/gifalloc.c delete mode 100755 TMessagesProj/jni/org_telegram_SQLite.h rename TMessagesProj/jni/{org_telegram_SQLite.c => sqlite.c} (85%) create mode 100755 TMessagesProj/jni/sqlite.h rename TMessagesProj/jni/{ => sqlite}/sqlite3.c (100%) rename TMessagesProj/jni/{ => sqlite}/sqlite3.h (100%) rename TMessagesProj/jni/{org_telegram_SQLite_SQLiteCursor.c => sqlite_cursor.c} (98%) rename TMessagesProj/jni/{org_telegram_SQLite_SQLiteDatabase.c => sqlite_database.c} (97%) rename TMessagesProj/jni/{org_telegram_SQLite_SQLitePreparedStatement.c => sqlite_statement.c} (94%) rename TMessagesProj/jni/{log.h => utils.h} (77%) delete mode 100644 TMessagesProj/jni/video.c delete mode 100644 TMessagesProj/jni/video.h delete mode 100644 TMessagesProj/jni/video_audio_in.c delete mode 100644 TMessagesProj/jni/video_audio_out.c create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Views/GifDrawable.java diff --git a/TMessagesProj/jni/Android.mk b/TMessagesProj/jni/Android.mk index 520e05f4..5bf5f279 100755 --- a/TMessagesProj/jni/Android.mk +++ b/TMessagesProj/jni/Android.mk @@ -154,6 +154,18 @@ LOCAL_SRC_FILES += \ ./opus/opusfile/opusfile.c \ ./opus/opusfile/stream.c +LOCAL_SRC_FILES += \ +./giflib/dgif_lib.c \ +./giflib/gifalloc.c + +LOCAL_SRC_FILES += \ +./aes/aes_core.c \ +./aes/aes_ige.c \ +./aes/aes_misc.c + +LOCAL_SRC_FILES += \ +./sqlite/sqlite3.c + LOCAL_C_INCLUDES := \ ./opus/include \ ./opus/silk \ @@ -163,16 +175,12 @@ LOCAL_C_INCLUDES := \ ./opus/opusfile LOCAL_SRC_FILES += \ -./aes_core.c \ -./aes_ige.c \ -./aes_misc.c \ ./jni.c \ -./sqlite3.c \ -./org_telegram_SQLite_SQLiteCursor.c \ -./org_telegram_SQLite_SQLiteDatabase.c \ -./org_telegram_SQLite_SQLitePreparedStatement.c \ -./org_telegram_SQLite.c \ -./audio.c +./sqlite_cursor.c \ +./sqlite_database.c \ +./sqlite_statement.c \ +./sqlite.c \ +./audio.c \ +./gif.c - include $(BUILD_SHARED_LIBRARY) \ No newline at end of file diff --git a/TMessagesProj/jni/aes.h b/TMessagesProj/jni/aes/aes.h similarity index 100% rename from TMessagesProj/jni/aes.h rename to TMessagesProj/jni/aes/aes.h diff --git a/TMessagesProj/jni/aes_core.c b/TMessagesProj/jni/aes/aes_core.c similarity index 100% rename from TMessagesProj/jni/aes_core.c rename to TMessagesProj/jni/aes/aes_core.c diff --git a/TMessagesProj/jni/aes_ige.c b/TMessagesProj/jni/aes/aes_ige.c similarity index 100% rename from TMessagesProj/jni/aes_ige.c rename to TMessagesProj/jni/aes/aes_ige.c diff --git a/TMessagesProj/jni/aes_locl.h b/TMessagesProj/jni/aes/aes_locl.h similarity index 100% rename from TMessagesProj/jni/aes_locl.h rename to TMessagesProj/jni/aes/aes_locl.h diff --git a/TMessagesProj/jni/aes_misc.c b/TMessagesProj/jni/aes/aes_misc.c similarity index 100% rename from TMessagesProj/jni/aes_misc.c rename to TMessagesProj/jni/aes/aes_misc.c diff --git a/TMessagesProj/jni/audio.c b/TMessagesProj/jni/audio.c index c66314f0..70b6e2fc 100644 --- a/TMessagesProj/jni/audio.c +++ b/TMessagesProj/jni/audio.c @@ -5,14 +5,7 @@ #include #include #include -#include "log.h" - -#ifndef max -#define max(x, y) ((x) > (y)) ? (x) : (y) -#endif -#ifndef min -#define min(x, y) ((x) < (y)) ? (x) : (y) -#endif +#include "utils.h" typedef struct { int version; @@ -540,9 +533,6 @@ int64_t _currentPcmOffset = 0; int _finished = 0; static const int playerBuffersCount = 3; static const int playerSampleRate = 48000; -int finished; -int pcmOffset; -int size; void cleanupPlayer() { if (_opusFile) { @@ -585,14 +575,14 @@ int initPlayer(const char *path) { return 1; } -void fillBuffer(uint8_t *buffer, int capacity) { +void fillBuffer(uint8_t *buffer, int capacity, int *args) { if (_opusFile) { - pcmOffset = max(0, op_pcm_tell(_opusFile)); + args[1] = max(0, op_pcm_tell(_opusFile)); if (_finished) { - finished = 1; - size = 0; - pcmOffset = 0; + args[0] = 0; + args[1] = 0; + args[2] = 1; return; } else { int writtenOutputBytes = 0; @@ -612,19 +602,19 @@ void fillBuffer(uint8_t *buffer, int capacity) { } } - size = writtenOutputBytes; + args[0] = writtenOutputBytes; - if (endOfFileReached || pcmOffset + size == _totalPcmDuration) { + if (endOfFileReached || args[1] + args[0] == _totalPcmDuration) { _finished = 1; - finished = 1; + args[2] = 1; } else { - finished = 0; + args[2] = 0; } } } else { memset(buffer, 0, capacity); - size = capacity; - pcmOffset = _totalPcmDuration; + args[0] = capacity; + args[1] = _totalPcmDuration; } } @@ -632,21 +622,11 @@ JNIEXPORT jlong Java_org_telegram_messenger_MediaController_getTotalPcmDuration( return _totalPcmDuration; } -JNIEXPORT int Java_org_telegram_messenger_MediaController_getFinished(JNIEnv *env, jclass class) { - return finished; -} - -JNIEXPORT int Java_org_telegram_messenger_MediaController_getSize(JNIEnv *env, jclass class) { - return size; -} - -JNIEXPORT jlong Java_org_telegram_messenger_MediaController_getPcmOffset(JNIEnv *env, jclass class) { - return pcmOffset; -} - -JNIEXPORT void Java_org_telegram_messenger_MediaController_readOpusFile(JNIEnv *env, jclass class, jobject buffer, jint capacity) { +JNIEXPORT void Java_org_telegram_messenger_MediaController_readOpusFile(JNIEnv *env, jclass class, jobject buffer, jint capacity, jintArray args) { + jint *argsArr = (*env)->GetIntArrayElements(env, args, 0); jbyte *bufferBytes = (*env)->GetDirectBufferAddress(env, buffer); - fillBuffer(bufferBytes, capacity); + fillBuffer(bufferBytes, capacity, argsArr); + (*env)->ReleaseIntArrayElements(env, args, argsArr, 0); } JNIEXPORT int Java_org_telegram_messenger_MediaController_seekOpusFile(JNIEnv *env, jclass class, jfloat position) { diff --git a/TMessagesProj/jni/build_ffmpeg_android.sh b/TMessagesProj/jni/build_ffmpeg_android.sh deleted file mode 100755 index 42180f25..00000000 --- a/TMessagesProj/jni/build_ffmpeg_android.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/bash - -function build_one { - -echo "Cleaning..." -make clean - -echo "Configuring..." - -./configure --target-os=linux \ ---prefix=$PREFIX \ ---enable-cross-compile \ ---extra-libs="-lgcc" \ ---arch=$ARCH \ ---cc=$CC \ ---cross-prefix=$CROSS_PREFIX \ ---nm=$NM \ ---sysroot=$PLATFORM \ ---extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -fasm -Wno-psabi -fno-short-enums -Dipv6mr_interface=ipv6mr_ifindex -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \ ---disable-shared \ ---enable-static \ ---extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl" \ -\ ---disable-everything \ ---disable-network \ ---enable-small \ ---enable-zlib \ ---disable-avfilter \ ---disable-avdevice \ ---disable-programs \ ---disable-doc \ ---disable-lsp \ ---disable-dwt \ ---disable-dct \ ---enable-stripping \ ---disable-postproc \ ---disable-fft \ ---disable-lzo \ ---disable-rdft \ ---disable-mdct \ ---disable-debug \ -\ ---enable-muxer='mp4' \ ---enable-protocol='file' \ ---enable-encoder='aac,mpeg4' \ ---enable-decoder='aac,amrnb,amrwb,flv,h263,h264' \ ---enable-demuxer='flv,mpegvideo,mov' \ ---enable-hwaccel='mpeg4_vaapi,mpeg4_vdpau' \ ---enable-swresample \ ---enable-swscale \ ---enable-asm \ -$ADDITIONAL_CONFIGURE_FLAG - -echo "continue?" -read -make -j8 install - -#$AR d libavcodec/libavcodec.a inverse.o - -#$LD -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffmpeg.a -static -nostdlib -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a -lc -lm -lz -ldl --dynamic-linker=/system/bin/linker $GCCLIB - -} - -NDK=/Users/DrKLO/ndk9 - -#arm platform -PLATFORM=$NDK/platforms/android-8/arch-arm -PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64 -LD=$PREBUILT/bin/arm-linux-androideabi-ld -AR=$PREBUILT/bin/arm-linux-androideabi-ar -NM=$PREBUILT/bin/arm-linux-androideabi-nm -GCCLIB=$PREBUILT/lib/gcc/arm-linux-androideabi/4.8/libgcc.a -ARCH=arm -CC=$PREBUILT/bin/arm-linux-androideabi-gcc -CROSS_PREFIX=$PREBUILT/bin/arm-linux-androideabi- - -#arm v6 -CPU=armv6 -OPTIMIZE_CFLAGS="-marm -march=$CPU" -PREFIX=/Users/DrKLO/ndk9/platforms/android-9/arch-$ARCH/usr -ADDITIONAL_CONFIGURE_FLAG= -build_one - -#arm v7vfpv3 -#CPU=armv7-a -#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU " -#PREFIX=./android/$CPU -#ADDITIONAL_CONFIGURE_FLAG= -#build_one - -#arm v7vfp -#CPU=armv7-a -#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU " -#PREFIX=./android/$CPU-vfp -#ADDITIONAL_CONFIGURE_FLAG= -#build_one - -#arm v7n -#CPU=armv7-a -#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8" -#PREFIX=./android/$CPU -#ADDITIONAL_CONFIGURE_FLAG=--enable-neon -#build_one - -#arm v6+vfp -#CPU=armv6 -#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU" -#PREFIX=./android/${CPU}_vfp -#ADDITIONAL_CONFIGURE_FLAG= -#build_one - -#x86 platform -PLATFORM=$NDK/platforms/android-9/arch-x86 -PREBUILT=$NDK/toolchains/x86-4.8/prebuilt/darwin-x86_64 -LD=$PREBUILT/bin/i686-linux-android-ld -AR=$PREBUILT/bin/i686-linux-android-ar -NM=$PREBUILT/bin/i686-linux-android-nm -GCCLIB=$PREBUILT/lib/gcc/i686-linux-android/4.8/libgcc.a -ARCH=x86 -CC=$PREBUILT/bin/i686-linux-android-gcc -CROSS_PREFIX=$PREBUILT/bin/i686-linux-android- - -CPU=i686 -OPTIMIZE_CFLAGS="-march=$CPU" -PREFIX=/Users/DrKLO/ndk9/platforms/android-9/arch-$ARCH/usr -ADDITIONAL_CONFIGURE_FLAG="--disable-mmx --disable-yasm" -build_one - diff --git a/TMessagesProj/jni/gif.c b/TMessagesProj/jni/gif.c new file mode 100644 index 00000000..f6198bf3 --- /dev/null +++ b/TMessagesProj/jni/gif.c @@ -0,0 +1,824 @@ +//tanks to https://github.com/koral--/android-gif-drawable +/* + MIT License + Copyright (c) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + // Copyright (c) 2011 Google Inc. 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 Google Inc. 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. + + The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond + */ + +#include +#include +#include +#include +#include "gif.h" +#include "giflib/gif_lib.h" + +#define D_GIF_ERR_NO_FRAMES 1000 +#define D_GIF_ERR_INVALID_SCR_DIMS 1001 +#define D_GIF_ERR_INVALID_IMG_DIMS 1002 +#define D_GIF_ERR_IMG_NOT_CONFINED 1003 + +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; + uint8_t alpha; +} argb; + +typedef struct { + unsigned int duration; + short transpIndex; + unsigned char disposalMethod; +} FrameInfo; + +typedef struct { + GifFileType *gifFilePtr; + unsigned long lastFrameReaminder; + unsigned long nextStartTime; + int currentIndex; + unsigned int lastDrawIndex; + FrameInfo *infos; + argb *backupPtr; + int startPos; + unsigned char *rasterBits; + char *comment; + unsigned short loopCount; + int currentLoop; + jfloat speedFactor; +} GifInfo; + +static ColorMapObject *defaultCmap = NULL; + +static ColorMapObject *genDefColorMap(void) { + ColorMapObject *cmap = GifMakeMapObject(256, NULL); + if (cmap != NULL) { + int iColor; + for (iColor = 0; iColor < 256; iColor++) { + cmap->Colors[iColor].Red = (GifByteType) iColor; + cmap->Colors[iColor].Green = (GifByteType) iColor; + cmap->Colors[iColor].Blue = (GifByteType) iColor; + } + } + return cmap; +} + +jint gifOnJNILoad(JavaVM *vm, void *reserved, JNIEnv *env) { + defaultCmap = genDefColorMap(); + if (defaultCmap == NULL) { + return -1; + } + return JNI_VERSION_1_6; +} + +void gifOnJNIUnload(JavaVM *vm, void *reserved) { + GifFreeMapObject(defaultCmap); +} + +static int fileReadFunc(GifFileType *gif, GifByteType *bytes, int size) { + FILE *file = (FILE *)gif->UserData; + return fread(bytes, 1, size, file); +} + +static int fileRewindFun(GifInfo *info) { + return fseek(info->gifFilePtr->UserData, info->startPos, SEEK_SET); +} + +static unsigned long getRealTime() { + struct timespec ts; + const clockid_t id = CLOCK_MONOTONIC; + if (id != (clockid_t) - 1 && clock_gettime(id, &ts) != -1) + return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; + return -1; +} + +static void cleanUp(GifInfo *info) { + if (info->backupPtr) { + free(info->backupPtr); + info->backupPtr = NULL; + } + if (info->infos) { + free(info->infos); + info->infos = NULL; + } + if (info->rasterBits) { + free(info->rasterBits); + info->rasterBits = NULL; + } + if (info->comment) { + free(info->comment); + info->comment = NULL; + } + + GifFileType *GifFile = info->gifFilePtr; + if (GifFile->SColorMap == defaultCmap) { + GifFile->SColorMap = NULL; + } + if (GifFile->SavedImages != NULL) { + SavedImage *sp; + for (sp = GifFile->SavedImages; sp < GifFile->SavedImages + GifFile->ImageCount; sp++) { + if (sp->ImageDesc.ColorMap != NULL) { + GifFreeMapObject(sp->ImageDesc.ColorMap); + sp->ImageDesc.ColorMap = NULL; + } + } + free(GifFile->SavedImages); + GifFile->SavedImages = NULL; + } + DGifCloseFile(GifFile); + free(info); +} + +static int getComment(GifByteType *Bytes, char **cmt) { + unsigned int len = (unsigned int) Bytes[0]; + unsigned int offset = *cmt != NULL ? strlen(*cmt) : 0; + char *ret = realloc(*cmt, (len + offset + 1) * sizeof(char)); + if (ret != NULL) { + memcpy(ret + offset, &Bytes[1], len); + ret[len + offset] = 0; + *cmt = ret; + return GIF_OK; + } + return GIF_ERROR; +} + +static void packARGB32(argb *pixel, GifByteType alpha, GifByteType red, GifByteType green, GifByteType blue) { + pixel->alpha = alpha; + pixel->red = red; + pixel->green = green; + pixel->blue = blue; +} + +static void getColorFromTable(int idx, argb *dst, const ColorMapObject *cmap) { + char colIdx = idx >= cmap->ColorCount ? 0 : idx; + GifColorType *col = &cmap->Colors[colIdx]; + packARGB32(dst, 0xFF, col->Red, col->Green, col->Blue); +} + +static void eraseColor(argb *bm, int w, int h, argb color) { + int i; + for (i = 0; i < w * h; i++) { + *(bm + i) = color; + } +} + +static inline bool setupBackupBmp(GifInfo *info, short transpIndex) { + GifFileType *fGIF = info->gifFilePtr; + info->backupPtr = calloc(fGIF->SWidth * fGIF->SHeight, sizeof(argb)); + if (!info->backupPtr) { + info->gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return false; + } + argb paintingColor; + if (transpIndex == -1) { + getColorFromTable(fGIF->SBackGroundColor, &paintingColor, fGIF->SColorMap); + } else { + packARGB32(&paintingColor,0,0,0,0); + } + eraseColor(info->backupPtr, fGIF->SWidth, fGIF->SHeight, paintingColor); + return true; +} + +static int readExtensions(int ExtFunction, GifByteType *ExtData, GifInfo *info) { + if (ExtData == NULL) { + return GIF_OK; + } + if (ExtFunction == GRAPHICS_EXT_FUNC_CODE && ExtData[0] == 4) { + FrameInfo *fi = &info->infos[info->gifFilePtr->ImageCount]; + fi->transpIndex = -1; + char *b = (char *)ExtData + 1; + short delay = ((b[2] << 8) | b[1]); + fi->duration = delay > 1 ? delay * 10 : 100; + fi->disposalMethod = ((b[0] >> 2) & 7); + if (ExtData[1] & 1) + fi->transpIndex = (short) b[3]; + if (fi->disposalMethod == 3 && info->backupPtr == NULL) { + if (!setupBackupBmp(info,fi->transpIndex)) { + return GIF_ERROR; + } + } + } else if (ExtFunction == COMMENT_EXT_FUNC_CODE) { + if (getComment(ExtData, &info->comment) == GIF_ERROR) { + info->gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + } else if (ExtFunction == APPLICATION_EXT_FUNC_CODE && ExtData[0] == 11) { + if (strncmp("NETSCAPE2.0", &ExtData[1], 11) == 0 || strncmp("ANIMEXTS1.0", &ExtData[1], 11) == 0) { + if (DGifGetExtensionNext(info->gifFilePtr, &ExtData, &ExtFunction) == GIF_ERROR) { + return GIF_ERROR; + } + if (ExtFunction == APPLICATION_EXT_FUNC_CODE && ExtData[0] == 3 && ExtData[1] == 1) { + info->loopCount = (unsigned short) (ExtData[2] + (ExtData[3] << 8)); + } + } + } + return GIF_OK; +} + +static int DDGifSlurp(GifFileType *GifFile, GifInfo *info, bool shouldDecode) { + GifRecordType RecordType; + GifByteType *ExtData; + int codeSize; + int ExtFunction; + size_t ImageSize; + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + return GIF_ERROR; + } + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: { + if (DGifGetImageDesc(GifFile, !shouldDecode) == GIF_ERROR) { + return GIF_ERROR; + } + int i = shouldDecode ? info->currentIndex : GifFile->ImageCount - 1; + SavedImage *sp = &GifFile->SavedImages[i]; + ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height; + + if (sp->ImageDesc.Width < 1 || sp->ImageDesc.Height < 1 || ImageSize > (SIZE_MAX / sizeof(GifPixelType))) { + GifFile->Error = D_GIF_ERR_INVALID_IMG_DIMS; + return GIF_ERROR; + } + if (sp->ImageDesc.Width > GifFile->SWidth || sp->ImageDesc.Height > GifFile->SHeight) { + GifFile->Error = D_GIF_ERR_IMG_NOT_CONFINED; + return GIF_ERROR; + } + if (shouldDecode) { + sp->RasterBits = info->rasterBits; + if (sp->ImageDesc.Interlace) { + int i, j; + int InterlacedOffset[] = { 0, 4, 2, 1 }; + int InterlacedJumps[] = { 8, 8, 4, 2 }; + for (i = 0; i < 4; i++) { + for (j = InterlacedOffset[i]; j < sp->ImageDesc.Height; j += InterlacedJumps[i]) { + if (DGifGetLine(GifFile, sp->RasterBits + j * sp->ImageDesc.Width, sp->ImageDesc.Width) == GIF_ERROR) { + return GIF_ERROR; + } + } + } + } else { + if (DGifGetLine(GifFile, sp->RasterBits, ImageSize) == GIF_ERROR) { + return GIF_ERROR; + } + } + if (info->currentIndex >= GifFile->ImageCount - 1) { + if (info->loopCount > 0) + info->currentLoop++; + if (fileRewindFun(info) != 0) { + info->gifFilePtr->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + } + return GIF_OK; + } else { + if (DGifGetCode(GifFile, &codeSize, &ExtData) == GIF_ERROR) { + return GIF_ERROR; + } + while (ExtData) { + if (DGifGetCodeNext(GifFile, &ExtData) == GIF_ERROR) { + return GIF_ERROR; + } + } + } + break; + } + + case EXTENSION_RECORD_TYPE: { + if (DGifGetExtension(GifFile, &ExtFunction, &ExtData) == GIF_ERROR) { + return GIF_ERROR; + } + + if (!shouldDecode) { + info->infos = realloc(info->infos, (GifFile->ImageCount + 1) * sizeof(FrameInfo)); + if (readExtensions(ExtFunction, ExtData, info) == GIF_ERROR) { + return GIF_ERROR; + } + } + while (ExtData) { + if (DGifGetExtensionNext(GifFile, &ExtData, &ExtFunction) == GIF_ERROR) { + return GIF_ERROR; + } + if (!shouldDecode) { + if (readExtensions(ExtFunction, ExtData, info) == GIF_ERROR) { + return GIF_ERROR; + } + } + } + break; + } + case TERMINATE_RECORD_TYPE: + default: + break; + } + } while (RecordType != TERMINATE_RECORD_TYPE); + + bool ok = true; + if (shouldDecode) { + ok = (fileRewindFun(info) == 0); + } + if (ok) { + return GIF_OK; + } else { + info->gifFilePtr->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } +} + +static void copyLine(argb *dst, const unsigned char *src, const ColorMapObject *cmap, int transparent, int width) { + for (; width > 0; width--, src++, dst++) { + if (*src != transparent) { + getColorFromTable(*src, dst, cmap); + } + } +} + +static argb *getAddr(argb *bm, int width, int left, int top) { + return bm + top * width + left; +} + +static void blitNormal(argb *bm, int width, int height, const SavedImage *frame, const ColorMapObject *cmap, int transparent) { + const unsigned char *src = (unsigned char *)frame->RasterBits; + argb *dst = getAddr(bm, width, frame->ImageDesc.Left, frame->ImageDesc.Top); + GifWord copyWidth = frame->ImageDesc.Width; + if (frame->ImageDesc.Left + copyWidth > width) { + copyWidth = width - frame->ImageDesc.Left; + } + + GifWord copyHeight = frame->ImageDesc.Height; + if (frame->ImageDesc.Top + copyHeight > height) { + copyHeight = height - frame->ImageDesc.Top; + } + + int srcPad, dstPad; + dstPad = width - copyWidth; + srcPad = frame->ImageDesc.Width - copyWidth; + for (; copyHeight > 0; copyHeight--) { + copyLine(dst, src, cmap, transparent, copyWidth); + src += frame->ImageDesc.Width; + dst += width; + } +} + +static void fillRect(argb *bm, int bmWidth, int bmHeight, GifWord left, GifWord top, GifWord width, GifWord height, argb col) { + uint32_t *dst = (uint32_t *)getAddr(bm, bmWidth, left, top); + GifWord copyWidth = width; + if (left + copyWidth > bmWidth) { + copyWidth = bmWidth - left; + } + + GifWord copyHeight = height; + if (top + copyHeight > bmHeight) { + copyHeight = bmHeight - top; + } + uint32_t *pColor = (uint32_t *)(&col); + for (; copyHeight > 0; copyHeight--) { + memset(dst, *pColor, copyWidth * sizeof(argb)); + dst += bmWidth; + } +} + +static void drawFrame(argb *bm, int bmWidth, int bmHeight, const SavedImage *frame, const ColorMapObject *cmap, short transpIndex) { + if (frame->ImageDesc.ColorMap != NULL) { + cmap = frame->ImageDesc.ColorMap; + if (cmap == NULL || cmap->ColorCount != (1 << cmap->BitsPerPixel)) { + cmap = defaultCmap; + } + } + + blitNormal(bm, bmWidth, bmHeight, frame, cmap, (int) transpIndex); +} + +static bool checkIfCover(const SavedImage *target, const SavedImage *covered) { + if (target->ImageDesc.Left <= covered->ImageDesc.Left + && covered->ImageDesc.Left + covered->ImageDesc.Width + <= target->ImageDesc.Left + target->ImageDesc.Width + && target->ImageDesc.Top <= covered->ImageDesc.Top + && covered->ImageDesc.Top + covered->ImageDesc.Height + <= target->ImageDesc.Top + target->ImageDesc.Height) { + return true; + } + return false; +} + +static inline void disposeFrameIfNeeded(argb *bm, GifInfo *info, unsigned int idx) { + argb *backup = info->backupPtr; + argb color; + packARGB32(&color, 0, 0, 0, 0); + GifFileType *fGif = info->gifFilePtr; + SavedImage *cur = &fGif->SavedImages[idx - 1]; + SavedImage *next = &fGif->SavedImages[idx]; + bool curTrans = info->infos[idx - 1].transpIndex != -1; + int curDisposal = info->infos[idx - 1].disposalMethod; + bool nextTrans = info->infos[idx].transpIndex != -1; + int nextDisposal = info->infos[idx].disposalMethod; + + argb *tmp; + if ((curDisposal == 2 || curDisposal == 3) && (nextTrans || !checkIfCover(next, cur))) { + switch (curDisposal) { + case 2: { + fillRect(bm, fGif->SWidth, fGif->SHeight, cur->ImageDesc.Left, cur->ImageDesc.Top, cur->ImageDesc.Width, cur->ImageDesc.Height, color); + } + break; + + case 3: { + tmp = bm; + bm = backup; + backup = tmp; + } + break; + } + } + + if (nextDisposal == 3) { + memcpy(backup, bm, fGif->SWidth * fGif->SHeight * sizeof(argb)); + } +} + +static jboolean reset(GifInfo *info) { + if (fileRewindFun(info) != 0) { + return JNI_FALSE; + } + info->nextStartTime = 0; + info->currentLoop = -1; + info->currentIndex = -1; + return JNI_TRUE; +} + +static void getBitmap(argb *bm, GifInfo *info) { + GifFileType *fGIF = info->gifFilePtr; + + argb paintingColor; + int i = info->currentIndex; + if (DDGifSlurp(fGIF, info, true) == GIF_ERROR) { + return; //TODO add leniency support + } + SavedImage *cur = &fGIF->SavedImages[i]; + + short transpIndex = info->infos[i].transpIndex; + if (i == 0) { + if (transpIndex == -1) { + getColorFromTable(fGIF->SBackGroundColor, &paintingColor, fGIF->SColorMap); + } else { + packARGB32(&paintingColor, 0, 0, 0, 0); + } + eraseColor(bm, fGIF->SWidth, fGIF->SHeight, paintingColor); + } else { + disposeFrameIfNeeded(bm, info, i); + } + drawFrame(bm, fGIF->SWidth, fGIF->SHeight, cur, fGIF->SColorMap, transpIndex); +} + +static void setMetaData(int width, int height, int ImageCount, int errorCode, JNIEnv *env, jintArray metaData) { + jint *ints = (*env)->GetIntArrayElements(env, metaData, 0); + *ints++ = width; + *ints++ = height; + *ints++ = ImageCount; + *ints = errorCode; + (*env)->ReleaseIntArrayElements(env, metaData, ints, 0); +} + +static jint open(GifFileType *GifFileIn, int Error, int startPos, JNIEnv *env, jintArray metaData) { + if (startPos < 0) { + Error = D_GIF_ERR_NOT_READABLE; + DGifCloseFile(GifFileIn); + } + if (Error != 0 || GifFileIn == NULL) { + setMetaData(0, 0, 0, Error, env, metaData); + return (jint) NULL; + } + int width = GifFileIn->SWidth, height = GifFileIn->SHeight; + unsigned int wxh = width * height; + if (wxh < 1 || wxh > INT_MAX) { + DGifCloseFile(GifFileIn); + setMetaData(width, height, 0, D_GIF_ERR_INVALID_SCR_DIMS, env, metaData); + return (jint) NULL; + } + GifInfo *info = malloc(sizeof(GifInfo)); + if (info == NULL) { + DGifCloseFile(GifFileIn); + setMetaData(width, height, 0, D_GIF_ERR_NOT_ENOUGH_MEM, env, metaData); + return (jint) NULL; + } + info->gifFilePtr = GifFileIn; + info->startPos = startPos; + info->currentIndex = -1; + info->nextStartTime = 0; + info->lastFrameReaminder = ULONG_MAX; + info->comment = NULL; + info->loopCount = 0; + info->currentLoop = -1; + info->speedFactor = 1.0; + info->rasterBits = calloc(GifFileIn->SHeight * GifFileIn->SWidth, sizeof(GifPixelType)); + info->infos = malloc(sizeof(FrameInfo)); + info->infos->duration = 0; + info->infos->disposalMethod = 0; + info->infos->transpIndex = -1; + info->backupPtr = NULL; + + if (info->rasterBits == NULL || info->infos == NULL) { + cleanUp(info); + setMetaData(width, height, 0, D_GIF_ERR_NOT_ENOUGH_MEM, env, metaData); + return (jint) NULL; + } + + if (DDGifSlurp(GifFileIn, info, false) == GIF_ERROR) { + Error = GifFileIn->Error; + } + if (GifFileIn->SColorMap == NULL || GifFileIn->SColorMap->ColorCount != (1 << GifFileIn->SColorMap->BitsPerPixel)) { + GifFreeMapObject(GifFileIn->SColorMap); + GifFileIn->SColorMap = defaultCmap; + } + int imgCount = GifFileIn->ImageCount; + if (imgCount < 1) { + Error = D_GIF_ERR_NO_FRAMES; + } + if (fileRewindFun(info) != 0) { + Error = D_GIF_ERR_READ_FAILED; + } + if (Error != 0) { + cleanUp(info); + } + setMetaData(width, height, imgCount, Error, env, metaData); + + return (jint)(Error == 0 ? info : NULL); +} + +JNIEXPORT jlong JNICALL Java_org_telegram_ui_Views_GifDrawable_getAllocationByteCount(JNIEnv *env, jclass class, jobject gifInfo) { + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL) { + return 0; + } + unsigned int pxCount = info->gifFilePtr->SWidth + info->gifFilePtr->SHeight; + jlong sum = pxCount * sizeof(char); + if (info->backupPtr != NULL) { + sum += pxCount * sizeof(argb); + } + return sum; +} + +JNIEXPORT jboolean JNICALL Java_org_telegram_ui_Views_GifDrawable_reset(JNIEnv *env, jclass class, jobject gifInfo) { + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL) { + return JNI_FALSE; + } + return reset(info); +} + +JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_setSpeedFactor(JNIEnv *env, jclass class, jobject gifInfo, jfloat factor) { + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL) { + return; + } + info->speedFactor = factor; +} + +JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_seekToTime(JNIEnv *env, jclass class, jobject gifInfo, jint desiredPos, jintArray jPixels) { + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL) { + return; + } + int imgCount = info->gifFilePtr->ImageCount; + if (imgCount <= 1) { + return; + } + + unsigned long sum = 0; + int i; + for (i = 0; i < imgCount; i++) { + unsigned long newSum = sum + info->infos[i].duration; + if (newSum >= desiredPos) { + break; + } + sum = newSum; + } + if (i < info->currentIndex) { + return; + } + + unsigned long lastFrameRemainder = desiredPos - sum; + if (i == imgCount - 1 && lastFrameRemainder > info->infos[i].duration) { + lastFrameRemainder = info->infos[i].duration; + } + info->lastFrameReaminder = lastFrameRemainder; + if (i > info->currentIndex) { + jint *pixels = (*env)->GetIntArrayElements(env, jPixels, 0); + while (info->currentIndex <= i) { + info->currentIndex++; + getBitmap((argb *)pixels, info); + } + (*env)->ReleaseIntArrayElements(env, jPixels, pixels, 0); + } + if (info->speedFactor == 1.0) { + info->nextStartTime = getRealTime() + lastFrameRemainder; + } else { + info->nextStartTime = getRealTime() + lastFrameRemainder * info->speedFactor; + } +} + +JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_seekToFrame(JNIEnv *env, jclass class, jobject gifInfo, jint desiredIdx, jintArray jPixels) { + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL) { + return; + } + if (desiredIdx <= info->currentIndex) { + return; + } + + int imgCount = info->gifFilePtr->ImageCount; + if (imgCount <= 1) { + return; + } + + if (desiredIdx >= imgCount) { + desiredIdx = imgCount - 1; + } + + info->lastFrameReaminder = 0; + jint *pixels = (*env)->GetIntArrayElements(env, jPixels, 0); + while (info->currentIndex < desiredIdx) { + info->currentIndex++; + getBitmap((argb *)pixels, info); + } + (*env)->ReleaseIntArrayElements(env, jPixels, pixels, 0); + if (info->speedFactor == 1.0) { + info->nextStartTime = getRealTime() + info->infos[info->currentIndex].duration; + } else { + info->nextStartTime = getRealTime() + info->infos[info->currentIndex].duration * info->speedFactor; + } + +} + +JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_renderFrame(JNIEnv *env, jclass class, jintArray jPixels, jobject gifInfo, jintArray metaData) { + + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL) { + return; + } + + bool needRedraw = false; + unsigned long rt = getRealTime(); + + if (rt >= info->nextStartTime && info->currentLoop < info->loopCount) { + if (++info->currentIndex >= info->gifFilePtr->ImageCount) { + info->currentIndex = 0; + } + needRedraw = true; + } + jint *rawMetaData = (*env)->GetIntArrayElements(env, metaData, 0); + + if (needRedraw) { + jint *pixels = (*env)->GetIntArrayElements(env, jPixels, 0); + getBitmap((argb *)pixels, info); + rawMetaData[3] = info->gifFilePtr->Error; + + (*env)->ReleaseIntArrayElements(env, jPixels, pixels, 0); + + int scaledDuration = info->infos[info->currentIndex].duration; + if (info->speedFactor != 1.0) { + scaledDuration /= info->speedFactor; + } + info->nextStartTime = rt + scaledDuration; + rawMetaData[4] = scaledDuration; + } else { + rawMetaData[4] = (int) (rt - info->nextStartTime); + } + (*env)->ReleaseIntArrayElements(env, metaData, rawMetaData, 0); +} + +JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_free(JNIEnv *env, jclass class, jobject gifInfo) { + if (gifInfo == NULL) { + return; + } + GifInfo *info = (GifInfo *)gifInfo; + FILE *file = info->gifFilePtr->UserData; + if (file) { + fclose(file); + } + info->gifFilePtr->UserData = NULL; + cleanUp(info); +} + +JNIEXPORT jstring JNICALL Java_org_telegram_ui_Views_GifDrawable_getComment(JNIEnv *env, jclass class, jobject gifInfo) { + if (gifInfo == NULL) { + return NULL; + } + GifInfo *info = (GifInfo *)gifInfo; + return (*env)->NewStringUTF(env, info->comment); +} + +JNIEXPORT jint JNICALL Java_org_telegram_ui_Views_GifDrawable_getLoopCount(JNIEnv *env, jclass class, jobject gifInfo) { + if (gifInfo == NULL) { + return 0; + } + return ((GifInfo *)gifInfo)->loopCount; +} + +JNIEXPORT jint JNICALL Java_org_telegram_ui_Views_GifDrawable_getDuration(JNIEnv *env, jclass class, jobject gifInfo) { + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL) { + return 0; + } + int i; + unsigned long sum = 0; + for (i = 0; i < info->gifFilePtr->ImageCount; i++) { + sum += info->infos[i].duration; + } + return sum; +} + +JNIEXPORT jint JNICALL Java_org_telegram_ui_Views_GifDrawable_getCurrentPosition(JNIEnv *env, jclass class, jobject gifInfo) { + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL) { + return 0; + } + int idx = info->currentIndex; + if (idx < 0 || info->gifFilePtr->ImageCount <= 1) { + return 0; + } + int i; + unsigned int sum = 0; + for (i = 0; i < idx; i++) { + sum += info->infos[i].duration; + } + unsigned long remainder = info->lastFrameReaminder == ULONG_MAX ? getRealTime() - info->nextStartTime : info->lastFrameReaminder; + return (int) (sum + remainder); +} + +JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_saveRemainder(JNIEnv *env, jclass class, jobject gifInfo) { + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL) { + return; + } + info->lastFrameReaminder = getRealTime() - info->nextStartTime; +} + +JNIEXPORT void JNICALL Java_org_telegram_ui_Views_GifDrawable_restoreRemainder(JNIEnv *env, jclass class, jobject gifInfo) { + GifInfo *info = (GifInfo *)gifInfo; + if (info == NULL || info->lastFrameReaminder == ULONG_MAX) { + return; + } + info->nextStartTime = getRealTime() + info->lastFrameReaminder; + info->lastFrameReaminder = ULONG_MAX; +} + +JNIEXPORT jint JNICALL Java_org_telegram_ui_Views_GifDrawable_openFile(JNIEnv *env, jclass class, jintArray metaData, jstring jfname) { + if (jfname == NULL) { + setMetaData(0, 0, 0, D_GIF_ERR_OPEN_FAILED, env, metaData); + return (jint) NULL; + } + + const char *fname = (*env)->GetStringUTFChars(env, jfname, 0); + FILE *file = fopen(fname, "rb"); + (*env)->ReleaseStringUTFChars(env, jfname, fname); + if (file == NULL) { + setMetaData(0, 0, 0, D_GIF_ERR_OPEN_FAILED, env, metaData); + return (jint) NULL; + } + int Error = 0; + GifFileType *GifFileIn = DGifOpen(file, &fileReadFunc, &Error); + return open(GifFileIn, Error, ftell(file), env, metaData); +} diff --git a/TMessagesProj/jni/gif.h b/TMessagesProj/jni/gif.h new file mode 100644 index 00000000..96409be1 --- /dev/null +++ b/TMessagesProj/jni/gif.h @@ -0,0 +1,7 @@ +#ifndef gif_h +#define gif_h + +jint gifOnJNILoad(JavaVM *vm, void *reserved, JNIEnv *env); +void gifOnJNIUnload(JavaVM *vm, void *reserved); + +#endif \ No newline at end of file diff --git a/TMessagesProj/jni/giflib/config.h b/TMessagesProj/jni/giflib/config.h new file mode 100755 index 00000000..e68b0d9e --- /dev/null +++ b/TMessagesProj/jni/giflib/config.h @@ -0,0 +1,13 @@ + +// giflib config.h + +#ifndef GIF_CONFIG_H_DEFINED +#define GIF_CONFIG_H_DEFINED + +#include +#define HAVE_STDINT_H +#define HAVE_FCNTL_H + +typedef uint32_t UINT32; + +#endif diff --git a/TMessagesProj/jni/giflib/dgif_lib.c b/TMessagesProj/jni/giflib/dgif_lib.c new file mode 100755 index 00000000..92442408 --- /dev/null +++ b/TMessagesProj/jni/giflib/dgif_lib.c @@ -0,0 +1,1167 @@ +/****************************************************************************** + +dgif_lib.c - GIF decoding + +The functions here and in egif_lib.c are partitioned carefully so that +if you only require one of read and write capability, only one of these +two modules will be linked. Preserve this property! + +*****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif /* _WIN32 */ + +#include "gif_lib.h" +#include "gif_lib_private.h" + +/* compose unsigned little endian value */ +#define UNSIGNED_LITTLE_ENDIAN(lo, hi) ((lo) | ((hi) << 8)) + +/* avoid extra function call in case we use fread (TVT) */ +#define READ(_gif,_buf,_len) \ + (((GifFilePrivateType*)_gif->Private)->Read ? \ + ((GifFilePrivateType*)_gif->Private)->Read(_gif,_buf,_len) : \ + fread(_buf,1,_len,((GifFilePrivateType*)_gif->Private)->File)) + +static int DGifGetWord(GifFileType *GifFile, GifWord *Word); +static int DGifSetupDecompress(GifFileType *GifFile); +static int DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, + int LineLen); +static int DGifGetPrefixChar(GifPrefixType *Prefix, int Code, int ClearCode); +static int DGifDecompressInput(GifFileType *GifFile, int *Code); +static int DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, + GifByteType *NextByte); + +/****************************************************************************** + Open a new GIF file for read, given by its name. + Returns dynamically allocated GifFileType pointer which serves as the GIF + info record. +******************************************************************************/ +GifFileType * +DGifOpenFileName(const char *FileName, int *Error) +{ + int FileHandle; + GifFileType *GifFile; + + if ((FileHandle = open(FileName, O_RDONLY)) == -1) { + if (Error != NULL) + *Error = D_GIF_ERR_OPEN_FAILED; + return NULL; + } + GifFile = DGifOpenFileHandle(FileHandle, Error); + return GifFile; +} + +/****************************************************************************** + Update a new GIF file, given its file handle. + Returns dynamically allocated GifFileType pointer which serves as the GIF + info record. +******************************************************************************/ +GifFileType * +DGifOpenFileHandle(int FileHandle, int *Error) +{ + char Buf[GIF_STAMP_LEN + 1]; + GifFileType *GifFile; + GifFilePrivateType *Private; + FILE *f; + + GifFile = (GifFileType *)malloc(sizeof(GifFileType)); + if (GifFile == NULL) { + if (Error != NULL) + *Error = D_GIF_ERR_NOT_ENOUGH_MEM; + (void)close(FileHandle); + return NULL; + } + + /*@i1@*/memset(GifFile, '\0', sizeof(GifFileType)); + + /* Belt and suspenders, in case the null pointer isn't zero */ + GifFile->SavedImages = NULL; + GifFile->SColorMap = NULL; + + Private = (GifFilePrivateType *)malloc(sizeof(GifFilePrivateType)); + if (Private == NULL) { + if (Error != NULL) + *Error = D_GIF_ERR_NOT_ENOUGH_MEM; + (void)close(FileHandle); + free((char *)GifFile); + return NULL; + } +#ifdef _WIN32 + _setmode(FileHandle, O_BINARY); /* Make sure it is in binary mode. */ +#endif /* _WIN32 */ + + f = fdopen(FileHandle, "rb"); /* Make it into a stream: */ + + /*@-mustfreeonly@*/ + GifFile->Private = (void *)Private; + Private->FileHandle = FileHandle; + Private->File = f; + Private->FileState = FILE_STATE_READ; + Private->Read = NULL; /* don't use alternate input method (TVT) */ + GifFile->UserData = NULL; /* TVT */ + /*@=mustfreeonly@*/ + + /* Let's see if this is a GIF file: */ + if (READ(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) != GIF_STAMP_LEN) { + if (Error != NULL) + *Error = D_GIF_ERR_READ_FAILED; + (void)fclose(f); + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + /* Check for GIF prefix at start of file */ + Buf[GIF_STAMP_LEN] = 0; + if (strncmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) { + if (Error != NULL) + *Error = D_GIF_ERR_NOT_GIF_FILE; + (void)fclose(f); + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + if (DGifGetScreenDesc(GifFile) == GIF_ERROR) { + (void)fclose(f); + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + GifFile->Error = 0; + + /* What version of GIF? */ + Private->gif89 = (Buf[GIF_VERSION_POS] == '9'); + + return GifFile; +} + +/****************************************************************************** + GifFileType constructor with user supplied input function (TVT) +******************************************************************************/ +GifFileType * +DGifOpen(void *userData, InputFunc readFunc, int *Error) +{ + char Buf[GIF_STAMP_LEN + 1]; + GifFileType *GifFile; + GifFilePrivateType *Private; + + GifFile = (GifFileType *)malloc(sizeof(GifFileType)); + if (GifFile == NULL) { + if (Error != NULL) + *Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return NULL; + } + + memset(GifFile, '\0', sizeof(GifFileType)); + + /* Belt and suspenders, in case the null pointer isn't zero */ + GifFile->SavedImages = NULL; + GifFile->SColorMap = NULL; + + Private = (GifFilePrivateType *)malloc(sizeof(GifFilePrivateType)); + if (!Private) { + if (Error != NULL) + *Error = D_GIF_ERR_NOT_ENOUGH_MEM; + free((char *)GifFile); + return NULL; + } + + GifFile->Private = (void *)Private; + Private->FileHandle = 0; + Private->File = NULL; + Private->FileState = FILE_STATE_READ; + + Private->Read = readFunc; /* TVT */ + GifFile->UserData = userData; /* TVT */ + + /* Lets see if this is a GIF file: */ + if (READ(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) != GIF_STAMP_LEN) { + if (Error != NULL) + *Error = D_GIF_ERR_READ_FAILED; + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + /* Check for GIF prefix at start of file */ + Buf[GIF_STAMP_LEN] = '\0'; + if (strncmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) { + if (Error != NULL) + *Error = D_GIF_ERR_NOT_GIF_FILE; + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + if (DGifGetScreenDesc(GifFile) == GIF_ERROR) { + free((char *)Private); + free((char *)GifFile); + *Error = D_GIF_ERR_NO_SCRN_DSCR; + return NULL; + } + + GifFile->Error = 0; + + /* What version of GIF? */ + Private->gif89 = (Buf[GIF_VERSION_POS] == '9'); + + return GifFile; +} + +/****************************************************************************** + This routine should be called before any other DGif calls. Note that + this routine is called automatically from DGif file open routines. +******************************************************************************/ +int +DGifGetScreenDesc(GifFileType *GifFile) +{ + int BitsPerPixel; + bool SortFlag; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + /* Put the screen descriptor into the file: */ + if (DGifGetWord(GifFile, &GifFile->SWidth) == GIF_ERROR || + DGifGetWord(GifFile, &GifFile->SHeight) == GIF_ERROR) + return GIF_ERROR; + + if (READ(GifFile, Buf, 3) != 3) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + GifFreeMapObject(GifFile->SColorMap); + GifFile->SColorMap = NULL; + return GIF_ERROR; + } + GifFile->SColorResolution = (((Buf[0] & 0x70) + 1) >> 4) + 1; + SortFlag = (Buf[0] & 0x08) != 0; + BitsPerPixel = (Buf[0] & 0x07) + 1; + GifFile->SBackGroundColor = Buf[1]; + GifFile->AspectByte = Buf[2]; + if (Buf[0] & 0x80) { /* Do we have global color map? */ + int i; + + GifFile->SColorMap = GifMakeMapObject(1 << BitsPerPixel, NULL); + if (GifFile->SColorMap == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + + /* Get the global color map: */ + GifFile->SColorMap->SortFlag = SortFlag; + for (i = 0; i < GifFile->SColorMap->ColorCount; i++) { + if (READ(GifFile, Buf, 3) != 3) { + GifFreeMapObject(GifFile->SColorMap); + GifFile->SColorMap = NULL; + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + GifFile->SColorMap->Colors[i].Red = Buf[0]; + GifFile->SColorMap->Colors[i].Green = Buf[1]; + GifFile->SColorMap->Colors[i].Blue = Buf[2]; + } + } else { + GifFile->SColorMap = NULL; + } + + return GIF_OK; +} + +/****************************************************************************** + This routine should be called before any attempt to read an image. +******************************************************************************/ +int +DGifGetRecordType(GifFileType *GifFile, GifRecordType* Type) +{ + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (READ(GifFile, &Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + + switch (Buf) { + case DESCRIPTOR_INTRODUCER: + *Type = IMAGE_DESC_RECORD_TYPE; + break; + case EXTENSION_INTRODUCER: + *Type = EXTENSION_RECORD_TYPE; + break; + case TERMINATOR_INTRODUCER: + *Type = TERMINATE_RECORD_TYPE; + break; + default: + *Type = UNDEFINED_RECORD_TYPE; + GifFile->Error = D_GIF_ERR_WRONG_RECORD; + return GIF_ERROR; + } + + return GIF_OK; +} + +/****************************************************************************** + This routine should be called before any attempt to read an image. + Note it is assumed the Image desc. header has been read. +******************************************************************************/ +int +DGifGetImageDesc(GifFileType *GifFile, bool changeImageCount) +{ + unsigned int BitsPerPixel; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + SavedImage *sp; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (DGifGetWord(GifFile, &GifFile->Image.Left) == GIF_ERROR || + DGifGetWord(GifFile, &GifFile->Image.Top) == GIF_ERROR || + DGifGetWord(GifFile, &GifFile->Image.Width) == GIF_ERROR || + DGifGetWord(GifFile, &GifFile->Image.Height) == GIF_ERROR) + return GIF_ERROR; + if (READ(GifFile, Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + GifFreeMapObject(GifFile->Image.ColorMap); + GifFile->Image.ColorMap = NULL; + return GIF_ERROR; + } + BitsPerPixel = (Buf[0] & 0x07) + 1; + GifFile->Image.Interlace = (Buf[0] & 0x40) ? true : false; + + /* Setup the colormap */ + if (GifFile->Image.ColorMap) { + GifFreeMapObject(GifFile->Image.ColorMap); + GifFile->Image.ColorMap = NULL; + } + /* Does this image have local color map? */ + if (Buf[0] & 0x80) { + unsigned int i; + + GifFile->Image.ColorMap = GifMakeMapObject(1 << BitsPerPixel, NULL); + if (GifFile->Image.ColorMap == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + + /* Get the image local color map: */ + for (i = 0; i < GifFile->Image.ColorMap->ColorCount; i++) { + if (READ(GifFile, Buf, 3) != 3) { + GifFreeMapObject(GifFile->Image.ColorMap); + GifFile->Error = D_GIF_ERR_READ_FAILED; + GifFile->Image.ColorMap = NULL; + return GIF_ERROR; + } + GifFile->Image.ColorMap->Colors[i].Red = Buf[0]; + GifFile->Image.ColorMap->Colors[i].Green = Buf[1]; + GifFile->Image.ColorMap->Colors[i].Blue = Buf[2]; + } + } + // if (changeImageCount) + { + if (GifFile->SavedImages) { + if ((GifFile->SavedImages = (SavedImage *)realloc(GifFile->SavedImages, + sizeof(SavedImage) * + (GifFile->ImageCount + 1))) == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + } else { + if ((GifFile->SavedImages = + (SavedImage *) malloc(sizeof(SavedImage))) == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + } + } + sp = &GifFile->SavedImages[GifFile->ImageCount]; + memcpy(&sp->ImageDesc, &GifFile->Image, sizeof(GifImageDesc)); + if (GifFile->Image.ColorMap != NULL) { + sp->ImageDesc.ColorMap = GifMakeMapObject( + GifFile->Image.ColorMap->ColorCount, + GifFile->Image.ColorMap->Colors); + if (sp->ImageDesc.ColorMap == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + } + sp->RasterBits = (unsigned char *)NULL; + sp->ExtensionBlockCount = 0; + sp->ExtensionBlocks = (ExtensionBlock *) NULL; + if (changeImageCount) + GifFile->ImageCount++; + + Private->PixelCount = (long)GifFile->Image.Width * + (long)GifFile->Image.Height; + + /* Reset decompress algorithm parameters. */ + (void)DGifSetupDecompress(GifFile); + + return GIF_OK; +} + +/****************************************************************************** + Get one full scanned line (Line) of length LineLen from GIF file. +******************************************************************************/ +int +DGifGetLine(GifFileType *GifFile, GifPixelType *Line, int LineLen) +{ + GifByteType *Dummy; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (!LineLen) + LineLen = GifFile->Image.Width; + + if ((Private->PixelCount -= LineLen) > 0xffff0000UL) { + GifFile->Error = D_GIF_ERR_DATA_TOO_BIG; + return GIF_ERROR; + } + + if (DGifDecompressLine(GifFile, Line, LineLen) == GIF_OK) { + if (Private->PixelCount == 0) { + /* We probably won't be called any more, so let's clean up + * everything before we return: need to flush out all the + * rest of image until an empty block (size 0) + * detected. We use GetCodeNext. + */ + do + if (DGifGetCodeNext(GifFile, &Dummy) == GIF_ERROR) + return GIF_ERROR; + while (Dummy != NULL) ; + } + return GIF_OK; + } else + return GIF_ERROR; +} + +/****************************************************************************** + Put one pixel (Pixel) into GIF file. +******************************************************************************/ +int +DGifGetPixel(GifFileType *GifFile, GifPixelType Pixel) +{ + GifByteType *Dummy; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + if (--Private->PixelCount > 0xffff0000UL) + { + GifFile->Error = D_GIF_ERR_DATA_TOO_BIG; + return GIF_ERROR; + } + + if (DGifDecompressLine(GifFile, &Pixel, 1) == GIF_OK) { + if (Private->PixelCount == 0) { + /* We probably won't be called any more, so let's clean up + * everything before we return: need to flush out all the + * rest of image until an empty block (size 0) + * detected. We use GetCodeNext. + */ + do + if (DGifGetCodeNext(GifFile, &Dummy) == GIF_ERROR) + return GIF_ERROR; + while (Dummy != NULL) ; + } + return GIF_OK; + } else + return GIF_ERROR; +} + +/****************************************************************************** + Get an extension block (see GIF manual) from GIF file. This routine only + returns the first data block, and DGifGetExtensionNext should be called + after this one until NULL extension is returned. + The Extension should NOT be freed by the user (not dynamically allocated). + Note it is assumed the Extension description header has been read. +******************************************************************************/ +int +DGifGetExtension(GifFileType *GifFile, int *ExtCode, GifByteType **Extension) +{ + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (READ(GifFile, &Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + *ExtCode = Buf; + + return DGifGetExtensionNext(GifFile, Extension, ExtCode); +} + +/****************************************************************************** + Get a following extension block (see GIF manual) from GIF file. This + routine should be called until NULL Extension is returned. + The Extension should NOT be freed by the user (not dynamically allocated). +******************************************************************************/ +int +DGifGetExtensionNext(GifFileType *GifFile, GifByteType ** Extension, int* ExtCode) +{ + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (READ(GifFile, &Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + if (Buf > 0) + { + if (*ExtCode==GRAPHICS_EXT_FUNC_CODE) + Buf=4; + *Extension = Private->Buf; /* Use private unused buffer. */ + (*Extension)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */ + /* coverity[tainted_data] */ + if (READ(GifFile, &((*Extension)[1]), Buf) != Buf) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + } else + *Extension = NULL; + + return GIF_OK; +} + +/****************************************************************************** + Extract a Graphics Control Block from raw extension data +******************************************************************************/ + +int DGifExtensionToGCB(const size_t GifExtensionLength, + const GifByteType *GifExtension, + GraphicsControlBlock *GCB) +{ + if (GifExtensionLength != 4) { + return GIF_ERROR; + } + + GCB->DisposalMode = (GifExtension[0] >> 2) & 0x07; + GCB->UserInputFlag = (GifExtension[0] & 0x02) != 0; + GCB->DelayTime = UNSIGNED_LITTLE_ENDIAN(GifExtension[1], GifExtension[2]); + if (GifExtension[0] & 0x01) + GCB->TransparentColor = (int)GifExtension[3]; + else + GCB->TransparentColor = NO_TRANSPARENT_COLOR; + + return GIF_OK; +} + +/****************************************************************************** + Extract the Graphics Control Block for a saved image, if it exists. +******************************************************************************/ + +int DGifSavedExtensionToGCB(GifFileType *GifFile, + int ImageIndex, GraphicsControlBlock *GCB) +{ + int i; + + if (ImageIndex < 0 || ImageIndex > GifFile->ImageCount - 1) + return GIF_ERROR; + + GCB->DisposalMode = DISPOSAL_UNSPECIFIED; + GCB->UserInputFlag = false; + GCB->DelayTime = 0; + GCB->TransparentColor = NO_TRANSPARENT_COLOR; + + for (i = 0; i < GifFile->SavedImages[ImageIndex].ExtensionBlockCount; i++) { + ExtensionBlock *ep = &GifFile->SavedImages[ImageIndex].ExtensionBlocks[i]; + if (ep->Function == GRAPHICS_EXT_FUNC_CODE) + return DGifExtensionToGCB(ep->ByteCount, ep->Bytes, GCB); + } + + return GIF_ERROR; +} + +/****************************************************************************** + This routine should be called last, to close the GIF file. +******************************************************************************/ +int +DGifCloseFile(GifFileType *GifFile) +{ + GifFilePrivateType *Private; + + if (GifFile == NULL || GifFile->Private == NULL) + return GIF_ERROR; + + if (GifFile->Image.ColorMap) { + GifFreeMapObject(GifFile->Image.ColorMap); + GifFile->Image.ColorMap = NULL; + } + + if (GifFile->SColorMap) { + GifFreeMapObject(GifFile->SColorMap); + GifFile->SColorMap = NULL; + } + + if (GifFile->SavedImages) { + GifFreeSavedImages(GifFile); + GifFile->SavedImages = NULL; + } + + GifFreeExtensions(&GifFile->ExtensionBlockCount, &GifFile->ExtensionBlocks); + + Private = (GifFilePrivateType *) GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (Private->File && (fclose(Private->File) != 0)) { + GifFile->Error = D_GIF_ERR_CLOSE_FAILED; + return GIF_ERROR; + } + + free((char *)GifFile->Private); + + /* + * Without the #ifndef, we get spurious warnings because Coverity mistakenly + * thinks the GIF structure is freed on an error return. + */ +#ifndef __COVERITY__ + free(GifFile); +#endif /* __COVERITY__ */ + + return GIF_OK; +} + +/****************************************************************************** + Get 2 bytes (word) from the given file: +******************************************************************************/ +static int +DGifGetWord(GifFileType *GifFile, GifWord *Word) +{ + unsigned char c[2]; + + if (READ(GifFile, c, 2) != 2) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + + *Word = (GifWord)UNSIGNED_LITTLE_ENDIAN(c[0], c[1]); + return GIF_OK; +} + +/****************************************************************************** + Get the image code in compressed form. This routine can be called if the + information needed to be piped out as is. Obviously this is much faster + than decoding and encoding again. This routine should be followed by calls + to DGifGetCodeNext, until NULL block is returned. + The block should NOT be freed by the user (not dynamically allocated). +******************************************************************************/ +int +DGifGetCode(GifFileType *GifFile, int *CodeSize, GifByteType **CodeBlock) +{ + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + *CodeSize = Private->BitsPerPixel; + + return DGifGetCodeNext(GifFile, CodeBlock); +} + +/****************************************************************************** + Continue to get the image code in compressed form. This routine should be + called until NULL block is returned. + The block should NOT be freed by the user (not dynamically allocated). +******************************************************************************/ +int +DGifGetCodeNext(GifFileType *GifFile, GifByteType **CodeBlock) +{ + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + /* coverity[tainted_data_argument] */ + if (READ(GifFile, &Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + + /* coverity[lower_bounds] */ + if (Buf > 0) { + *CodeBlock = Private->Buf; /* Use private unused buffer. */ + (*CodeBlock)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */ + /* coverity[tainted_data] */ + if (READ(GifFile, &((*CodeBlock)[1]), Buf) != Buf) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + } else { + *CodeBlock = NULL; + Private->Buf[0] = 0; /* Make sure the buffer is empty! */ + Private->PixelCount = 0; /* And local info. indicate image read. */ + } + + return GIF_OK; +} + +/****************************************************************************** + Setup the LZ decompression for this image: +******************************************************************************/ +static int +DGifSetupDecompress(GifFileType *GifFile) +{ + int i, BitsPerPixel; + GifByteType CodeSize; + GifPrefixType *Prefix; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + READ(GifFile, &CodeSize, 1); /* Read Code size from file. */ + BitsPerPixel = CodeSize; + + Private->Buf[0] = 0; /* Input Buffer empty. */ + Private->BitsPerPixel = BitsPerPixel; + Private->ClearCode = (1 << BitsPerPixel); + Private->EOFCode = Private->ClearCode + 1; + Private->RunningCode = Private->EOFCode + 1; + Private->RunningBits = BitsPerPixel + 1; /* Number of bits per code. */ + Private->MaxCode1 = 1 << Private->RunningBits; /* Max. code + 1. */ + Private->StackPtr = 0; /* No pixels on the pixel stack. */ + Private->LastCode = NO_SUCH_CODE; + Private->CrntShiftState = 0; /* No information in CrntShiftDWord. */ + Private->CrntShiftDWord = 0; + + Prefix = Private->Prefix; + for (i = 0; i <= LZ_MAX_CODE; i++) + Prefix[i] = NO_SUCH_CODE; + + return GIF_OK; +} + +/****************************************************************************** + The LZ decompression routine: + This version decompress the given GIF file into Line of length LineLen. + This routine can be called few times (one per scan line, for example), in + order the complete the whole image. +******************************************************************************/ +static int +DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, int LineLen) +{ + int i = 0; + int j, CrntCode, EOFCode, ClearCode, CrntPrefix, LastCode, StackPtr; + GifByteType *Stack, *Suffix; + GifPrefixType *Prefix; + GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; + + StackPtr = Private->StackPtr; + Prefix = Private->Prefix; + Suffix = Private->Suffix; + Stack = Private->Stack; + EOFCode = Private->EOFCode; + ClearCode = Private->ClearCode; + LastCode = Private->LastCode; + + if (StackPtr > LZ_MAX_CODE) { + return GIF_ERROR; + } + + if (StackPtr != 0) { + /* Let pop the stack off before continueing to read the GIF file: */ + while (StackPtr != 0 && i < LineLen) + Line[i++] = Stack[--StackPtr]; + } + + while (i < LineLen) { /* Decode LineLen items. */ + if (DGifDecompressInput(GifFile, &CrntCode) == GIF_ERROR) + return GIF_ERROR; + + if (CrntCode == EOFCode) { + /* Note however that usually we will not be here as we will stop + * decoding as soon as we got all the pixel, or EOF code will + * not be read at all, and DGifGetLine/Pixel clean everything. */ + GifFile->Error = D_GIF_ERR_EOF_TOO_SOON; + return GIF_ERROR; + } else if (CrntCode == ClearCode) { + /* We need to start over again: */ + for (j = 0; j <= LZ_MAX_CODE; j++) + Prefix[j] = NO_SUCH_CODE; + Private->RunningCode = Private->EOFCode + 1; + Private->RunningBits = Private->BitsPerPixel + 1; + Private->MaxCode1 = 1 << Private->RunningBits; + LastCode = Private->LastCode = NO_SUCH_CODE; + } else { + /* Its regular code - if in pixel range simply add it to output + * stream, otherwise trace to codes linked list until the prefix + * is in pixel range: */ + if (CrntCode < ClearCode) { + /* This is simple - its pixel scalar, so add it to output: */ + Line[i++] = CrntCode; + } else { + /* Its a code to needed to be traced: trace the linked list + * until the prefix is a pixel, while pushing the suffix + * pixels on our stack. If we done, pop the stack in reverse + * (thats what stack is good for!) order to output. */ + if (Prefix[CrntCode] == NO_SUCH_CODE) { + /* Only allowed if CrntCode is exactly the running code: + * In that case CrntCode = XXXCode, CrntCode or the + * prefix code is last code and the suffix char is + * exactly the prefix of last code! */ + if (CrntCode == Private->RunningCode - 2) { + CrntPrefix = LastCode; + Suffix[Private->RunningCode - 2] = + Stack[StackPtr++] = DGifGetPrefixChar(Prefix, + LastCode, + ClearCode); + } else { + GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + } else + CrntPrefix = CrntCode; + + /* Now (if image is O.K.) we should not get a NO_SUCH_CODE + * during the trace. As we might loop forever, in case of + * defective image, we use StackPtr as loop counter and stop + * before overflowing Stack[]. */ + while (StackPtr < LZ_MAX_CODE && + CrntPrefix > ClearCode && CrntPrefix <= LZ_MAX_CODE) { + Stack[StackPtr++] = Suffix[CrntPrefix]; + CrntPrefix = Prefix[CrntPrefix]; + } + if (StackPtr >= LZ_MAX_CODE || CrntPrefix > LZ_MAX_CODE) { + GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + /* Push the last character on stack: */ + Stack[StackPtr++] = CrntPrefix; + + /* Now lets pop all the stack into output: */ + while (StackPtr != 0 && i < LineLen) + Line[i++] = Stack[--StackPtr]; + } + if (LastCode != NO_SUCH_CODE && Prefix[Private->RunningCode - 2] == NO_SUCH_CODE) { + Prefix[Private->RunningCode - 2] = LastCode; + + if (CrntCode == Private->RunningCode - 2) { + /* Only allowed if CrntCode is exactly the running code: + * In that case CrntCode = XXXCode, CrntCode or the + * prefix code is last code and the suffix char is + * exactly the prefix of last code! */ + Suffix[Private->RunningCode - 2] = + DGifGetPrefixChar(Prefix, LastCode, ClearCode); + } else { + Suffix[Private->RunningCode - 2] = + DGifGetPrefixChar(Prefix, CrntCode, ClearCode); + } + } + LastCode = CrntCode; + } + } + + Private->LastCode = LastCode; + Private->StackPtr = StackPtr; + + return GIF_OK; +} + +/****************************************************************************** + Routine to trace the Prefixes linked list until we get a prefix which is + not code, but a pixel value (less than ClearCode). Returns that pixel value. + If image is defective, we might loop here forever, so we limit the loops to + the maximum possible if image O.k. - LZ_MAX_CODE times. +******************************************************************************/ +static int +DGifGetPrefixChar(GifPrefixType *Prefix, int Code, int ClearCode) +{ + int i = 0; + + while (Code > ClearCode && i++ <= LZ_MAX_CODE) { + if (Code > LZ_MAX_CODE) { + return NO_SUCH_CODE; + } + Code = Prefix[Code]; + } + return Code; +} + +/****************************************************************************** + Interface for accessing the LZ codes directly. Set Code to the real code + (12bits), or to -1 if EOF code is returned. +******************************************************************************/ +int +DGifGetLZCodes(GifFileType *GifFile, int *Code) +{ + GifByteType *CodeBlock; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (DGifDecompressInput(GifFile, Code) == GIF_ERROR) + return GIF_ERROR; + + if (*Code == Private->EOFCode) { + /* Skip rest of codes (hopefully only NULL terminating block): */ + do { + if (DGifGetCodeNext(GifFile, &CodeBlock) == GIF_ERROR) + return GIF_ERROR; + } while (CodeBlock != NULL) ; + + *Code = -1; + } else if (*Code == Private->ClearCode) { + /* We need to start over again: */ + Private->RunningCode = Private->EOFCode + 1; + Private->RunningBits = Private->BitsPerPixel + 1; + Private->MaxCode1 = 1 << Private->RunningBits; + } + + return GIF_OK; +} + +/****************************************************************************** + The LZ decompression input routine: + This routine is responsable for the decompression of the bit stream from + 8 bits (bytes) packets, into the real codes. + Returns GIF_OK if read successfully. +******************************************************************************/ +static int +DGifDecompressInput(GifFileType *GifFile, int *Code) +{ + static const unsigned short CodeMasks[] = { + 0x0000, 0x0001, 0x0003, 0x0007, + 0x000f, 0x001f, 0x003f, 0x007f, + 0x00ff, 0x01ff, 0x03ff, 0x07ff, + 0x0fff + }; + + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + GifByteType NextByte; + + /* The image can't contain more than LZ_BITS per code. */ + if (Private->RunningBits > LZ_BITS) { + GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + + while (Private->CrntShiftState < Private->RunningBits) { + /* Needs to get more bytes from input stream for next code: */ + if (DGifBufferedInput(GifFile, Private->Buf, &NextByte) == GIF_ERROR) { + return GIF_ERROR; + } + Private->CrntShiftDWord |= + ((unsigned long)NextByte) << Private->CrntShiftState; + Private->CrntShiftState += 8; + } + *Code = Private->CrntShiftDWord & CodeMasks[Private->RunningBits]; + + Private->CrntShiftDWord >>= Private->RunningBits; + Private->CrntShiftState -= Private->RunningBits; + + /* If code cannot fit into RunningBits bits, must raise its size. Note + * however that codes above 4095 are used for special signaling. + * If we're using LZ_BITS bits already and we're at the max code, just + * keep using the table as it is, don't increment Private->RunningCode. + */ + if (Private->RunningCode < LZ_MAX_CODE + 2 && + ++Private->RunningCode > Private->MaxCode1 && + Private->RunningBits < LZ_BITS) { + Private->MaxCode1 <<= 1; + Private->RunningBits++; + } + return GIF_OK; +} + +/****************************************************************************** + This routines read one GIF data block at a time and buffers it internally + so that the decompression routine could access it. + The routine returns the next byte from its internal buffer (or read next + block in if buffer empty) and returns GIF_OK if succesful. +******************************************************************************/ +static int +DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, GifByteType *NextByte) +{ + if (Buf[0] == 0) { + /* Needs to read the next buffer - this one is empty: */ + if (READ(GifFile, Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + /* There shouldn't be any empty data blocks here as the LZW spec + * says the LZW termination code should come first. Therefore we + * shouldn't be inside this routine at that point. + */ + if (Buf[0] == 0) { + GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + /* There shouldn't be any empty data blocks here as the LZW spec + * says the LZW termination code should come first. Therefore we + * shouldn't be inside this routine at that point. + */ + if (Buf[0] == 0) { + GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + if (READ(GifFile, &Buf[1], Buf[0]) != Buf[0]) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + *NextByte = Buf[1]; + Buf[1] = 2; /* We use now the second place as last char read! */ + Buf[0]--; + } else { + *NextByte = Buf[Buf[1]++]; + Buf[0]--; + } + + return GIF_OK; +} + +/****************************************************************************** + This routine reads an entire GIF into core, hanging all its state info off + the GifFileType pointer. Call DGifOpenFileName() or DGifOpenFileHandle() + first to initialize I/O. Its inverse is EGifSpew(). + +int +DGifSlurp(GifFileType *GifFile) +{ + size_t ImageSize; + GifRecordType RecordType; + SavedImage *sp; + GifByteType *ExtData; + int ExtFunction; + + GifFile->ExtensionBlocks = NULL; + GifFile->ExtensionBlockCount = 0; + + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) + return (GIF_ERROR); + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) + return (GIF_ERROR); + + sp = &GifFile->SavedImages[GifFile->ImageCount - 1]; + if (GifFile->ExtensionBlocks) { + sp->ExtensionBlocks = GifFile->ExtensionBlocks; + sp->ExtensionBlockCount = GifFile->ExtensionBlockCount; + + GifFile->ExtensionBlocks = NULL; + GifFile->ExtensionBlockCount = 0; + } + // Allocate memory for the image + if (sp->ImageDesc.Width < 0 && sp->ImageDesc.Height < 0 && + sp->ImageDesc.Width > (INT_MAX / sp->ImageDesc.Height)) { + return GIF_ERROR; + } + ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height; + + if (ImageSize > (SIZE_MAX / sizeof(GifPixelType))) { + return GIF_ERROR; + } + sp->RasterBits = (unsigned char *)malloc(ImageSize * + sizeof(GifPixelType)); + + if (sp->RasterBits == NULL) { + return GIF_ERROR; + } + + if (sp->ImageDesc.Interlace) + { + int i, j; + // The way an interlaced image should be read - * offsets and jumps... + + int InterlacedOffset[] = { 0, 4, 2, 1 }; + int InterlacedJumps[] = { 8, 8, 4, 2 }; + // Need to perform 4 passes on the image + for (i = 0; i < 4; i++) + for (j = InterlacedOffset[i]; + j < sp->ImageDesc.Height; + j += InterlacedJumps[i]) { + if (DGifGetLine(GifFile, + sp->RasterBits+j*sp->ImageDesc.Width, + sp->ImageDesc.Width) == GIF_ERROR) + return GIF_ERROR; + } + } + else + { + if (DGifGetLine(GifFile,sp->RasterBits,ImageSize)==GIF_ERROR) + return (GIF_ERROR); + } + break; + + case EXTENSION_RECORD_TYPE: + if (DGifGetExtension(GifFile,&ExtFunction,&ExtData) == GIF_ERROR) + return (GIF_ERROR); + // Create an extension block with our data + if (GifAddExtensionBlock(&GifFile->ExtensionBlockCount, + &GifFile->ExtensionBlocks, + ExtFunction, ExtData[0], &ExtData[1]) + == GIF_ERROR) + return (GIF_ERROR); + while (ExtData != NULL) { + if (DGifGetExtensionNext(GifFile, &ExtData, &ExtFunction) == GIF_ERROR) + return (GIF_ERROR); + // Continue the extension block / + if (ExtData != NULL) + if (GifAddExtensionBlock(&GifFile->ExtensionBlockCount, + &GifFile->ExtensionBlocks, + CONTINUE_EXT_FUNC_CODE, + ExtData[0], &ExtData[1]) == GIF_ERROR) + return (GIF_ERROR); + } + break; + + case TERMINATE_RECORD_TYPE: + break; + + default: // Should be trapped by DGifGetRecordType + break; + } + } while (RecordType != TERMINATE_RECORD_TYPE); + + return (GIF_OK); +} + + end */ diff --git a/TMessagesProj/jni/giflib/gif_hash.c b/TMessagesProj/jni/giflib/gif_hash.c new file mode 100755 index 00000000..61a4d139 --- /dev/null +++ b/TMessagesProj/jni/giflib/gif_hash.c @@ -0,0 +1,132 @@ +/***************************************************************************** + +gif_hash.c -- module to support the following operations: + +1. InitHashTable - initialize hash table. +2. ClearHashTable - clear the hash table to an empty state. +2. InsertHashTable - insert one item into data structure. +3. ExistsHashTable - test if item exists in data structure. + +This module is used to hash the GIF codes during encoding. + +*****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "gif_lib.h" +#include "gif_hash.h" +#include "gif_lib_private.h" + +/* #define DEBUG_HIT_RATE Debug number of misses per hash Insert/Exists. */ + +#ifdef DEBUG_HIT_RATE +static long NumberOfTests = 0, + NumberOfMisses = 0; +#endif /* DEBUG_HIT_RATE */ + +static int KeyItem(uint32_t Item); + +/****************************************************************************** + Initialize HashTable - allocate the memory needed and clear it. * +******************************************************************************/ +GifHashTableType *_InitHashTable(void) +{ + GifHashTableType *HashTable; + + if ((HashTable = (GifHashTableType *) malloc(sizeof(GifHashTableType))) + == NULL) + return NULL; + + _ClearHashTable(HashTable); + + return HashTable; +} + +/****************************************************************************** + Routine to clear the HashTable to an empty state. * + This part is a little machine depended. Use the commented part otherwise. * +******************************************************************************/ +void _ClearHashTable(GifHashTableType *HashTable) +{ + memset(HashTable -> HTable, 0xFF, HT_SIZE * sizeof(uint32_t)); +} + +/****************************************************************************** + Routine to insert a new Item into the HashTable. The data is assumed to be * + new one. * +******************************************************************************/ +void _InsertHashTable(GifHashTableType *HashTable, uint32_t Key, int Code) +{ + int HKey = KeyItem(Key); + uint32_t *HTable = HashTable -> HTable; + +#ifdef DEBUG_HIT_RATE + NumberOfTests++; + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + + while (HT_GET_KEY(HTable[HKey]) != 0xFFFFFL) { +#ifdef DEBUG_HIT_RATE + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + HKey = (HKey + 1) & HT_KEY_MASK; + } + HTable[HKey] = HT_PUT_KEY(Key) | HT_PUT_CODE(Code); +} + +/****************************************************************************** + Routine to test if given Key exists in HashTable and if so returns its code * + Returns the Code if key was found, -1 if not. * +******************************************************************************/ +int _ExistsHashTable(GifHashTableType *HashTable, uint32_t Key) +{ + int HKey = KeyItem(Key); + uint32_t *HTable = HashTable -> HTable, HTKey; + +#ifdef DEBUG_HIT_RATE + NumberOfTests++; + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + + while ((HTKey = HT_GET_KEY(HTable[HKey])) != 0xFFFFFL) { +#ifdef DEBUG_HIT_RATE + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + if (Key == HTKey) return HT_GET_CODE(HTable[HKey]); + HKey = (HKey + 1) & HT_KEY_MASK; + } + + return -1; +} + +/****************************************************************************** + Routine to generate an HKey for the hashtable out of the given unique key. * + The given Key is assumed to be 20 bits as follows: lower 8 bits are the * + new postfix character, while the upper 12 bits are the prefix code. * + Because the average hit ratio is only 2 (2 hash references per entry), * + evaluating more complex keys (such as twin prime keys) does not worth it! * +******************************************************************************/ +static int KeyItem(uint32_t Item) +{ + return ((Item >> 12) ^ Item) & HT_KEY_MASK; +} + +#ifdef DEBUG_HIT_RATE +/****************************************************************************** + Debugging routine to print the hit ratio - number of times the hash table * + was tested per operation. This routine was used to test the KeyItem routine * +******************************************************************************/ +void HashTablePrintHitRatio(void) +{ + printf("Hash Table Hit Ratio is %ld/%ld = %ld%%.\n", + NumberOfMisses, NumberOfTests, + NumberOfMisses * 100 / NumberOfTests); +} +#endif /* DEBUG_HIT_RATE */ + +/* end */ diff --git a/TMessagesProj/jni/giflib/gif_hash.h b/TMessagesProj/jni/giflib/gif_hash.h new file mode 100755 index 00000000..ac20a43c --- /dev/null +++ b/TMessagesProj/jni/giflib/gif_hash.h @@ -0,0 +1,39 @@ +/****************************************************************************** + +gif_hash.h - magfic constants and declarations for GIF LZW + +******************************************************************************/ + +#ifndef _GIF_HASH_H_ +#define _GIF_HASH_H_ + +#include +#include + +#define HT_SIZE 8192 /* 12bits = 4096 or twice as big! */ +#define HT_KEY_MASK 0x1FFF /* 13bits keys */ +#define HT_KEY_NUM_BITS 13 /* 13bits keys */ +#define HT_MAX_KEY 8191 /* 13bits - 1, maximal code possible */ +#define HT_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ + +/* The 32 bits of the long are divided into two parts for the key & code: */ +/* 1. The code is 12 bits as our compression algorithm is limited to 12bits */ +/* 2. The key is 12 bits Prefix code + 8 bit new char or 20 bits. */ +/* The key is the upper 20 bits. The code is the lower 12. */ +#define HT_GET_KEY(l) (l >> 12) +#define HT_GET_CODE(l) (l & 0x0FFF) +#define HT_PUT_KEY(l) (l << 12) +#define HT_PUT_CODE(l) (l & 0x0FFF) + +typedef struct GifHashTableType { + uint32_t HTable[HT_SIZE]; +} GifHashTableType; + +GifHashTableType *_InitHashTable(void); +void _ClearHashTable(GifHashTableType *HashTable); +void _InsertHashTable(GifHashTableType *HashTable, uint32_t Key, int Code); +int _ExistsHashTable(GifHashTableType *HashTable, uint32_t Key); + +#endif /* _GIF_HASH_H_ */ + +/* end */ diff --git a/TMessagesProj/jni/giflib/gif_lib.h b/TMessagesProj/jni/giflib/gif_lib.h new file mode 100755 index 00000000..b7aa9301 --- /dev/null +++ b/TMessagesProj/jni/giflib/gif_lib.h @@ -0,0 +1,307 @@ +/****************************************************************************** + +gif_lib.h - service library for decoding and encoding GIF images + +*****************************************************************************/ + +#ifndef _GIF_LIB_H_ +#define _GIF_LIB_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define GIFLIB_MAJOR 5 +#define GIFLIB_MINOR 0 +#define GIFLIB_RELEASE 5 + +#define GIF_ERROR 0 +#define GIF_OK 1 + +#include +#include + +#define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */ +#define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1 +#define GIF_VERSION_POS 3 /* Version first character in stamp. */ +#define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */ +#define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */ + +typedef unsigned char GifPixelType; +typedef unsigned char *GifRowType; +typedef unsigned char GifByteType; +typedef unsigned int GifPrefixType; +typedef int GifWord; + +typedef struct GifColorType { + GifByteType Red, Green, Blue; +} GifColorType; + +typedef struct ColorMapObject { + int ColorCount; + int BitsPerPixel; + bool SortFlag; + GifColorType *Colors; /* on malloc(3) heap */ +} ColorMapObject; + +typedef struct GifImageDesc { + GifWord Left, Top, Width, Height; /* Current image dimensions. */ + bool Interlace; /* Sequential/Interlaced lines. */ + ColorMapObject *ColorMap; /* The local color map */ +} GifImageDesc; + +typedef struct ExtensionBlock { + int ByteCount; + GifByteType *Bytes; /* on malloc(3) heap */ + int Function; /* The block function code */ +#define CONTINUE_EXT_FUNC_CODE 0x00 /* continuation subblock */ +#define COMMENT_EXT_FUNC_CODE 0xfe /* comment */ +#define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control (GIF89) */ +#define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */ +#define APPLICATION_EXT_FUNC_CODE 0xff /* application block */ +} ExtensionBlock; + +typedef struct SavedImage { + GifImageDesc ImageDesc; + GifByteType *RasterBits; /* on malloc(3) heap */ + int ExtensionBlockCount; /* Count of extensions before image */ + ExtensionBlock *ExtensionBlocks; /* Extensions before image */ +} SavedImage; + +typedef struct GifFileType { + GifWord SWidth, SHeight; /* Size of virtual canvas */ + GifWord SColorResolution; /* How many colors can we generate? */ + GifWord SBackGroundColor; /* Background color for virtual canvas */ + GifByteType AspectByte; /* Used to compute pixel aspect ratio */ + ColorMapObject *SColorMap; /* Global colormap, NULL if nonexistent. */ + int ImageCount; /* Number of current image (both APIs) */ + GifImageDesc Image; /* Current image (low-level API) */ + SavedImage *SavedImages; /* Image sequence (high-level API) */ + int ExtensionBlockCount; /* Count extensions past last image */ + ExtensionBlock *ExtensionBlocks; /* Extensions past last image */ + int Error; /* Last error condition reported */ + void *UserData; /* hook to attach user data (TVT) */ + void *Private; /* Don't mess with this! */ +} GifFileType; + +#define GIF_ASPECT_RATIO(n) ((n)+15.0/64.0) + +typedef enum { + UNDEFINED_RECORD_TYPE, + SCREEN_DESC_RECORD_TYPE, + IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */ + EXTENSION_RECORD_TYPE, /* Begin with '!' */ + TERMINATE_RECORD_TYPE /* Begin with ';' */ +} GifRecordType; + +/* func type to read gif data from arbitrary sources (TVT) */ +typedef int (*InputFunc) (GifFileType *, GifByteType *, int); + +/* func type to write gif data to arbitrary targets. + * Returns count of bytes written. (MRB) + */ +typedef int (*OutputFunc) (GifFileType *, const GifByteType *, int); + +/****************************************************************************** + GIF89 structures +******************************************************************************/ + +typedef struct GraphicsControlBlock { + int DisposalMode; +#define DISPOSAL_UNSPECIFIED 0 /* No disposal specified. */ +#define DISPOSE_DO_NOT 1 /* Leave image in place */ +#define DISPOSE_BACKGROUND 2 /* Set area too background color */ +#define DISPOSE_PREVIOUS 3 /* Restore to previous content */ + bool UserInputFlag; /* User confirmation required before disposal */ + int DelayTime; /* pre-display delay in 0.01sec units */ + int TransparentColor; /* Palette index for transparency, -1 if none */ +#define NO_TRANSPARENT_COLOR -1 +} GraphicsControlBlock; + +/****************************************************************************** + GIF encoding routines +******************************************************************************/ + +/* Main entry points */ +GifFileType *EGifOpenFileName(const char *GifFileName, + const bool GifTestExistence, int *Error); +GifFileType *EGifOpenFileHandle(const int GifFileHandle, int *Error); +GifFileType *EGifOpen(void *userPtr, OutputFunc writeFunc, int *Error); +int EGifSpew(GifFileType * GifFile); +char *EGifGetGifVersion(GifFileType *GifFile); /* new in 5.x */ +int EGifCloseFile(GifFileType * GifFile); + +#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */ +#define E_GIF_ERR_WRITE_FAILED 2 +#define E_GIF_ERR_HAS_SCRN_DSCR 3 +#define E_GIF_ERR_HAS_IMAG_DSCR 4 +#define E_GIF_ERR_NO_COLOR_MAP 5 +#define E_GIF_ERR_DATA_TOO_BIG 6 +#define E_GIF_ERR_NOT_ENOUGH_MEM 7 +#define E_GIF_ERR_DISK_IS_FULL 8 +#define E_GIF_ERR_CLOSE_FAILED 9 +#define E_GIF_ERR_NOT_WRITEABLE 10 + +/* These are legacy. You probably do not want to call them directly */ +int EGifPutScreenDesc(GifFileType *GifFile, + const int GifWidth, const int GifHeight, + const int GifColorRes, + const int GifBackGround, + const ColorMapObject *GifColorMap); +int EGifPutImageDesc(GifFileType *GifFile, + const int GifLeft, const int GifTop, + const int GifWidth, const int GifHeight, + const bool GifInterlace, + const ColorMapObject *GifColorMap); +void EGifSetGifVersion(GifFileType *GifFile, const bool gif89); +int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine, + int GifLineLen); +int EGifPutPixel(GifFileType *GifFile, const GifPixelType GifPixel); +int EGifPutComment(GifFileType *GifFile, const char *GifComment); +int EGifPutExtensionLeader(GifFileType *GifFile, const int GifExtCode); +int EGifPutExtensionBlock(GifFileType *GifFile, + const int GifExtLen, const void *GifExtension); +int EGifPutExtensionTrailer(GifFileType *GifFile); +int EGifPutExtension(GifFileType *GifFile, const int GifExtCode, + const int GifExtLen, + const void *GifExtension); +int EGifPutCode(GifFileType *GifFile, int GifCodeSize, + const GifByteType *GifCodeBlock); +int EGifPutCodeNext(GifFileType *GifFile, + const GifByteType *GifCodeBlock); + +/****************************************************************************** + GIF decoding routines +******************************************************************************/ + +/* Main entry points */ +GifFileType *DGifOpenFileName(const char *GifFileName, int *Error); +GifFileType *DGifOpenFileHandle(int GifFileHandle, int *Error); +int DGifSlurp(GifFileType * GifFile); +GifFileType *DGifOpen(void *userPtr, InputFunc readFunc, int *Error); /* new one (TVT) */ +int DGifCloseFile(GifFileType * GifFile); + +#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */ +#define D_GIF_ERR_READ_FAILED 102 +#define D_GIF_ERR_NOT_GIF_FILE 103 +#define D_GIF_ERR_NO_SCRN_DSCR 104 +#define D_GIF_ERR_NO_IMAG_DSCR 105 +#define D_GIF_ERR_NO_COLOR_MAP 106 +#define D_GIF_ERR_WRONG_RECORD 107 +#define D_GIF_ERR_DATA_TOO_BIG 108 +#define D_GIF_ERR_NOT_ENOUGH_MEM 109 +#define D_GIF_ERR_CLOSE_FAILED 110 +#define D_GIF_ERR_NOT_READABLE 111 +#define D_GIF_ERR_IMAGE_DEFECT 112 +#define D_GIF_ERR_EOF_TOO_SOON 113 + +/* These are legacy. You probably do not want to call them directly */ +int DGifGetScreenDesc(GifFileType *GifFile); +int DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType); +int DGifGetImageDesc(GifFileType *GifFile, bool changeImageCount); +int DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); +int DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel); +int DGifGetComment(GifFileType *GifFile, char *GifComment); +int DGifGetExtension(GifFileType *GifFile, int *GifExtCode, + GifByteType **GifExtension); +int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension,int* ExtCode); +int DGifGetCode(GifFileType *GifFile, int *GifCodeSize, + GifByteType **GifCodeBlock); +int DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock); +int DGifGetLZCodes(GifFileType *GifFile, int *GifCode); + + +/****************************************************************************** + Color table quantization (deprecated) +******************************************************************************/ +int GifQuantizeBuffer(unsigned int Width, unsigned int Height, + int *ColorMapSize, GifByteType * RedInput, + GifByteType * GreenInput, GifByteType * BlueInput, + GifByteType * OutputBuffer, + GifColorType * OutputColorMap); + +/****************************************************************************** + Error handling and reporting. +******************************************************************************/ +extern char *GifErrorString(int ErrorCode); /* new in 2012 - ESR */ + +/***************************************************************************** + Everything below this point is new after version 1.2, supporting `slurp + mode' for doing I/O in two big belts with all the image-bashing in core. +******************************************************************************/ + +/****************************************************************************** + Color map handling from gif_alloc.c +******************************************************************************/ + +extern ColorMapObject *GifMakeMapObject(int ColorCount, + const GifColorType *ColorMap); +extern void GifFreeMapObject(ColorMapObject *Object); +extern ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1, + const ColorMapObject *ColorIn2, + GifPixelType ColorTransIn2[]); +extern int GifBitSize(int n); + +/****************************************************************************** + Support for the in-core structures allocation (slurp mode). +******************************************************************************/ + +extern void GifApplyTranslation(SavedImage *Image, GifPixelType Translation[]); +extern int GifAddExtensionBlock(int *ExtensionBlock_Count, + ExtensionBlock **ExtensionBlocks, + int Function, + unsigned int Len, unsigned char ExtData[]); +extern void GifFreeExtensions(int *ExtensionBlock_Count, + ExtensionBlock **ExtensionBlocks); +extern SavedImage *GifMakeSavedImage(GifFileType *GifFile, + const SavedImage *CopyFrom); +extern void GifFreeSavedImages(GifFileType *GifFile); + +/****************************************************************************** + 5.x functions for GIF89 graphics control blocks +******************************************************************************/ + +int DGifExtensionToGCB(const size_t GifExtensionLength, + const GifByteType *GifExtension, + GraphicsControlBlock *GCB); +size_t EGifGCBToExtension(const GraphicsControlBlock *GCB, + GifByteType *GifExtension); + +int DGifSavedExtensionToGCB(GifFileType *GifFile, + int ImageIndex, + GraphicsControlBlock *GCB); +int EGifGCBToSavedExtension(const GraphicsControlBlock *GCB, + GifFileType *GifFile, + int ImageIndex); + +/****************************************************************************** + The library's internal utility font +******************************************************************************/ + +#define GIF_FONT_WIDTH 8 +#define GIF_FONT_HEIGHT 8 +extern const unsigned char GifAsciiTable8x8[][GIF_FONT_WIDTH]; + +extern void GifDrawText8x8(SavedImage *Image, + const int x, const int y, + const char *legend, const int color); + +extern void GifDrawBox(SavedImage *Image, + const int x, const int y, + const int w, const int d, const int color); + +extern void GifDrawRectangle(SavedImage *Image, + const int x, const int y, + const int w, const int d, const int color); + +extern void GifDrawBoxedText8x8(SavedImage *Image, + const int x, const int y, + const char *legend, + const int border, const int bg, const int fg); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* _GIF_LIB_H */ + +/* end */ diff --git a/TMessagesProj/jni/giflib/gif_lib_private.h b/TMessagesProj/jni/giflib/gif_lib_private.h new file mode 100755 index 00000000..adaf5571 --- /dev/null +++ b/TMessagesProj/jni/giflib/gif_lib_private.h @@ -0,0 +1,59 @@ +/**************************************************************************** + +gif_lib_private.h - internal giflib routines and structures + +****************************************************************************/ + +#ifndef _GIF_LIB_PRIVATE_H +#define _GIF_LIB_PRIVATE_H + +#include "gif_lib.h" +#include "gif_hash.h" + +#define EXTENSION_INTRODUCER 0x21 +#define DESCRIPTOR_INTRODUCER 0x2c +#define TERMINATOR_INTRODUCER 0x3b + +#define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ +#define LZ_BITS 12 + +#define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */ +#define FIRST_CODE 4097 /* Impossible code, to signal first. */ +#define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */ + +#define FILE_STATE_WRITE 0x01 +#define FILE_STATE_SCREEN 0x02 +#define FILE_STATE_IMAGE 0x04 +#define FILE_STATE_READ 0x08 + +#define IS_READABLE(Private) (Private->FileState & FILE_STATE_READ) +#define IS_WRITEABLE(Private) (Private->FileState & FILE_STATE_WRITE) + +typedef struct GifFilePrivateType { + GifWord FileState, FileHandle, /* Where all this data goes to! */ + BitsPerPixel, /* Bits per pixel (Codes uses at least this + 1). */ + ClearCode, /* The CLEAR LZ code. */ + EOFCode, /* The EOF LZ code. */ + RunningCode, /* The next code algorithm can generate. */ + RunningBits, /* The number of bits required to represent RunningCode. */ + MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */ + LastCode, /* The code before the current code. */ + CrntCode, /* Current algorithm code. */ + StackPtr, /* For character stack (see below). */ + CrntShiftState; /* Number of bits in CrntShiftDWord. */ + unsigned long CrntShiftDWord; /* For bytes decomposition into codes. */ + unsigned long PixelCount; /* Number of pixels in image. */ + FILE *File; /* File as stream. */ + InputFunc Read; /* function to read gif input (TVT) */ + OutputFunc Write; /* function to write gif output (MRB) */ + GifByteType Buf[256]; /* Compressed input is buffered here. */ + GifByteType Stack[LZ_MAX_CODE]; /* Decoded pixels are stacked here. */ + GifByteType Suffix[LZ_MAX_CODE + 1]; /* So we can trace the codes. */ + GifPrefixType Prefix[LZ_MAX_CODE + 1]; + GifHashTableType *HashTable; + bool gif89; +} GifFilePrivateType; + +#endif /* _GIF_LIB_PRIVATE_H */ + +/* end */ diff --git a/TMessagesProj/jni/giflib/gifalloc.c b/TMessagesProj/jni/giflib/gifalloc.c new file mode 100755 index 00000000..5726e768 --- /dev/null +++ b/TMessagesProj/jni/giflib/gifalloc.c @@ -0,0 +1,400 @@ +/***************************************************************************** + + GIF construction tools + +****************************************************************************/ + +#include +#include +#include + +#include "gif_lib.h" + +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) + +/****************************************************************************** + Miscellaneous utility functions +******************************************************************************/ + +/* return smallest bitfield size n will fit in */ +int +GifBitSize(int n) +{ + register int i; + + for (i = 1; i <= 8; i++) + if ((1 << i) >= n) + break; + return (i); +} + +/****************************************************************************** + Color map object functions +******************************************************************************/ + +/* + * Allocate a color map of given size; initialize with contents of + * ColorMap if that pointer is non-NULL. + */ +ColorMapObject * +GifMakeMapObject(int ColorCount, const GifColorType *ColorMap) +{ + ColorMapObject *Object; + + /*** FIXME: Our ColorCount has to be a power of two. Is it necessary to + * make the user know that or should we automatically round up instead? */ + if (ColorCount != (1 << GifBitSize(ColorCount))) { + return ((ColorMapObject *) NULL); + } + + Object = (ColorMapObject *)malloc(sizeof(ColorMapObject)); + if (Object == (ColorMapObject *) NULL) { + return ((ColorMapObject *) NULL); + } + + Object->Colors = (GifColorType *)calloc(ColorCount, sizeof(GifColorType)); + if (Object->Colors == (GifColorType *) NULL) { + free(Object); + return ((ColorMapObject *) NULL); + } + + Object->ColorCount = ColorCount; + Object->BitsPerPixel = GifBitSize(ColorCount); + + if (ColorMap != NULL) { + memcpy((char *)Object->Colors, + (char *)ColorMap, ColorCount * sizeof(GifColorType)); + } + + return (Object); +} + +/******************************************************************************* +Free a color map object +*******************************************************************************/ +void +GifFreeMapObject(ColorMapObject *Object) +{ + if (Object != NULL) { + (void)free(Object->Colors); + (void)free(Object); + } +} + +#ifdef DEBUG +void +DumpColorMap(ColorMapObject *Object, + FILE * fp) +{ + if (Object != NULL) { + int i, j, Len = Object->ColorCount; + + for (i = 0; i < Len; i += 4) { + for (j = 0; j < 4 && j < Len; j++) { + (void)fprintf(fp, "%3d: %02x %02x %02x ", i + j, + Object->Colors[i + j].Red, + Object->Colors[i + j].Green, + Object->Colors[i + j].Blue); + } + (void)fprintf(fp, "\n"); + } + } +} +#endif /* DEBUG */ + +/******************************************************************************* + Compute the union of two given color maps and return it. If result can't + fit into 256 colors, NULL is returned, the allocated union otherwise. + ColorIn1 is copied as is to ColorUnion, while colors from ColorIn2 are + copied iff they didn't exist before. ColorTransIn2 maps the old + ColorIn2 into the ColorUnion color map table./ +*******************************************************************************/ +ColorMapObject * +GifUnionColorMap(const ColorMapObject *ColorIn1, + const ColorMapObject *ColorIn2, + GifPixelType ColorTransIn2[]) +{ + int i, j, CrntSlot, RoundUpTo, NewGifBitSize; + ColorMapObject *ColorUnion; + + /* + * We don't worry about duplicates within either color map; if + * the caller wants to resolve those, he can perform unions + * with an empty color map. + */ + + /* Allocate table which will hold the result for sure. */ + ColorUnion = GifMakeMapObject(MAX(ColorIn1->ColorCount, + ColorIn2->ColorCount) * 2, NULL); + + if (ColorUnion == NULL) + return (NULL); + + /* + * Copy ColorIn1 to ColorUnion. + */ + for (i = 0; i < ColorIn1->ColorCount; i++) + ColorUnion->Colors[i] = ColorIn1->Colors[i]; + CrntSlot = ColorIn1->ColorCount; + + /* + * Potentially obnoxious hack: + * + * Back CrntSlot down past all contiguous {0, 0, 0} slots at the end + * of table 1. This is very useful if your display is limited to + * 16 colors. + */ + while (ColorIn1->Colors[CrntSlot - 1].Red == 0 + && ColorIn1->Colors[CrntSlot - 1].Green == 0 + && ColorIn1->Colors[CrntSlot - 1].Blue == 0) + CrntSlot--; + + /* Copy ColorIn2 to ColorUnion (use old colors if they exist): */ + for (i = 0; i < ColorIn2->ColorCount && CrntSlot <= 256; i++) { + /* Let's see if this color already exists: */ + for (j = 0; j < ColorIn1->ColorCount; j++) + if (memcmp (&ColorIn1->Colors[j], &ColorIn2->Colors[i], + sizeof(GifColorType)) == 0) + break; + + if (j < ColorIn1->ColorCount) + ColorTransIn2[i] = j; /* color exists in Color1 */ + else { + /* Color is new - copy it to a new slot: */ + ColorUnion->Colors[CrntSlot] = ColorIn2->Colors[i]; + ColorTransIn2[i] = CrntSlot++; + } + } + + if (CrntSlot > 256) { + GifFreeMapObject(ColorUnion); + return ((ColorMapObject *) NULL); + } + + NewGifBitSize = GifBitSize(CrntSlot); + RoundUpTo = (1 << NewGifBitSize); + + if (RoundUpTo != ColorUnion->ColorCount) { + register GifColorType *Map = ColorUnion->Colors; + + /* + * Zero out slots up to next power of 2. + * We know these slots exist because of the way ColorUnion's + * start dimension was computed. + */ + for (j = CrntSlot; j < RoundUpTo; j++) + Map[j].Red = Map[j].Green = Map[j].Blue = 0; + + /* perhaps we can shrink the map? */ + if (RoundUpTo < ColorUnion->ColorCount) + ColorUnion->Colors = (GifColorType *)realloc(Map, + sizeof(GifColorType) * RoundUpTo); + } + + ColorUnion->ColorCount = RoundUpTo; + ColorUnion->BitsPerPixel = NewGifBitSize; + + return (ColorUnion); +} + +/******************************************************************************* + Apply a given color translation to the raster bits of an image +*******************************************************************************/ +void +GifApplyTranslation(SavedImage *Image, GifPixelType Translation[]) +{ + register int i; + register int RasterSize = Image->ImageDesc.Height * Image->ImageDesc.Width; + + for (i = 0; i < RasterSize; i++) + Image->RasterBits[i] = Translation[Image->RasterBits[i]]; +} + +/****************************************************************************** + Extension record functions +******************************************************************************/ +int +GifAddExtensionBlock(int *ExtensionBlockCount, + ExtensionBlock **ExtensionBlocks, + int Function, + unsigned int Len, + unsigned char ExtData[]) +{ + ExtensionBlock *ep; + + if (*ExtensionBlocks == NULL) + *ExtensionBlocks=(ExtensionBlock *)malloc(sizeof(ExtensionBlock)); + else + *ExtensionBlocks = (ExtensionBlock *)realloc(*ExtensionBlocks, + sizeof(ExtensionBlock) * + (*ExtensionBlockCount + 1)); + + if (*ExtensionBlocks == NULL) + return (GIF_ERROR); + + ep = &(*ExtensionBlocks)[(*ExtensionBlockCount)++]; + + ep->Function = Function; + ep->ByteCount=Len; + ep->Bytes = (GifByteType *)malloc(ep->ByteCount); + if (ep->Bytes == NULL) + return (GIF_ERROR); + + if (ExtData != NULL) { + memcpy(ep->Bytes, ExtData, Len); + } + + return (GIF_OK); +} + +void +GifFreeExtensions(int *ExtensionBlockCount, + ExtensionBlock **ExtensionBlocks) +{ + ExtensionBlock *ep; + + if (*ExtensionBlocks == NULL) + return; + + for (ep = *ExtensionBlocks; + ep < (*ExtensionBlocks + *ExtensionBlockCount); + ep++) + (void)free((char *)ep->Bytes); + (void)free((char *)*ExtensionBlocks); + *ExtensionBlocks = NULL; + *ExtensionBlockCount = 0; +} + +/****************************************************************************** + Image block allocation functions +******************************************************************************/ + +/* Private Function: + * Frees the last image in the GifFile->SavedImages array + */ +void +FreeLastSavedImage(GifFileType *GifFile) +{ + SavedImage *sp; + + if ((GifFile == NULL) || (GifFile->SavedImages == NULL)) + return; + + /* Remove one SavedImage from the GifFile */ + GifFile->ImageCount--; + sp = &GifFile->SavedImages[GifFile->ImageCount]; + + /* Deallocate its Colormap */ + if (sp->ImageDesc.ColorMap != NULL) { + GifFreeMapObject(sp->ImageDesc.ColorMap); + sp->ImageDesc.ColorMap = NULL; + } + + /* Deallocate the image data */ + if (sp->RasterBits != NULL) + free((char *)sp->RasterBits); + + /* Deallocate any extensions */ + GifFreeExtensions(&sp->ExtensionBlockCount, &sp->ExtensionBlocks); + + /*** FIXME: We could realloc the GifFile->SavedImages structure but is + * there a point to it? Saves some memory but we'd have to do it every + * time. If this is used in GifFreeSavedImages then it would be inefficient + * (The whole array is going to be deallocated.) If we just use it when + * we want to free the last Image it's convenient to do it here. + */ +} + +/* + * Append an image block to the SavedImages array + */ +SavedImage * +GifMakeSavedImage(GifFileType *GifFile, const SavedImage *CopyFrom) +{ + if (GifFile->SavedImages == NULL) + GifFile->SavedImages = (SavedImage *)malloc(sizeof(SavedImage)); + else + GifFile->SavedImages = (SavedImage *)realloc(GifFile->SavedImages, + sizeof(SavedImage) * (GifFile->ImageCount + 1)); + + if (GifFile->SavedImages == NULL) + return ((SavedImage *)NULL); + else { + SavedImage *sp = &GifFile->SavedImages[GifFile->ImageCount++]; + memset((char *)sp, '\0', sizeof(SavedImage)); + + if (CopyFrom != NULL) { + memcpy((char *)sp, CopyFrom, sizeof(SavedImage)); + + /* + * Make our own allocated copies of the heap fields in the + * copied record. This guards against potential aliasing + * problems. + */ + + /* first, the local color map */ + if (sp->ImageDesc.ColorMap != NULL) { + sp->ImageDesc.ColorMap = GifMakeMapObject( + CopyFrom->ImageDesc.ColorMap->ColorCount, + CopyFrom->ImageDesc.ColorMap->Colors); + if (sp->ImageDesc.ColorMap == NULL) { + FreeLastSavedImage(GifFile); + return (SavedImage *)(NULL); + } + } + + /* next, the raster */ + sp->RasterBits = (unsigned char *)malloc(sizeof(GifPixelType) * + CopyFrom->ImageDesc.Height * + CopyFrom->ImageDesc.Width); + if (sp->RasterBits == NULL) { + FreeLastSavedImage(GifFile); + return (SavedImage *)(NULL); + } + memcpy(sp->RasterBits, CopyFrom->RasterBits, + sizeof(GifPixelType) * CopyFrom->ImageDesc.Height * + CopyFrom->ImageDesc.Width); + + /* finally, the extension blocks */ + if (sp->ExtensionBlocks != NULL) { + sp->ExtensionBlocks = (ExtensionBlock *)malloc( + sizeof(ExtensionBlock) * + CopyFrom->ExtensionBlockCount); + if (sp->ExtensionBlocks == NULL) { + FreeLastSavedImage(GifFile); + return (SavedImage *)(NULL); + } + memcpy(sp->ExtensionBlocks, CopyFrom->ExtensionBlocks, + sizeof(ExtensionBlock) * CopyFrom->ExtensionBlockCount); + } + } + + return (sp); + } +} + +void +GifFreeSavedImages(GifFileType *GifFile) +{ + SavedImage *sp; + + if ((GifFile == NULL) || (GifFile->SavedImages == NULL)) { + return; + } + for (sp = GifFile->SavedImages; + sp < GifFile->SavedImages + GifFile->ImageCount; sp++) { + if (sp->ImageDesc.ColorMap != NULL) { + GifFreeMapObject(sp->ImageDesc.ColorMap); + sp->ImageDesc.ColorMap = NULL; + } + + if (sp->RasterBits != NULL) + free((char *)sp->RasterBits); + + GifFreeExtensions(&sp->ExtensionBlockCount, &sp->ExtensionBlocks); + } + free((char *)GifFile->SavedImages); + GifFile->SavedImages = NULL; +} + +/* end */ diff --git a/TMessagesProj/jni/jni.c b/TMessagesProj/jni/jni.c index 452ac5b5..1952cade 100644 --- a/TMessagesProj/jni/jni.c +++ b/TMessagesProj/jni/jni.c @@ -3,9 +3,34 @@ #include #include #include -#include -#include "aes.h" -#include "log.h" +#include +#include "aes/aes.h" +#include "utils.h" +#include "sqlite.h" +#include "gif.h" + +jint JNI_OnLoad(JavaVM *vm, void *reserved) { + JNIEnv *env = 0; + srand(time(NULL)); + + if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_6) != JNI_OK) { + return -1; + } + + if (sqliteOnJNILoad(vm, reserved, env) == -1) { + return -1; + } + + if (gifOnJNILoad(vm, reserved, env) == -1) { + return -1; + } + + return JNI_VERSION_1_6; +} + +void JNI_OnUnload(JavaVM *vm, void *reserved) { + gifOnJNIUnload(vm, reserved); +} JNIEXPORT jbyteArray Java_org_telegram_messenger_Utilities_aesIgeEncryption(JNIEnv *env, jclass class, jbyteArray _what, jbyteArray _key, jbyteArray _iv, jboolean encrypt, jboolean changeIv, jint l) { unsigned char *what = (unsigned char *)(*env)->GetByteArrayElements(env, _what, NULL); diff --git a/TMessagesProj/jni/org_telegram_SQLite.h b/TMessagesProj/jni/org_telegram_SQLite.h deleted file mode 100755 index 442aabaa..00000000 --- a/TMessagesProj/jni/org_telegram_SQLite.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __SQLITE_H__ -#define __SQLITE_H__ - -#include -#include "sqlite3.h" - -void throw_sqlite3_exception(JNIEnv* env, sqlite3 *handle, int errcode); - -#endif diff --git a/TMessagesProj/jni/org_telegram_SQLite.c b/TMessagesProj/jni/sqlite.c similarity index 85% rename from TMessagesProj/jni/org_telegram_SQLite.c rename to TMessagesProj/jni/sqlite.c index 4929049a..124b3df2 100755 --- a/TMessagesProj/jni/org_telegram_SQLite.c +++ b/TMessagesProj/jni/sqlite.c @@ -1,5 +1,5 @@ -#include "sqlite3.h" -#include "org_telegram_SQLite.h" +#include "sqlite/sqlite3.h" +#include "sqlite.h" void throw_sqlite3_exception(JNIEnv *env, sqlite3 *handle, int errcode) { if (SQLITE_OK == errcode) { diff --git a/TMessagesProj/jni/sqlite.h b/TMessagesProj/jni/sqlite.h new file mode 100755 index 00000000..af19fcb8 --- /dev/null +++ b/TMessagesProj/jni/sqlite.h @@ -0,0 +1,10 @@ +#ifndef sqlite_h +#define sqlite_h + +#include +#include "sqlite/sqlite3.h" + +void throw_sqlite3_exception(JNIEnv* env, sqlite3 *handle, int errcode); +jint sqliteOnJNILoad(JavaVM *vm, void *reserved, JNIEnv *env); + +#endif diff --git a/TMessagesProj/jni/sqlite3.c b/TMessagesProj/jni/sqlite/sqlite3.c similarity index 100% rename from TMessagesProj/jni/sqlite3.c rename to TMessagesProj/jni/sqlite/sqlite3.c diff --git a/TMessagesProj/jni/sqlite3.h b/TMessagesProj/jni/sqlite/sqlite3.h similarity index 100% rename from TMessagesProj/jni/sqlite3.h rename to TMessagesProj/jni/sqlite/sqlite3.h diff --git a/TMessagesProj/jni/org_telegram_SQLite_SQLiteCursor.c b/TMessagesProj/jni/sqlite_cursor.c similarity index 98% rename from TMessagesProj/jni/org_telegram_SQLite_SQLiteCursor.c rename to TMessagesProj/jni/sqlite_cursor.c index 5f0fd98f..655876d9 100755 --- a/TMessagesProj/jni/org_telegram_SQLite_SQLiteCursor.c +++ b/TMessagesProj/jni/sqlite_cursor.c @@ -1,4 +1,4 @@ -#include "org_telegram_SQLite.h" +#include "sqlite.h" int Java_org_telegram_SQLite_SQLiteCursor_columnType(JNIEnv *env, jobject object, int statementHandle, int columnIndex) { sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle; diff --git a/TMessagesProj/jni/org_telegram_SQLite_SQLiteDatabase.c b/TMessagesProj/jni/sqlite_database.c similarity index 97% rename from TMessagesProj/jni/org_telegram_SQLite_SQLiteDatabase.c rename to TMessagesProj/jni/sqlite_database.c index 9cbf2078..a249cff4 100755 --- a/TMessagesProj/jni/org_telegram_SQLite_SQLiteDatabase.c +++ b/TMessagesProj/jni/sqlite_database.c @@ -1,4 +1,4 @@ -#include "org_telegram_SQLite.h" +#include "sqlite.h" void Java_org_telegram_SQLite_SQLiteDatabase_closedb(JNIEnv *env, jobject object, int sqliteHandle) { sqlite3 *handle = (sqlite3 *)sqliteHandle; diff --git a/TMessagesProj/jni/org_telegram_SQLite_SQLitePreparedStatement.c b/TMessagesProj/jni/sqlite_statement.c similarity index 94% rename from TMessagesProj/jni/org_telegram_SQLite_SQLitePreparedStatement.c rename to TMessagesProj/jni/sqlite_statement.c index bd115f1a..8f5e2e5e 100755 --- a/TMessagesProj/jni/org_telegram_SQLite_SQLitePreparedStatement.c +++ b/TMessagesProj/jni/sqlite_statement.c @@ -1,21 +1,11 @@ -#include -#include -#include "org_telegram_SQLite.h" +#include "sqlite.h" jfieldID queryArgsCountField; -jint JNI_OnLoad(JavaVM *vm, void *reserved) { - JNIEnv* env = 0; - srand(time(NULL)); - - if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) { - return -1; - } - +jint sqliteOnJNILoad(JavaVM *vm, void *reserved, JNIEnv *env) { jclass class = (*env)->FindClass(env, "org/telegram/SQLite/SQLitePreparedStatement"); queryArgsCountField = (*env)->GetFieldID(env, class, "queryArgsCount", "I"); - - return JNI_VERSION_1_4; + return JNI_VERSION_1_6; } int Java_org_telegram_SQLite_SQLitePreparedStatement_step(JNIEnv* env, jobject object, int statementHandle) { diff --git a/TMessagesProj/jni/log.h b/TMessagesProj/jni/utils.h similarity index 77% rename from TMessagesProj/jni/log.h rename to TMessagesProj/jni/utils.h index 50d37155..49885b99 100644 --- a/TMessagesProj/jni/log.h +++ b/TMessagesProj/jni/utils.h @@ -9,4 +9,11 @@ #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__) +#ifndef max +#define max(x, y) ((x) > (y)) ? (x) : (y) +#endif +#ifndef min +#define min(x, y) ((x) < (y)) ? (x) : (y) +#endif + #endif diff --git a/TMessagesProj/jni/video.c b/TMessagesProj/jni/video.c deleted file mode 100644 index b86bb218..00000000 --- a/TMessagesProj/jni/video.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include "video.h" - -JNIEXPORT void Java_org_telegram_messenger_VideoTools_initialize(JNIEnv* env, jclass class) { - av_register_all(); -} - -JNIEXPORT void Java_org_telegram_messenger_VideoTools_convert(JNIEnv* env, jclass class, jstring in, jstring out, int bitr) { - char const *in_str = (*env)->GetStringUTFChars(env, in, 0); - char const *out_str = (*env)->GetStringUTFChars(env, out, 0); - convertFile(in_str, out_str, bitr); - if (in_str != 0) { - (*env)->ReleaseStringUTFChars(env, in, in_str); - } - if (out_str != 0) { - (*env)->ReleaseStringUTFChars(env, out, out_str); - } -} diff --git a/TMessagesProj/jni/video.h b/TMessagesProj/jni/video.h deleted file mode 100644 index cacae352..00000000 --- a/TMessagesProj/jni/video.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef video_h -#define video_h - -#include - -int prepare_for_video_conversion(const char *dst_filename, AVCodecContext *video_dec_ctx, AVCodecContext *audio_dec_ctx, AVFormatContext *fmt_ctx, AVStream *src_video_stream, AVStream *src_audio_stream, int bitr); -int write_video_frame(AVFrame *src_frame); -int write_audio_frame(AVFrame *src_frame, AVCodecContext *src_codec); -void post_video_conversion(); -void cleanup_out(); -void onError(); -void onProgress(); -void onDone(); - -void convertFile(const char *src_filename, const char *dst_filename, int bitr); - -#endif diff --git a/TMessagesProj/jni/video_audio_in.c b/TMessagesProj/jni/video_audio_in.c deleted file mode 100644 index 37a4ab37..00000000 --- a/TMessagesProj/jni/video_audio_in.c +++ /dev/null @@ -1,243 +0,0 @@ -#include "video.h" -#include -#include -#include -#include "log.h" - -AVPacket pkt; -int video_stream_idx = -1, audio_stream_idx = -1; -AVCodecContext *video_dec_ctx = NULL, *audio_dec_ctx = NULL; -AVFrame *frame = NULL; -AVStream *video_stream = NULL, *audio_stream = NULL; -AVFormatContext *fmt_ctx = NULL; -int64_t total_duration; -int64_t current_duration; -char *src = NULL; -char *dest = NULL; -int lastLog = 10; - -void cleanup_in() { - if (video_dec_ctx) { - avcodec_close(video_dec_ctx); - video_dec_ctx = NULL; - } - if (audio_dec_ctx) { - avcodec_close(audio_dec_ctx); - audio_dec_ctx = NULL; - } - if (fmt_ctx) { - avformat_close_input(&fmt_ctx); - fmt_ctx = NULL; - } - if (frame) { - av_frame_free(&frame); - frame = NULL; - } - if (src) { - free(src); - src = NULL; - } - if (dest) { - free(dest); - dest = NULL; - } - - total_duration = 0; - current_duration = 0; - video_stream_idx = -1; - audio_stream_idx = -1; - video_stream = NULL; - audio_stream = NULL; - lastLog = 10; -} - -void onError() { - cleanup_in(); - cleanup_out(); -} - -void onDone() { - LOGD("OK\n"); - cleanup_in(); - cleanup_out(); -} - -void onProgress() { - float progress = (float)current_duration / (float)total_duration * 100; - if (progress > lastLog) { - lastLog += 10; - LOGD("progress %.2f\n", progress); - } -} - -int open_codec_context(int *stream_idx, AVFormatContext *fmt_ctx, enum AVMediaType type) { - int ret; - AVStream *st; - AVCodecContext *dec_ctx = NULL; - AVCodec *dec = NULL; - AVDictionary *opts = NULL; - - ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0); - if (ret < 0) { - LOGD("Could not find %s stream in input file\n", av_get_media_type_string(type)); - return ret; - } else { - *stream_idx = ret; - st = fmt_ctx->streams[*stream_idx]; - - dec_ctx = st->codec; - dec = avcodec_find_decoder(dec_ctx->codec_id); - if (!dec) { - LOGD("Failed to find %s codec\n", av_get_media_type_string(type)); - return ret; - } - - av_dict_set(&opts, "refcounted_frames", "1", 0); - if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) { - LOGD("Failed to open %s codec\n", av_get_media_type_string(type)); - return ret; - } - } - - return 0; -} - -int decode_packet(int *got_frame, int cached) { - int ret = 0; - int decoded = pkt.size; - - *got_frame = 0; - - if (pkt.stream_index == video_stream_idx) { - ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt); - if (ret < 0) { - LOGD("Error decoding video frame\n"); - return ret; - } - - if (*got_frame) { - ret = write_video_frame(frame); - if (ret < 0) { - return ret; - } - } - } else if (pkt.stream_index == audio_stream_idx) { - ret = avcodec_decode_audio4(audio_dec_ctx, frame, got_frame, &pkt); - - if (ret < 0) { - LOGD("Error decoding audio frame\n"); - return ret; - } - decoded = FFMIN(ret, pkt.size); - - if (*got_frame) { - ret = write_audio_frame(frame, audio_dec_ctx); - if (ret < 0) { - return -1; - } - } - frame->pts = AV_NOPTS_VALUE; - } - - if (*got_frame) { - av_frame_unref(frame); - } - - return decoded; -} - -void convertFile(const char *src_filename, const char *dst_filename, int bitr) { - int ret = 0; - int got_frame; - - src = malloc(strlen(src_filename) + 1); - memcpy(src, src_filename, strlen(src_filename)); - src[strlen(src_filename)] = '\0'; - dest = malloc(strlen(dst_filename) + 1); - memcpy(dest, dst_filename, strlen(dst_filename)); - dest[strlen(dst_filename)] = '\0'; - - if ((ret = avformat_open_input(&fmt_ctx, src, NULL, NULL)) < 0) { - LOGD("Could not open source file %s, %s\n", src, av_err2str(ret)); - onError(); - return; - } - - if (avformat_find_stream_info(fmt_ctx, NULL) < 0) { - LOGD("Could not find stream information\n"); - onError(); - return; - } - - if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) { - video_stream = fmt_ctx->streams[video_stream_idx]; - video_dec_ctx = video_stream->codec; - } - - if (open_codec_context(&audio_stream_idx, fmt_ctx, AVMEDIA_TYPE_AUDIO) >= 0) { - audio_stream = fmt_ctx->streams[audio_stream_idx]; - audio_dec_ctx = audio_stream->codec; - } - - av_dump_format(fmt_ctx, 0, src, 0); - - if (!audio_stream && !video_stream) { - LOGD("Could not find audio or video stream in the input, aborting\n"); - onError(); - return; - } - - frame = av_frame_alloc(); - if (!frame) { - LOGD("Could not allocate frame\n"); - onError(); - return; - } - - av_init_packet(&pkt); - pkt.data = NULL; - pkt.size = 0; - - if (video_stream) { - LOGD("Demuxing video from file '%s'\n", src); - } - if (audio_stream) { - LOGD("Demuxing audio from file '%s'\n", src); - } - - ret = prepare_for_video_conversion(dest, video_dec_ctx, audio_dec_ctx, fmt_ctx, video_stream, audio_stream, bitr); - if (ret < 0) { - return; - } - if (video_stream) { - total_duration = video_stream->duration; - } - if (audio_stream) { - total_duration += audio_stream->duration; - } - - while (av_read_frame(fmt_ctx, &pkt) >= 0) { - AVPacket orig_pkt = pkt; - do { - ret = decode_packet(&got_frame, 0); - if (ret < 0) { - onError(); - return; - } - pkt.data += ret; - pkt.size -= ret; - current_duration += pkt.duration; - onProgress(); - } while (pkt.size > 0); - av_free_packet(&orig_pkt); - } - - pkt.data = NULL; - pkt.size = 0; - do { - decode_packet(&got_frame, 1); - } while (got_frame); - - post_video_conversion(); - onDone(); -} diff --git a/TMessagesProj/jni/video_audio_out.c b/TMessagesProj/jni/video_audio_out.c deleted file mode 100644 index 15d046bb..00000000 --- a/TMessagesProj/jni/video_audio_out.c +++ /dev/null @@ -1,366 +0,0 @@ -#include "video.h" -#include -#include -#include -#include -#include "log.h" - -AVFrame *out_frame = NULL; -struct SwsContext *sws_ctx = NULL; -AVStream *video_st = NULL, *audio_st = NULL; -AVFormatContext *oc = NULL; -AVOutputFormat *fmt = NULL; -AVPicture dst_picture; - -uint8_t **dst_samples_data = NULL; -SwrContext *swr_ctx = NULL; - -int current_n_out = 0; -int current_in_buff = 0; -uint8_t buff[4096 * 2]; - -int min(int val1, int val2) { - return val1 < val2 ? val1 : val2; -} - -int prepare_for_video_conversion(const char *dst_filename, AVCodecContext *video_dec_ctx, AVCodecContext *audio_dec_ctx, AVFormatContext *fmt_ctx, AVStream *src_video_stream, AVStream *src_audio_stream, int bitr) { - - if (!video_dec_ctx && !audio_dec_ctx) { - onError(); - return -1; - } - - avformat_alloc_output_context2(&oc, NULL, "mp4", dst_filename); - if (!oc) { - onError(); - return -1; - } - fmt = oc->oformat; - av_dict_copy(&oc->metadata, fmt_ctx->metadata, 0); - - int ret = 0; - if (!(fmt->flags & AVFMT_NOFILE)) { - ret = avio_open(&oc->pb, dst_filename, AVIO_FLAG_WRITE); - if (ret < 0) { - LOGD("Could not open '%s': %s\n", dst_filename, av_err2str(ret)); - onError(); - return -1; - } - } - - AVCodecContext *c; - - if (video_dec_ctx && src_video_stream && fmt_ctx) { - //calculate video resolution - int dst_width = video_dec_ctx->width, dst_height = video_dec_ctx->height; - if (video_dec_ctx->width > video_dec_ctx->height) { - if (video_dec_ctx->width > 480) { - float scale = video_dec_ctx->width / 480.0f; - dst_width = 480; - dst_height = ceilf(video_dec_ctx->height / scale); - } - } else { - if (video_dec_ctx->width > 480) { - float scale = video_dec_ctx->height / 480.0f; - dst_height = 480; - dst_width = ceilf(video_dec_ctx->width / scale); - } - } - if (video_dec_ctx->height != dst_height || video_dec_ctx->width != dst_width || video_dec_ctx->pix_fmt != AV_PIX_FMT_YUV420P) { - sws_ctx = sws_getContext(video_dec_ctx->width, video_dec_ctx->height, video_dec_ctx->pix_fmt, dst_width, dst_height, AV_PIX_FMT_YUV420P, SWS_BILINEAR, NULL, NULL, NULL); - if (!sws_ctx) { - LOGD("Could not initialize the conversion context\n"); - onError(); - return -1; - } - } - - //create video stream - AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_MPEG4); - if (!codec) { - LOGD("Could not find encoder for '%s'\n", avcodec_get_name(AV_CODEC_ID_MPEG4)); - onError(); - return -1; - } - - video_st = avformat_new_stream(oc, codec); - if (!video_st) { - LOGD("Could not allocate stream\n"); - onError(); - return -1; - } - video_st->id = oc->nb_streams - 1; - av_dict_copy(&video_st->metadata, src_video_stream->metadata, 0); - c = video_st->codec; - c->codec_id = AV_CODEC_ID_MPEG4; - c->bit_rate = bitr; - c->width = dst_width; - c->height = dst_height; - double fps = (double)src_video_stream->avg_frame_rate.num / (double)src_video_stream->avg_frame_rate.den; - c->time_base.den = 65535; - c->time_base.num = floor(65635 / fps); - c->gop_size = 12; - c->pix_fmt = AV_PIX_FMT_YUV420P; - - if (oc->oformat->flags & AVFMT_GLOBALHEADER) { - c->flags |= CODEC_FLAG_GLOBAL_HEADER; - } - - ret = avcodec_open2(c, codec, NULL); - if (ret < 0) { - LOGD("Could not open video codec: %s\n", av_err2str(ret)); - onError(); - return -1; - } - - out_frame = avcodec_alloc_frame(); - if (!out_frame) { - LOGD("Could not allocate video frame\n"); - onError(); - return -1; - } - - ret = avpicture_alloc(&dst_picture, c->pix_fmt, c->width, c->height); - if (ret < 0) { - LOGD("Could not allocate picture: %s\n", av_err2str(ret)); - onError(); - return -1; - } - - *((AVPicture *)out_frame) = dst_picture; - } - - //create audio stream - if (audio_dec_ctx && src_audio_stream) { - AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_AAC); - if (!codec) { - LOGD("Could not find encoder for '%s'\n", avcodec_get_name(AV_CODEC_ID_AAC)); - onError(); - return -1; - } - - audio_st = avformat_new_stream(oc, codec); - if (!audio_st) { - LOGD("Could not allocate stream\n"); - onError(); - return -1; - } - audio_st->id = oc->nb_streams - 1; - av_dict_copy(&audio_st->metadata, src_audio_stream->metadata, 0); - c = audio_st->codec; - c->sample_fmt = AV_SAMPLE_FMT_FLTP; - c->bit_rate = 40000; - c->sample_rate = min(audio_dec_ctx->sample_rate, 44100); - c->channels = 1; - - if (oc->oformat->flags & AVFMT_GLOBALHEADER) { - c->flags |= CODEC_FLAG_GLOBAL_HEADER; - } - - c = audio_st->codec; - c->strict_std_compliance = -2; - - swr_ctx = swr_alloc_set_opts(NULL, AV_CH_LAYOUT_MONO, c->sample_fmt, c->sample_rate, audio_dec_ctx->channel_layout, audio_dec_ctx->sample_fmt, audio_dec_ctx->sample_rate, 0, NULL); - if (!swr_ctx) { - LOGD("Could not allocate resampler context\n"); - onError(); - return -1; - } - - if ((ret = swr_init(swr_ctx)) < 0) { - LOGD("Failed to initialize the resampling context\n"); - onError(); - return -1; - } - - ret = avcodec_open2(c, codec, NULL); - if (ret < 0) { - LOGD("Could not open audio codec: %s\n", av_err2str(ret)); - onError(); - return -1; - } - - av_dump_format(oc, 0, dst_filename, 1); - - ret = avformat_write_header(oc, NULL); - if (ret < 0) { - LOGD("Error occurred when opening output file: %s\n", av_err2str(ret)); - onError(); - return -1; - } - - if (out_frame) { - out_frame->pts = 0; - } - } - return 0; -} - -void cleanup_out() { - if (video_st) { - avcodec_close(video_st->codec); - if (dst_picture.data) { - av_free(dst_picture.data[0]); - } - if (out_frame) { - av_free(out_frame); - out_frame = NULL; - } - video_st = NULL; - } - if (audio_st) { - avcodec_close(audio_st->codec); - if (dst_samples_data) { - av_free(dst_samples_data[0]); - dst_samples_data = NULL; - } - audio_st = NULL; - } - - if (fmt && !(fmt->flags & AVFMT_NOFILE)) { - avio_close(oc->pb); - fmt = NULL; - } - - if (oc) { - avformat_free_context(oc); - oc = NULL; - } - if (sws_ctx) { - sws_freeContext(sws_ctx); - sws_ctx = NULL; - } - if (swr_ctx) { - swr_free(&swr_ctx); - swr_ctx = NULL; - } - current_n_out = 0; - current_in_buff = 0; -} - -int write_video_frame(AVFrame *src_frame) { - int ret; - - if (sws_ctx) { - ret = sws_scale(sws_ctx, (const uint8_t * const *)src_frame->data, src_frame->linesize, 0, src_frame->height, out_frame->data, out_frame->linesize); - if (ret < 0) { - LOGD("scale error: %s\n", av_err2str(ret)); - onError(); - return -1; - } - } else { - for (int i = 0; i < 4; i++){ - out_frame->data[i] = src_frame->data[i]; - out_frame->linesize[i] = src_frame->linesize[i]; - } - } - - AVPacket pkt = { 0 }; - int got_packet; - av_init_packet(&pkt); - - ret = avcodec_encode_video2(video_st->codec, &pkt, out_frame, &got_packet); - if (ret < 0) { - LOGD("Error encoding video frame: %s\n", av_err2str(ret)); - onError(); - return -1; - } - - if (!ret && got_packet && pkt.size) { - pkt.stream_index = video_st->index; - ret = av_interleaved_write_frame(oc, &pkt); - } else { - ret = 0; - } - - if (ret != 0) { - LOGD("Error while writing video frame: %s\n", av_err2str(ret)); - onError(); - return -1; - } - int64_t val = av_rescale_q(1, video_st->codec->time_base, video_st->time_base); - out_frame->pts += val; - return 0; -} - -int check_write_packet(int flush) { - int got_packet, ret; - int writed = 0; - int dst_samples_size = av_samples_get_buffer_size(NULL, audio_st->codec->channels, audio_st->codec->frame_size, audio_st->codec->sample_fmt, 1); - while (current_n_out > audio_st->codec->frame_size || (flush && current_n_out)) { - AVFrame *frame = avcodec_alloc_frame(); - AVPacket pkt2 = { 0 }; - av_init_packet(&pkt2); - - frame->nb_samples = min(audio_st->codec->frame_size, current_n_out); - int nb_samples_size = min(dst_samples_size, current_in_buff); - ret = avcodec_fill_audio_frame(frame, audio_st->codec->channels, audio_st->codec->sample_fmt, buff + writed, nb_samples_size, 1); - - if (ret < 0) { - LOGD("Error fill frame: %s\n", av_err2str(ret)); - onError(); - return -1; - } - - ret = avcodec_encode_audio2(audio_st->codec, &pkt2, frame, &got_packet); - if (ret < 0) { - LOGD("Error encoding audio frame: %s\n", av_err2str(ret)); - onError(); - return -1; - } - - if (got_packet) { - pkt2.stream_index = audio_st->index; - ret = av_interleaved_write_frame(oc, &pkt2); - if (ret != 0) { - LOGD("Error while writing audio frame: %s\n", av_err2str(ret)); - onError(); - return -1; - } - } - writed += dst_samples_size; - current_n_out -= frame->nb_samples; - current_in_buff -= nb_samples_size; - avcodec_free_frame(&frame); - } - if (current_in_buff != 0 && writed != 0) { - memcpy(buff, buff + writed, current_in_buff); - } - return 0; -} - -int write_audio_frame(AVFrame *src_frame, AVCodecContext *src_codec) { - const int n_in = src_frame->nb_samples; - double ratio = (double)audio_st->codec->sample_rate / src_frame->sample_rate; - int n_out = n_in * ratio + 32; - int64_t delay = swr_get_delay(swr_ctx, audio_st->codec->sample_rate); - if (delay > 0) { - n_out += delay; - } - - if (!dst_samples_data) { - int ret = av_samples_alloc_array_and_samples(&dst_samples_data, NULL, audio_st->codec->channels, n_out, audio_st->codec->sample_fmt, 0); - if (ret < 0) { - LOGD("Could not allocate destination samples\n"); - onError(); - return -1; - } - } - - n_out = swr_convert(swr_ctx, dst_samples_data, n_out, (const uint8_t **)src_frame->extended_data, src_frame->nb_samples); - if (n_out <= 0) { - LOGD("Error while converting\n"); - onError(); - return -1; - } - int total_size = av_samples_get_buffer_size(NULL, audio_st->codec->channels, n_out, audio_st->codec->sample_fmt, 1); - memcpy(buff + current_in_buff, dst_samples_data[0], total_size); - current_n_out += n_out; - current_in_buff += total_size; - return check_write_packet(0); -} - -void post_video_conversion() { - check_write_packet(1); - av_write_trailer(oc); -} diff --git a/TMessagesProj/libs/armeabi-v7a/libtmessages.so b/TMessagesProj/libs/armeabi-v7a/libtmessages.so index d3c5a594edc6b3a611973e769edb619ce4311714..e9cc442ae58391928516274deba2954e7cc46c7d 100755 GIT binary patch delta 95600 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%0D^VN=^P2+z;)DyClmD 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 eZ<-x;%yJcQGhoCuXOw9F<;aG diff --git a/TMessagesProj/libs/armeabi/libtmessages.so b/TMessagesProj/libs/armeabi/libtmessages.so index 8dd405a619c439237c858f61a65fca189b8d143e..4528300224fe82b31e555eb471e9246d70698b0a 100755 GIT binary patch delta 114061 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%0ARE6ko(PEzo}xA37>(d_9`(eMC0O3?!d0| zn9E*{e#m_fa;9+v z9V@|GPPn_Co)pLDQj@*JeR0U&JF~8}38wQMH^TCl0RoGF<#BN9K(3>|v#zo(v$j@E zGA>-PXyqbJ1A?0m7b5`cq;;dgwX$P#6@wvvV zCKkcwj>{GM2>(Y z1I&l74#FqXeLhn!woGY?#m~{Jt>bMU*iLs~^BUVD;6JdP>d3J>JMOSQ6ZcKiPaU(3 z^g;0^cf(mpTzP{U;bi+Gw$D3sNxI8}LfZLQ+sO`kszsI7>aDaIJiM8Sa@Aa}rR?RG zaFfcP=1w#E9h_*?(3^4L2ia0&goSCbVhOYV2p*@aq*3oKUVbfF=8${iP}rUJkKyr6 z+EObuL58(0KYymqN=w5b_m_jT4D2~dMh`=i3~-aa@C_L9H{zHVXPCW0^)un4<=HSF zgJz^VI)vj)UQQNg7)snX3}UZ2Jg4w?mbiCegJ83<#Jz7&`94_;lU&~KXLdV;!ayT? zeu7b$$!7UEd(GE42l2~oUh5FnlvuzU`5}<5WBMHZoJ&pVi9+;rtl;!vo7{Wxy}G~i z&cx|PeOL}g-KW8yX~J<6R-xiW97D_Sg6k<979-3Ynsc&=9SqI!nSG+^_8ejMS5nir zIR|sbX}&hhd7`mHpQD}gS<`s?fy}L$U*VGnA^eWGee&lyPvuP3=;J4ACkJOt7v^YA z?Ps4G*0Qm-4LNN8cYb$_*>`VJPJ{od<2NP?GkxZiHyz1jb6#tjXV*?&WY4yz#c#si z_vPu#oZ*bnMg$AdtDG!ihVd$6nN?b3zt=9zTpQ13v6h04-Tu){b2Q=cOSBo*Fu&{L z$H%iUVWF<>`MCZjVPkegvN5Wb@OTUdLw}VyAFJ#8u71agpYUpVn5U&MXh8r z!ZZHTF<-?GI~Hs)=N?8=S?QdUsD0~Nd}iB|V6nb$EodnCh~Z<~poKb{u3RwgvOe{< zr#>2I7i|pR#I3Q$Crq<%UZ(qQ96n#LB>33R*@p~8*7xJYQx*2Znb_dmxF-HH?1S=0 zWc5PRQ`o7iIAOUpNSfb8oHoUkZ-S zx0*1v`(teX6*~!s+m2*z+4@gbYu#+^HDGpTK~c9DBBJx-&VLtE`Lsg5nMFxDyB$772fO2E9H9LGrBIGat#s z=h97YwBC<3?|zHkxWK+YPUGB-d0?vjEgWb$%U)x(+y8D5_9=0~so#YP%0>HoR)6Eo z37eN`PHna>34PCcvz5)i=2S}jQo~;M6kD61**hee;;c_&1)pcd!21%LKkd}TkTsYM zd|nuvQxG@Sd9|IH4r2^RWER8E_Kns6gDz*cH4!7?sqFREL)mHBA=$!0?V|VNer#H9 z^*QtblBX$7ihC+yh4q5r@dUiz(d7S|^W7`0cUVVZ7FlX7wI*97VPQ!2o!Q0NEf{<% z;@nLetqImAIvklo>|(o6*oyCF?@rje^WaX0^}(&0ef#j)gZbntYqWN)H6mE^q7ObH z-`){t9gnX(gyP%d_p*)d**`skGApre?07h{7lT+3Mgkvo5ThaND;)f3$hi}P{!rNS z)?&%JxMQmEt`47&M5|VNkVORlVz3!~ofs{$3j2jW9O<|nr+F^57O98Q zjJ7A)v58{1@4nrJ7vm)M?ZVIv)|CmU&2KkYKM&n+U5U3#*_`Jwj@=)R!`@lAF)d*) zOU4***y^+QUCiUt=)M#u5(=>!-Gvw43}KO%nqrMN;Z|&|^?{BjaoZJhRL0W@+TzE8 zW;)R+&p;y#+s5kcWBmd~x24wGg@x^g^z3@c-fnm~+XqGebCWL`6MulgUG&7P2R-A) zkN5+OXrS(>4{2c$b)&jAFhCY`6ich=Y<8e?yd6I&*zbVNeHd~W9u~dASUBAj1fe&@ z97V^S!DjnIuSp&1H@c;7aCV7+ryDWHXtI6HcKYtqHetr44mvq&{D$o1d}Z@Ec72*K zHNiRCu4D@HEvGUwv0yV5SViMl`%=UHIPF(Lv~Ho!Sc~cF92Rc#TPBAJONw!FMTRrp zy4Chd+|us`r<=Dv<%=6yoDDIvNibzvH@ZtCe3v!_^U>TSp?ICp9$Lmu8}K~S_2YSb zisagHPKzgOf-C#ntgQmxNSKcM;aAQIu5(?u33u?d(n}HTzFi$yYM3^LoT5! zh3ew$xT<;`7H6f)U+g%|(ye!-6)$_?WU+N0s)pW}a^V4~pOK!zvDs^!U)ztwrF=Wy zelSy*lYHt>9Q$tlR2II$_U{p&M!bjObkZqd(P>0H9TD#tIE~#KF17H8Ph5_;eEHyX zlUj76QFK>%i;kh>rXsIKl-zpZLg<^Aj`7Icwc@-PCD(k`*Z2dD3jc~Z(*&3E>~xf$ z`5d0gx-=-i6@A(d17tI&qy@ltWG}2%g402N^(kvmRwjVlpu7}tB zk2?yj;sIZy(fB<2joHbqy#s4zwJNSnx=R=e{WBXfFqh}tt9Cl_{e!s4CudVtNT>_5 zG094G@hWa{heG|+XL}2tvp0qPEsI#}=|EhC>>*4dVbvf>H-moo9FH=h; z=xFd%y))dNmW9nYF#U>nXw1TH&!AJMuk{2SLst!Fv;A-y`x|J6r_*kcwiGY-F&d22 zKhcZP>4NrTFR!zzeHt51jklL%vPl0^t20^nSmai>&|-KsuD6Nwso_n)Lt!?1g7Y7C zHhio9Kcabqiz=X;IS$0i)S-5LjL+rmG#?dsrj0L2qmynJK0pUsLw z`PlYAN8eR{W@#N)4Dh6E4EMDyQ&XHlWByx=9d-{5h2fX=vsiY&dy^O_;K3A}v-?g9*fC0uaI_KPm*mq*qD?H(D22+8Ht}|BFS9gVT!KA&ccqJq=1%ksooA-f z)2UG}onf}pHX*yT?MBFM^=0RorL?WTpZmwaKSpUw$J-Rkm0w{XBph1UlTOuY9icUa zYeg#QcZ=uoEm8HV4dRo6Ca19an+$QBpxN`Ra&Dt|o93ZsmAFmf!sDsYIUl=Pj@Iiu{{DaLCCyOj@jiWBkD--(^bZ)f+=`2fVB z%ZGiC;NbRal(`R!`-Ef4M-L zL%56x=p&)UK+?~h3H=~hHeW^h(vYN^%~M_s?1n<{9B!y|E)UR?!VSf&z9ea3unMTD zFvw+Vxtx#^Rsy7iHK;#fL>j5q&qy%LENnQt}1Xv#AcCsGga&68f zNli)DPNW2ij$9sLCy-J|NQPR0WN62uWXK`s0x3a-K#~)Zev#LISniRzy}(^4sXVQ0 z0@g!M1|D7#Bv%2YItVO}bB}HyMc4%-d1D@z2R(U7Y5*Vf3Xix3NO}$+HM-PSxqfXK zmsbHP#~xr6!j)HWc`48VKKclkJC8`*qX7bkqg-|Y$#5sI6pF>~a=s8)LJ6qhybf3l zKJtCeM*xe!%f~pM11tp3{>=HF4=+gt;E&gFz7a?z>6BDQxorFBl9U65phm8s1Cl}@ zkaE}ww8KBPh5JVXGr%|hlk-lX4SZfZ=W~JU!0UeGjjk3*8FT_EgAFQwM3%a|f_7jG z0|M`!Gtkw7{$Jx2IDphY6JohSEU*OuqT@Ip32X*m7ti?`An6w-xTQwO zoylC@0Bitnxta4ZKpGbkQ#fw{Qk7=k0$xI0*x@(~K^Y0amjH{%;A*#246Izse8OhfIbxD?3CpL+B|yq(5l}KviZk7k5g44s zJpzFw@7&J$R$wsro_jd&0#Z&q_W@A_K|8oy2kiL{-S$Dw7XrJ%=RU;w9YD&U)5|wJ zB)O$lDA;ALU<0;*Pko&8$-rjtERV|xDdj!8y>;s4Ex-ooWj}$o0Bm@YM-=sYu5Sj` zL2kdd=jI96O$NOZo5*D&XOCz&!9N zdpMs6lqvkPoX-VPBkc0>?Le|4WjyDWGN5SM%M}ekil`8n26^H^F1G-Q&v}XS*+4Ro zSW5a1xeJ&8e{%)*Hvui+Yu@C%0~iZl{v(%{ysgS5Rs;uihuC+x!Qemf1Y`pv5TK}@ z8z=ypzhXa|y^luJBdB9OYH9Y}4Y$jeuH`DP$BPA9Mw;f%eU4+fTi z59;T<4oFp&1C$EkaomG}0%#t@00L|UQh<7Gk7{V0Z;u+WLq&&N3nYD6-=pf61@@@= zY&6$z9MdC}!QV2jM=A%#1oudlz)GM4*k$OEst9NFNNS4P;h+?mX7T_nvwGB`j-Acr zHX!9J4M-8Y=99c!E{f_=GvJKo^5htAg0AHWN?pSBa)FewW(${RFXaiX+a~o$nj?ZN zXLFB;dwE1gAO)xaQc1A;d4Ql?ZZH-|@|HaakJWD8b4V~6v96GZXTW^;2R+{-6#(n^ za(OL~hWZ{a?~>r4x=h%|4d(z!p~TDAdHEJE?@_TrjwmAiBeD%h;hjJ#p$4zq@&frg zWE+tD>s7u&HvWOzUk9WFOI2`?A*OIa0+0rZQXnOy$}4Xu<`L8Z8&0BRUhk0_fvxXw zc{7kAD*Y3;6J5pSkwB`dav(+6qVk93)T63glG(ecLl{a0QiL8L_1n^FZlD;L3;&$j z9!Un))^T|ikaFnp^4-8J`0w~jkCY88{-j6R0nBdbk#c~|pL07wO+35~m~#^Sf8E#I zBlrZ5AgZ}X%0qzmZ&8Q9yi+_tE|BD$9^h%XLtxvC7*B(u;T4Dz9 z6agWXh#5$B2#HTtv0UEaF37orsDfnQUbX1bfW({qdetJ0 z22zm{l03mHCnUaB#Upa8Kk*o7R4kV(foTXwNb)+MlnMbkXkO0N0kdT}I)D@o%MKMC zasx01dW5lFBm?zcIU%+FT3|H%8$}*Lww~K5P|+b5t5`1A1F5aCKnW4TVGAV1ayc7F zt(cAKm3o@de}j4@5709f{kmM0SGGqf%&P!B8PJx~9ul4d>Dq@xdl78;^ zUg|#P7)UuR1X6;Xz)I+sg@Ruq%AJ$ZM!y-+@M=w-MT9Tb`Pyk&t0*uO&O9}Bnq4a8C zg&-Rjqp`t1;u8`gtlk_>QX{T2qWxHA@avqQxTQ2eFj^+3C zN;L@Ba33N-l?2@nL=K{Npp8Ioc>p{x=0QpT?hgo|*9a_wT(=W#2Ur4Bb54j7i+mUf zQ2XH{+(QNuUraofRy`_euhWJDB+ZcQbT089k$ zQ27eEQ^j)GB$I!I9JvbuG8nO|SBivU(X+i$6tMJp3?#t1KVaYiMjhmOW+2H^UgYwk zSGc?YNC_$gk{v>_LrC`Xz5X@82*~S!W}s7og95YzDS!(|C6M?kH)sb^fGm~AGn_KC z5%7sX%0an`hh>+F<#O6+ifttJnLoS@=ixkyEf*(x5918cZ{vWn%hOo)M|{XH(vdY|X4 z9%z9*Colon0!##U0+WH=K!-!Z0z!2hmJJ_p11Uhtf!)hj0;#AHYsnugBNfZ#Ruvs` z)-e<@40Zu&B^B`@w_{SVLe2tGNi+hxP9TGI&IT^8{G97G0x3i7UcO7k3fa(z?nj1G;h-WX zBtGH`;t$IyDpttFD&iR~kPOuTNl*7B#&$$#1{MHgfRr-_Ax6?pFJJU`jIi*}abidY zmVbpInZg}M0`lO9hJy?h0ja1{PoOP;PxuCg(C>?Y6d?N_T%Op>^@C3Gh>rscDg3v+ zQV}rmyI!dnSO+Wt)&onuSO#>0FIN%$zY-2(3nBu>5F!UDK#~)Zyc1XjtUra35UBen zh?gy;n&K+-QI9#{?}eM1{BDf17cS0NVxsRR>Gb9t5o2MLOSWT=!7Mb{0a9M`w= z9Os|mIZpnO>lFYgTpjU8LS=IYH&_WIJCU87F9K4;Jt~&V=CeGU9Z2!uc^{Tkh=|bQ zMH(Oyy>ddT0>gQ3*skJXIk1ZiV16gWq*MZ=ZXA7q^bX58DmvsMFJG@>x!mIAqke*Z zwk*jq9IeN(KIZ~C`64{f23)}7khi)xpLhu?B=A{4%6TEM5qvq28l&0WD>Z;`2U3n> zdnkdSavmWXw*yGwJSu-gPUt1Mgh#LBKwUce(0E{=v7al(c+jZ8=MHeW2UrZA4N|}g zISNSnRm4|}mAiqI@cbcE734iYiqOdVRQ((v@l{^lMZ5$-kU$DYUN`-+` zpFSy#3<0T5W3+ud0w5VO`1VN&@Nf6)lM;dX{#>t2#R}O4jDtl#=|uON#3IJc-jt>bP%jF!2oj90@M;eoeXJZLl~h>ZU**z4TIr* zk_VU<(I+wJIj`dSwPxrcLCv!$qH;NTHrICoDZ$B+yaa4Oil-7t^7crH3ygF7q~kE$ zIS)K?6f>VI^Z*+mw=C?F8i6~a`y?kY;%e?M1F0$sy}S!Z5kxKKc4Q#=JBbIHuIZCX z5WWmp3JjEDxMCh56k354AmZ9SsQ?Pm*Kz-->-*FP4J@`#k|ECr<^hYA^hx=^n58^i zK9JGu8twHMqM%>B+ zqykCa0;Cd2yA6#HeB|%AydFsR3q6FWb6pxC`n`(fat4sXm3ie+YvGSJRRm8rK zUN<2U?7ElxoA2ZD#QXcC79`lbgY)JG`=n;@o}HX;e3;uwcmzD+Z3n7F=F07pYN6QZ z?G3hFeNqkhS|G^_ALjwOfHWR-5<=cXh`Kc90V_tyH9#uzRv;xb<%vGY2aV2_kH$=P z3b=pm9`0{=PE7#Tc5viC!Cb@@b^v#P&jC_S)Bb=6V5k5{lT#(}sOx4gAESUrBTE4$ zB3zx9*A;WULSQW9Q3ps*FPEq&$j1*L$7EQ0kQ*=(qA}G1sfctXoHwb6fdoi7l)Z9x z2>xhPE+EOHUL^erxd2Gvn}NA83tAY6U(?^Cy=Tn`!%kwd%aI8CcD5ApbRVpw!Z;=l&n-(&OM?I z^MHvJJV5)~T<&~_E7tvq8#Gn%1ndCj!%+6Ss9T`9nkS$NNF~t&lp%N4U_b&!y~pje z04af4@1x2gm&!iqlXBrmsD%frq6|nm>;h&(Ui&fH0|cp5mpg%}2`2+^wZfn#v|^9U<}q_6Aglg!ZT z0#ZV3z36@s5Cryfj|L#+xYN_8%8Q4%JeBpsK!scnBz=d5c-$KTP2g?5T;3x>ek4*Z z*K>I#&~d~p#|HLGM(A09j>BfT0cZf<2vj{9M)j*X2_DTo3V>8c-N0ZdW{l}qQ(O$B z9M=PNkjp{PD_T*F!W0mzVFB>A^lQ2yNB(%rWj+uYY5>+jUbm3T4U77vTJSYMk|$i@l;f0#xI8C^N1XF8_pb#~ zRhl2+awm`?Ht**4<=^wRm6*@lR^l^gj1m-B0Sr*L15%^Q-NRdH(6hXiHoVX;c_4T0 zN9#tbFD>ntv_Qwpycg8I(k}&qFMeGuQaSJqE-x?Va?9a+yGaKTfHp641zvKZ>1&`bTIUn)nu>%NlurAjywPQU}0c&cBj0@}Xs zmui6d|Kx@eTlv6}3Z%xG4F+?_;<`F~#Nk0up87pr`f-w#>p6Qp0 z5I##f+bP9_4lDjVQoaVZ?yi&yqS^G2R%|ID?-M{urdB6;J zzmyMj_Vr5zz%)<4R0y;W@raq=QR9`0H6FD{JAsrU7Qj7BfgUyD`XG;*Ak#z-^;g*i zR1*~HQFFFqGRe#31|UUXnFgK)B0>~(w8^6;C>BTwikMFResUp@5-M53xrYZxb?b-# zqBoSx@JP8($eGCvb`rv1?o~h}WLi{kd!0xqw=p6qDl z$XFgO3#iWj#c(7bfbMr5DG_M7(<3DVTkiHqDZu(29w`+V@ensy3nY2&qg>t~^9Uk$ z@rZ+Vdn6nD%kw;Vw*Y!idL%or@b?}m3)ooTk+Ok_&w8XC)c*^g_u$bO8r@!=N#@ zHp*u}m9NtdNUDd;e?aX8<+=g2?n(o=BGZFMQ6~frsEtK8W?vWS60~oI55oE>kh>zbeptj!Nr2}deM6MoCTf6gj18T2vt>rn3x&wxhk$NEY zCdZvTfrh)deyfd_XnQ)h(;{u;9+7q)K)0PM*a&Iu2c&LOyOS4j;=?@Ug^zIm8X)z8 z*jye_Cy=Tv=+ObS7o-gisEyGq4yuhYW7Hr@+(&K&QX`cTgSiKrFsQcDw2(oyl_pFc zR9k5ykaA=)a=Gm)E-#ops1|jDWl$~Z`uIV$sIw9V)v5_vHmFuvY0{vY0S}M{qSlpz zYRMI*4yq+2#jYDv8yDL)s5Y*u`v=uVbi86vZCnvugK8t~yf~;f((Ip+0~m_=*PuF7 zC;l?14%NxsgX#(=!ab<2aCC!%>I%mefYBBDHa)r?uw(*8MPSAxtR-mvFAc@g8G?0F z(C2}XQ;|ww@-*Bg0gs!okOW4|z|xugXJa@9mPKN?1=cOVoiMO=Ar>h>S2PA6+@uCw z&E+;A$sItNzK<`)Px!!=Yao-*`c2oufsv^ZNQP1^oIehv2nv>Rc}xN~l$*#6CEv^q zWv{{D1%rgN4%h*t`93)nc5u6%2&5mOEX31YG>{TRsHUjlR&J>EHVSY=j{Y5wfUV^L zd(wCS50G-8gPa;&4p3d|5n{}5_3Af!{kwov62{x9sIgWAQbH<$6ut|nwpQaEC`Kq0 z0oAb`SPR~=j>}7cB#&Cp4VZysAkE9C0O_Ig4nm9@@|{EKxKMf*atS-785m`O*_m8k z0;GgjW}^P{;86(y8SL>YTyD$e;e+qx`bG&33ea#rPk>)$ck6?sb#NP5vPKsE-yEdhxy^zv22zonBc`&GFlr@&DO z1EnQgk?=^+J96wH&Zht=Ayr=93CxFnC$M71J96oZJSUb?u3rfJBO*4I@dVTWGoVjs z_aaq|_BH6g6^O=icu0E79}f!OtX}98`)2xKJG$GJt*)N!7AM{`Y1OjSHStSRmMxqY z#g?v0x@lQj>Y4@EVt7e{{+?)TQ|80`*%&sBEnyNHVnf1^&yfGn7{;nAbM%gzLbQlU z1ELu5VUbFztUCQu{Wbp8Da-UJ8VR2xu?(G_WrH%t=vfvh7gPeO2L%V|Srw=j)ClSV zb%V5H^~}UX7CbLQh=4m|oSv0|YCvh@^{f=s2{N%DwrS=O?AEEr7T0=a0ojNq=~?+C z{buHZBPRrrf?~tGM5$Te=f~dsNXtH})3TlZ ze(dK-e(Z}=TJ~PImaX^oV<&O;`n@-b?2CO`b^^5EpMLD41Yfob{sV!2?1JdW2L7g1 z8^WwBwxr(}JA{BQgI)mr-x>?JV(d4zZuwrzwjqJ9{U2@3_-)E=J+Eaa-`BFW$NkuA zf7PCN3;U+zE zf|@}spiYnrWSNOBjN+{aIYBL;PEa?9W$0NTC>Ue}MS!9}v7iJ{GAI?a4wM1P0%e2b z484To%k-=mR0gU9Re@?j^`J&jGpH5R1?mQQK-!IZ76dYYOrS_mEGQ9_0!jnfKpCJc z&<>CcDgYIMN3@Qgzf$BhwpyQwxP&=p#)D7~0B%K|(1erilpjc2MC>3M_Wr1=) zd7uJN5vUYY3916sg6ctypyQxcP#35h#L%8}pdgSD6ak6^#egiJ#7xwG3LI%58^{jY z0g^%aph8eKddBdjTZJCtZTvFiG(9p*P=#>QNK2QD#;Wz|lzMf7Ag_dbxL?$HTd5)hh>y zz*dFoRfAF)=XH0(t}Fb)!`+mBobCl?_$r3c5HC~a4PXIZ12;a9RZibM^155HsFivz3yeipRAfAV9~-}Pe;9Q9)pKyQ{{0>p%O40tX4 z$AZ#9hyI9l%y(Fd06+8Bu~`l+y9Ko8LqGP^2YzfW=p=0N3-Lbz1N%W=9P?xMf&xJ6 z!QTt|_iF)+EUoopXJF(IaN}E;v5#PJ^o<|eQ{%_>SNpM1@Z0kqB7^%ZB5H%3>1PAj zo?(`Q~6G$^fky%M2TwL6A-~3dKKXwZA2^L5LSTvml&BYpKEa)SYz$ZXoERxRb zLZoN>*iq7J_hSn{OX0T>iNAoHFGY!*IFG75hoVPvn}M7Z%uEU@24ore3eOc;FI=F5JC{;~mIcJ`DXy9KhPuygha-e!ar ztk|#=Z9-`+K&HmNgSJqP0vgFq1P=HKxq|0X&=aVJ zrC;;Ofx5S2YM|QP^U>#NK#XW$EEqV}OI2?$HV*D=6H`Z6s=&UXp?mren5PCJ!60)e+@Ry2tjUYNCz@aMOYI?FVMPa7|}p=aOY0P!U>oPi~$9Ks)z?QBCZkx zmUo44bb=Z{LGVaGU<;`JB`i|H^lbeW(HF}H;@$o3qdl-0s}FiD3BRMSMh+zIvYin z@&}P6f-InazbgNRh0Oner2mQX{{vm=f0Ww){RE(M{#T>bga6de6r>j}4lf7MVZHM- zl{ap$Fw^tvKk48$O{cC2pf*w`=ilu7A9R#g+w@~^8yQ&sx4^?I+W(|8G&G&h5J*JR z`&TkkcfBJ1pbygk=l!4$owpu-ZBO~Ky6dkjE-379CP#*?zg~He!U7K|{|B9y&tK6gjxY^?{m}ZOYUi^%GTQX3L0Jum|_$zCUV2i6a1I zOgeh@ip9bh^A`VP9-pDWID{MXyU?Ou`C+CVt!-lN-KImomIJ3@^)SW zPmHMaG_UN$2wOY0D}$)?(LY}?U$|Yb{OlAbjLF0*W%w!{7M>U(tn>;;9~&X8+ODjk z<|cGr30?1vdDMt!IE`Gk@ChtehOg%Tkh9-1@j0>pw;iRef-|LLh{oOqi<$nMB-kUMWKA7$)PU6 zsk|AB1y4P}0;JMU08%B<<4_q-PbW#K=~yL$vOsicXXEif9l!Z#n8jrz55DG#+X$WE zs}WfkzK)M@J4b|V86j^U;qJ0wWj%a#kMPirh|Dum?oA|x2^!%xjBuxpNL&Qux9WJS zj2@vAd)Yk;WdcU<<~Vpn;N;6nc*rqZU;WYr{R@I7$f7L1sGlm*JrB`ctCTy5r&}JP zD1-7O_yD?xBFa|Yyr`cRK(|;#`N|1mhgWm0$^clg@JoEx3@U3;X1ZW3`iRJgs-`Qe zh^O^5kt0fZ5PSfwv59cbn@ex<#XU#yfbtiYKHLwj)Ts+p&b#zshgggI%Vw4R{{Ujikpln# delta 101908 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 diff --git a/TMessagesProj/libs/x86/libtmessages.so b/TMessagesProj/libs/x86/libtmessages.so index c5f0c5f6b18d224803d0cce873eae44414692442..2446256a0e540ae43d608962c28b1e7c535407e8 100755 GIT binary patch delta 161091 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